人工智能应用导论(第三版)3-5云计算与边缘计算实验手册_第1页
人工智能应用导论(第三版)3-5云计算与边缘计算实验手册_第2页
人工智能应用导论(第三版)3-5云计算与边缘计算实验手册_第3页
人工智能应用导论(第三版)3-5云计算与边缘计算实验手册_第4页
人工智能应用导论(第三版)3-5云计算与边缘计算实验手册_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

云计算与边缘计算实验手册【项目目标】(1)掌握从云端进行数据处理与模型训练,到将模型部署至边缘设备执行的全流程AI应用开发方法。(2)体验并学习使用零代码AI云平台,了解如何使用其提供的“云端算力”来简化和加速模型开发。(3)学习使用ONNXRuntime、OpenCV等行业标准工具,在个人计算机(模拟边缘设备)上调用摄像头进行实时数据处理与AI模型推理。(4)通过实践直观对比和理解云计算与边缘计算在AI应用中的不同角色、优势及其“云边协同”的工作模式。(5)培养解决实际问题的AI工程思维,体验从一个想法到一个可交互AI应用的创造过程,激发创新精神。任务一使用云平台实现图像分类应用在理论知识的讲解中,我们了解了云计算平台如何提供强大的“算力”来支持AI开发。本任务我们将体验一个免费的AI模型训练云平台。它将复杂的算力需求隐藏在简洁的网页背后,让我们可以利用自己的数据快速训练出一个有效的AI模型,使我们能更直观地聚焦于“数据->训练->模型”这一AI应用核心流程。本任务需要使用配套资源中提供的“猫狗分类数据集”,请自行下载。读者也可通过项目二的实验代码自行准备猫、狗动物图片,每种类至少100张。需要注意的是自行爬取的图片通常需要进行二次检查、筛选及清洗,以保证数据集的质量。使用Chrome浏览器访问https://train.aimaker.space/train。点击主页上的“图像项目”,如图3-6所示。图3-6在平台主页选择“图像项目”进入数据准备界面后,需要告诉平台要学习几个类别(Class),并为每个类别提供相应的学习“教材”(图片)。找到默认的“Class1”,点击旁边的铅笔图标,将其重命名为“猫”。继续点击下方的“上传”按钮上传样本图片。图3-7修改类别(Class)名称并打开上传界面在弹出的窗口中选择“在文件夹中选择图像或直接拖放到此处”,然后找到并选中提前下载好的数据集中所有猫的图片,点击“打开”进行上传。图3-8上传数据集中的样本图片按照同样的方式将“Class2”名称修改为“狗”并完成样本图片的添加。如有需要可以继续点击下方的“添加一个类别”按钮,继续添加新的Class及对应的样本图片,如图3-9所示。图3-9根据需要继续添加样本点击页面中部“训练模型”按钮下方的高级标签,可以看到模型训练的一些基本参数,如“单次训练迭代次数”、“批处理大小”、“学习速率”等。点击参数右侧的问号图标可以显示简单的参数说明。本次实验暂时不需要修改任何参数,保持默认即可。点击“训练模型”按钮,训练过程会立即开始,此时会看到一个训练进度提示。需要注意的是,训练期间页面会提示“不要切换标签页”,否则会中断训练。根据图片数量计算机性能,训练过程通常需要数分钟。图3-10使用上传的数据集训练图片分类模型训练完成后,可以点击“高级选项”按钮查看所训练模型的若干特征。图3-11模型训练的部分参数信息右侧的“预览”窗口会在训练结束后自动激活,可以测试训练好的AI模型。在“预览”窗口下方,选择输入方式为“文件夹”。点击“在文件夹中选择图像或直接拖动到此处”,从测试集中选择一张从未用于训练的、新的猫或狗的图片。上传后,模型会立刻进行分析,并在下方的“输出”区域显示结果。可以看到“猫”和“狗”两个进度条,进度条越长,代表模型认为图片属于该类别的可能性(置信度)越高。图3-12测试模型效果测试数据集中也准备了老虎、狐狸与狼的若干图片。读者也可将这些图片上传至模型进行判断,观察模型的反应。本任务在云端(网页应用)利用算力完成了一个AI图像分类模型的开发。该过程虽然简单,但完整地覆盖了数据准备、模型训练和效果验证三大核心环节,为后续学习更复杂的AI项目打下坚实基础。读者可以尝试利用本书配套资源中提供的数据集,自行训练一个能够完成手势识别的模型供下一个任务中使用。任务二边缘设备实现手势识别在任务一中,我们已经在云平台上快速训练并验证了一个在云端运行的图像分类模型。本任务将把云端训练好的模型“请”到本地计算机(边缘设备)上,使其能够在断网的情况下于本地实时运行。为方便验证模型识别的效果,本任务将使用一个手势识别的场景,通过本地摄像头实时采集手势,送至模型识别,将结果显示于本地计算机。请读者使用教材配套的手势识别数据集,按照任务一的步骤训练一个手势识别模型。训练完成后,在右上角“预览”区域,点击“导出模型”按钮。在弹出的窗口中,选择Tensorflow标签页。在其下方,确保选择的是Keras格式。点击“下载我的模型”按钮。图3-13下载训练好的模型浏览器会自动下载一个名为converted_keras.zip的压缩包。将其解压后可以得到两个文件:keras_model.h5:模型的核心文件,包含了神经网络的结构和权重。labels.txt:文本文件,记录了模型的分类标签。在步骤一中得到的.h5是Keras专用的模型格式,运行.h5模型通常需要安装庞大的TensorFlow完整库。对于存储和内存资源有限的边缘设备通常需要一种轻量化部署能力更强的模型。为了应对此类边缘设备的需求,一种名为ONNX(OpenNeuralNetworkExchange,开放神经网络交换格式)的开放标准应运而生,其目标旨在解决不同AI训练框架之间模型难以互通的壁垒。在业界,ONNX被广泛应用于AI模型的“云边端”全流程部署场景中。例如,数据科学家团队可能使用功能强大的PyTorch或TensorFlow框架在云端服务器上完成模型的训练,而负责将模型集成到手机App(端)或本地PC应用(边缘)的工程团队,则无需安装这些庞大的训练框架。他们只需要接收数据科学家交付的标准化ONNX模型,就可以利用轻量级的推理引擎(如ONNXRuntime)在最终产品上高效运行。相较于与特定框架(如TensorFlow/Keras)深度绑定的.h5格式,ONNX格式的模型具有良好的框架解耦与互操作性、优秀的轻量化部署能力以及卓越的性能优化潜力。因此在本步骤中我们将编写代码将上一步得到的.h5模型转换为.onnx格式的模型,具体如下。在一个全英文路径下新建一个名为convert_model.py的Python文件,复制以下代码至文件中:importtensorflowastfimporttf2onnximportjson#定义输入和输出文件名keras_model_path="keras_model.h5"output_onnx_path="gesture-recognition.onnx"try:#加载Keras模型model=tf.keras.models.load_model(keras_model_path)#将Keras模型转换为ONNX格式#spec:指定模型的输入签名,对于本项目导出的图像模型,通常是(None,224,224,3)#opset:ONNX的版本号,13是较为通用的版本model_proto,_=tf2onnx.convert.from_keras(model,input_signature=[tf.TensorSpec(shape=(None,224,224,3),dtype=tf.float32,name="input")],opset=13)#保存ONNX模型withopen(output_onnx_path,"wb")asf:f.write(model_proto.SerializeToString())print(f"模型转换成功!已将'{keras_model_path}'转换为'{output_onnx_path}'")exceptExceptionase:print(f"模型转换失败:{e}")print("请确保'keras_model.h5'文件与此脚本在同一个文件夹下。")将步骤一中解压出的keras_model.h5文件与convert_model.py置于同一个文件夹下。在该路径下运行convert_model.py文件,终端会输出“模型转换成功!”的提示,并且在文件夹中会生成一个gesture-recognition.onnx文件。该文件即为转换后的ONNX模型文件,接下来将利用该模型编写出能在本地计算机上实时识别手势的Python应用程序。在convert_model.py同文件夹下新建一个名为run_edge_app.py的Python程序文件。将下列代码复制至文件中。importcv2importnumpyasnpimportonnxruntimeasortfromPILimportImage,ImageDraw,ImageFont#---1.初始化---#从labels.txt文件中读取标签withopen('labels.txt','r',encoding='utf-8')asf:#读取所有行,并去除每行末尾的数字和换行符GESTURE_LABELS=[line.strip().split('')[1]forlineinf.readlines()]#加载上一步转换的ONNX模型文件onnx_model_path="gesture-recognition.onnx"#创建一个ONNXRuntime的推理会话ort_session=ort.InferenceSession(onnx_model_path)#获取模型的输入名称input_name=ort_session.get_inputs()[0].name#加载支持中文的字体,这里的'simhei.ttf'需要根据你的系统确认路径#通常在C:\Windows\Fonts\simhei.ttftry:font=ImageFont.truetype("simhei.ttf",32)exceptIOError:font=ImageFont.load_default()print("警告:未找到中文字体'simhei.ttf',将使用默认字体,中文可能无法显示。")print("模型加载成功,准备启动摄像头...")在上述代码中定义了一个GESTURE_LABELS列表,用于存放模型能识别的所有手势名称。ort.InferenceSession()函数是ONNXRuntime的核心,通过该行代码,模型文件被加载到内存中,随时可以开始工作。每个模型都有标准的输入口,通过ort_session.get_inputs()[0].name代码可以自动获取这个输入口的名称,方便后续步骤向其中“喂”数据。接下来需要让程序打开电脑的摄像头,并像看电影一样,逐帧读取实时画面。这是一个无限循环,直到按下键盘上的q键退出。在run_edge_app.py文件中继续添加下列代码。#---2.启动摄像头与主循环---#参数0代表使用电脑的默认摄像头cap=cv2.VideoCapture(0)ifnotcap.isOpened():print("错误:无法打开摄像头。");exit()#进入主循环whileTrue:#逐帧读取摄像头画面ret,frame=cap.read()ifnotret:print("错误:无法读取画面。")break#---这里将是进行AI推理的核心区域---#(我们将在下一个步骤中填充该部分代码)#显示实时画面cv2.imshow('Real-timeGestureRecognition',frame)#检测按键,如果按下'q'键则退出循环ifcv2.waitKey(1)&0xFF==ord('q'):break#---释放资源---cap.release()cv2.destroyAllWindows()print("程序已退出。")在上述代码中cv2.VideoCapture(0)打开本地计算机的默认摄像头(台式计算机可以外接一个USB摄像头)。whileTrue:语句创建了一个无限循环,使程序能持续不断地处理视频流。在循环中,ret,frame=cap.read()语句负责从摄像头抓取当前瞬间的图像,frame就代表该张图像。cv2.imshow():函数将抓取到的frame显示在一个名为“Real-timeGestureRecognition”的窗口中。使用cv2.waitKey(1)&0xFF==ord('q')语句等待1毫秒,检测用户是否有键盘输入。如果按下的键是q,就跳出循环。退出循环后,使用cap.release()和cv2.destroyAllWindows()函数释放摄像头资源并关闭所有窗口,养成良好的编程习惯。有关OpenCV控制摄像头的更多用法,我们将在计算机视觉章节进一步讲解。摄像头捕捉到的原始画面,并不能直接送给AI模型。需要先将其转换成模型能够“理解”的格式(例如,调整尺寸、归一化颜色值等),这个过程叫做预处理。处理好后,就可以将数据送入模型,并获取预测结果。请将以下代码替换到上一步代码中标记为“#---这里将是进行AI推理的核心区域---”的注释行处。#---3.图像预处理---#复制一份原始帧用于显示,避免在原图上修改display_frame=frame.copy()#将图像尺寸调整为模型需要的224x224img_resized=cv2.resize(frame,(224,224))#将图像从BGR色彩空间转为RGBimg_rgb=cv2.cvtColor(img_resized,cv2.COLOR_BGR2RGB)#将图像数据类型转为float32,并进行归一化处理img_normalized=(img_rgb.astype('float32')/127.5)-1#增加一个批次维度,因为模型期望的输入是(N,H,W,C)input_tensor=np.expand_dims(img_normalized,axis=0)#---4.执行推理---#将处理好的数据送入ONNX模型ort_inputs={input_name:input_tensor}ort_outs=ort_session.run(None,ort_inputs)#ort_outs[0]就是模型的输出结果prediction=ort_outs[0]#---5.解析并展示结果---#找到概率最高的那个类别的索引predicted_index=np.argmax(prediction)#从我们的标签列表中获取对应的手势名称predicted_gesture=GESTURE_LABELS[predicted_index]#获取该预测的置信度(概率值)confidence=np.max(prediction)#准备要显示的文本result_text=f"预测结果:{predicted_gesture}({confidence:.2f})"#使用Pillow在图像上绘制中文#将OpenCV图像(BGR)转换为Pillow图像(RGB)pil_img=Image.fromarray(cv2.cvtColor(display_frame,cv2.COLOR_BGR2RGB))draw=ImageDraw.Draw(pil_img)#在图像上绘制文本draw.text((10,30),result_text,font=font,fill=(0,255,0))#将Pillow图像转换回OpenCV图像(BGR)display_frame=cv2.cvtColor(np.array(pil_img),cv2.COLOR_RGB2BGR)在图像预处理的代码中,resize,cvtColor,astype,expand_dims等一系列操作都是为了将摄像头抓拍的原

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论