《嵌入式人工智能技术应用》课件 5.2-稻麦成熟度监测系统模型评估与应用部署_第1页
《嵌入式人工智能技术应用》课件 5.2-稻麦成熟度监测系统模型评估与应用部署_第2页
《嵌入式人工智能技术应用》课件 5.2-稻麦成熟度监测系统模型评估与应用部署_第3页
《嵌入式人工智能技术应用》课件 5.2-稻麦成熟度监测系统模型评估与应用部署_第4页
《嵌入式人工智能技术应用》课件 5.2-稻麦成熟度监测系统模型评估与应用部署_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

项目五基于计算机视觉技术实现稻麦监测系统嵌入式人工智能技术应用稻麦成熟度监测系统模型评估与应用部署任务二职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务二稻麦成熟度监测系统模型评估与应用部署了解模型格式转换原理;了解模型部署方式。能够完成h5格式的模型评估;能够将h5格式的模型转为pb格式;能够使用pb格式的模型进行推理;能使用JupyterLab复制微调好的模型到指定路径及修改配置文件;能够在边缘网关完成应用的运行与调试。职业能力目标01知识目标技能目标职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务二稻麦成熟度监测系统模型评估与应用部署本实验将实现稻麦监测模型评估,并将转换后模型部署到边缘网关,并在边缘端上实时对稻麦的生长情况进行检测。任务描述任务要求基于预训练模型进行模型微调训练;实现稻麦监测系统的模型部署。任务描述与要求02职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务二稻麦成熟度监测系统模型评估与应用部署任务分析为什么要进行模型格式转换?可以在哪些端部署模型?任务分析与计划03任务计划表项目名称基于计算机视觉技术实现稻麦监测系统任务名称稻麦成熟度监测系统模型评估与应用部署计划方式自主设计计划要求请用5个计划步骤来完整描述出如何完成本次任务序号任务计划1

2

3

4

5

通过上面的思考,你是否对本任务要完成的工作有所了解?让我们一起来制订完成本次任务的实施计划吧!任务分析与计划03职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务二稻麦成熟度监测系统模型评估与应用部署模型部署204知识储备模型格式转换1模型格式转换04模型转换是模型部署的重要环节之一。模型转换是为了模型能在不同框架间流转。在实际应用时,模型转换几乎都用于工业部署,负责模型从训练框架到部署侧推理框架的连接。这是因为随着深度学习应用和技术的演进,训练框架和推理框架的职能已经逐渐分化。分布式、自动求导、混合精度……训练框架往往围绕着易用性,面向设计算法的研究员,以研究员能更快地生产高性能模型为目标。硬件指令集、预编译优化、量化算法……推理框架往往围绕着硬件平台的极致优化加速,面向工业落地,以模型能更快执行为目标。由于职能和侧重点不同,没有一个深度学习框架能面面俱到,完全一统训练侧和推理侧,而模型在各个框架内部的表示方式又千差万别,所以模型转换就被广泛需要了。041、转pb格式模型格式转换在TensorFlow模型训练阶段一般使用model.save()将模型保存为h5格式,但部署阶段经常需要将训练好的模型固化为pb格式。使用pb模型固化权重和模型结构能够节省模型占用空间,也可以更加方便的转化为别的格式。042、转caffe/ONNX格式模型格式转换模型转换往往将模型转换到一种中间格式,再由推理框架读取中间格式。目前主流的中间格式有caffe和ONNX(OpenNeuralNetworkExchange),两者底层都是基于protobuf(Google开发的跨平台协议数据交换格式工具库)实现的。caffe原本是一个经典的深度学习框架,不过由于出现较早且不再维护,已经少有人用它做训练和推理了。但是它的模型表达方式却保留了下来,作为中间格式在工业界被广泛使用。ONNX是各大AI公司牵头共同开发的一个中间表达格式,用于模型格式交换,目前在社区非常活跃,处于不断更新完善的阶段。由于caffe出现较早,在使用上对硬件部署侧比较友好(原生算子列表在推理侧容易实现,而且caffe使用to作为模型格式数据结构的定义,能实现中心化、多对一),目前很多推理侧硬件厂商依然使用caffe,很多端到端的业务解决方案,也喜欢使用caffe。而ONNX有丰富的表达能力、扩展性和活跃的社区,深受训练侧开发者、第三方工具开发者的喜爱,PyTorch早已将ONNX作为官方导出格式进行支持,而TensorFlow也非官方地支持ONNX。043、端到端的模型转换模型格式转换还有一些模型转换是直接从框架到框架对接一步到位的,相比使用中间格式的方案非常定制化。例如由英伟达官方出品的CUDA平台的部署框架TensorRT,支持用户编写转换代码,直接从PyTorch转换到TensorRT。这种端到端的模型转换,是一种抛弃了中间格式的中心化转换方法,省去了很多麻烦,往往在整个平台完全自研自主使用,或者业务构成本身比较单一(解决方案的训练框架和部署框架完全确定)等实际情况下落地使用。模型部署204知识储备模型格式转换104模型部署当我们把深度学习模型训练好之后,想要基于深度学习模型来开发实际应用的时候,主要有三种不同的应用场景移动端、桌面端和服务器端。移动端:我们将模型封装成SDK给Android和IOS调用,由于移动端算力有限通常还需要考虑基于移动端CPU或GPU框架的优化问题来提速。如果模型要求的算力比较大,就只能考虑以API的形式来调用了,这时候模型是部署在服务器上的。桌面端:桌面应用主要包括Windows和MacOS以及Linux,这时候我们还是需要将模型封装成SDK然后提供接口来进行调用。Windows将模型封装成dll或lib库,Linux封装成so或a库,MacOS封装为.a或.tbd库。服务器端:服务器端模型的部署如果对并发量要求不高,通常可能都是采用flask或tornado来封装一个API接口来给调用。但是这种方式有一个致命的缺点就是,能支持的并发量很低,可扩展性也不高,如果被工具服务器很容易奔溃。对于并发量要求高的应用建议使用基于modelserver的服务框架。04模型部署近年来深度学习模型在计算机视觉、自然语言处理、搜索推荐广告等各种领域,不断刷新传统模型性能,并得到了广泛应用。随着移动端设备计算能力的不断提升,移动端AI落地也成为了可能。相比于服务端,移动端模型的优势有:1.减轻服务端计算压力,并利用云端一体化实现负载均衡。特别是在双11等大促场景,服务端需要部署很多高性能机器,才能应对用户流量洪峰。平时用户访问又没那么集中,存在巨大的流量不均衡问题。直接将模型部署到移动端,并在置信度较高情况下直接返回结果,而不需要请求服务端,可以大大节省服务端计算资源。同时在大促期间降低置信度阈值,平时又调高,可以充分实现云端一体负载均衡。2.实时性好,响应速度快。在feed流推荐和物体实时检测等场景,需要根据用户数据的变化,进行实时计算推理。如果是采用服务端方案,则响应速度得不到保障,且易造成请求过于密集的问题。利用端计算能力,则可以实现实时计算。3.稳定性高,可靠性好。在断网或者弱网情况下,请求服务端会出现失败。而采用端计算,则不会出现这种情况。在无人车和自动驾驶等可靠性要求很高的场景下,这一点尤为关键,可以保证在隧道、山区等场景下仍能稳定运行。4.安全性高,用户隐私保护好。由于直接在端上做推理,不需要将用户数据传输到服务端,免去了网络通信中用户隐私泄露风险,也规避了服务端隐私泄露问题。04模型部署移动端部署深度学习模型也有很大的挑战。主要表现在,移动端等嵌入式设备,在计算能力、存储资源、电池电量等方面均是受限的。故移动端模型必须满足模型尺寸小、计算复杂度低、电池耗电量低、下发更新部署灵活等条件。因此模型压缩和加速就成为了目前移动端AI的一个热门话题。模型压缩和加速不仅仅可以提升移动端模型性能,在服务端也可以大大加快推理响应速度,并减少服务器资源消耗,大大降低成本。结合移动端AI模型和服务端模型,实现云端一体化,是目前越来越广泛采用的方案。模型压缩和加速是两个不同的话题,有时候压缩并不一定能带来加速的效果,有时候又是相辅相成的。压缩重点在于减少网络参数量,加速则侧重在降低计算复杂度、提升并行能力等。模型压缩和加速是一个很大的命题,可以从多个角度优化。总体来看,个人认为主要分为三个层次:1.算法应用层压缩加速。这个维度主要在算法应用层,也是大多数算法工程师的工作范畴。主要包括结构优化(如矩阵分解、分组卷积、小卷积核等)、量化与定点化、模型剪枝、模型蒸馏等。2.框架层加速。这个维度主要在算法框架层,比如tf-lite、NCNN、MNN等。主要包括编译优化、缓存优化、稀疏存储和计算、NEON指令应用、算子优化等3.硬件层加速。这个维度主要在AI硬件芯片层,目前有GPU、FPGA、ASIC等多种方案,各种TPU、NPU就是ASIC这种方案,通过专门为深度学习进行芯片定制,大大加速模型运行速度。职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务二稻麦成熟度监测系统模型评估与应用部署05任务实施模型格式转换与推理2模型评估1使用线程进行稻麦成熟度检测3边缘端应用部署与调试442设置预测标签1模型加载3导入待预测图片导入待预测图片5对待预测图片进行分类模型评估05模型评估模型评估05model=load_model('./models/val_accuracy=<根据实际数值填写>.h5')1.模型加载

由于训练模型时,是保存当前最好的模型。因此在训练结束时,可能会在models文件夹中保存多个模型。根据精度值选择最优模型进行模型测试。tf.keras.models.load_model()用法:加载通过model.save()保存的模型。返回:一个Keras模型实例。如果原始模型已编译并使用优化器保存,则将编译返回的模型。否则,模型将未编译。在返回未编译模型的情况下,如果compile参数设置为True,则会显示警告。label=['成熟期','孕穗期','生长期']2.设置预测标签将标签放置与一个列表中,标签名称为成熟期、孕穗期和生长期(顺序必须固定),并命名列表为list。模型评估05image=load_img('./datasets/green_0002.jpg')3.导入待预测图片

tf.keras.preprocessing.image.load_img(path,grayscale=False,color_mode='rgb',target_size=None,interpolation='nearest')path:需要导入的图片路径;grayscale:已废弃,请使用color_mode="grayscale";color_mode:图像格式,"grayscale","rgb","rgba"三者中的一个,默认为"rgb";target_size:输出图像的大小。默认为None表示与原图相同,或者是元组类型的整型值(img_height,img_width);interpolation:插值法(当输出图像的大小与载入图像不同时使用)。支持的方式有"nearest"(最邻近)、"bilinear"(双线性)、"bicubic"(双三次)、"lanczos"(PIL>1.1.3)、"box"(PIL>3.4.0)和"hamming"(PIL>3.4.0)。模型评估05image=image.resize((224,224))img_arr=img_to_array(image)img_arr=img_arr/255img_arr=np.expand_dims(img_arr,0)4.图片格式处理

image.resize((img_height,img_width))用法:修改图片的尺寸。img_to_array()用法:将图片转化成指定尺寸,就是将图片转化成数组。转换前后类型都是一样的,唯一区别是转换前元素类型是整型,转换后元素类型是浮点型。tf.keras.preprocessing.image.img_to_array(img,data_format=None,dtype=None)img:PIL图片实例;data_format:图像数据格式,可选项为"channels_first"或"channels_last";dtype:返回值的数据类型Dtype。np.expand_dims(a,axis):即在数组a的第axis维度处增加一个维度。模型评估05print(label[model.predict_classes(img_arr)[0]])5.对待预测图片进行分类

predict_classes(x)方法进行预测返回的是类别的索引,即该样本所属的类别标签。参数说明:x:输入数据,作为Numpy数组或Numpy数组列表。输出的标签名字即为上述导入待预测图片里对图片的预测标签。05任务实施模型格式转换与推理2模型评估1使用线程进行稻麦成熟度检测3边缘端应用部署与调试42导入pb模型1h5模型转为pb模型3使用pb模型进行预测模型格式转换与推理05模型格式转换与推理模型格式转换与推理05fromtensorflow.python.framework.convert_to_constantsimportconvert_variables_to_constants_v2#将Keras模型转换为ConcreteFunction格式full_model=tf.function(lambdaInput:model(Input))full_model=full_model.get_concrete_function(tf.TensorSpec(model.inputs[0].shape,model.inputs[0].dtype))#采用了ConcreteFunction格式的模型,就可以将其变量转换为常量。frozen_func=convert_variables_to_constants_v2(full_model)frozen_func.graph.as_graph_def()#若需要检查冻结图定义内的图层,运行一下代码进行查看其输入和输出张量的名称layers=[foropinfrozen_func.graph.get_operations()]tf.io.write_graph(graph_or_graph_def=frozen_func.graph,logdir="./models/",name="model.pb",as_text=False)1.h5模型转为pb模型使用pb模型固化权重和模型结构能够节省模型占用空间。当完成训练模型的过程后,希望它能够使用OpenCV跨平台库在不同的编程语言上尽可能快地运行或者在网络或移动设备上提供服务时,我们必须以最有效的格式导出模型图,这个转换为两个阶段:冻结和优化。convert_variables_to_constants_v2:将计算图中的变量取值以常量的形式保存。冻结模型本质上意味着将变量(“权重”、“偏差”等)更改为常量。这意味着没有更多的训练和变量已达到最终值。模型格式转换与推理05cvNet=cv2.dnn.readNetFromTensorflow('./models/model.pb')2.导入pb模型cv.dnn.readNetFromTensorflow(model[,config])::读取Tensorflow框架保存的网络模型。model:pb格式的模型所在路径;config:pbtxt格式的模型定义文件所在路径。模型格式转换与推理05img=cv2.imread('./datasets/test/seeding/seeding_0165.jpg')#载入一张图片blob=cv2.dnn.blobFromImage(img,1./255,size=(224,224))#从图片生成blob对象#设置网络的输入值cvNet.setInput(blob)cvOut=cvNet.forward()predicted_id=np.argmax(cvOut)3.使用pb模型进行预测调用cv2.dnn中的方法,传入需要预测的图像,计算输出值并返回预测结果。cv.dnn_Net.setInput():为网络设置输入值。cv.dnn_Net.setInput(blob[,name[,scalefactor[,mean]]])blob:blob对象,CV_32F或CV_8U色深;name:输入层的名称;scalefactor:归一化尺度;mean:均值减法值。cv2.dnn.blobFromImage():从图像中创建一个4维的blob对象。cv.dnn.blobFromImage(image[,scalefactor[,size[,mean[,swapRB[,crop[,ddepth]]]]]])images:输入的图片(单通道、三通道、四通道);scalefactor:归一化尺度;size:输出图像的大小;mean:均值减法值;swapRB:对调第一和第三通道的值;crop:resize后是否进行裁剪;ddepth:输出blob对象的色深(CV_32F或CV_8U)。cv.dnn.Net.forward()用法:完成正向传播并计算返回输出层的结果。cv.dnn.Net.forward([,outputName])outputName:需要获取的输出的输出层名字(可选)。返回:默认返回整个网络的最终输出。05任务实施模型格式转换与推理2模型评估1使用线程进行稻麦成熟度检测3边缘端应用部署与调试442编写稻麦检测线程1编写摄像头采集线程3编写显示的线程启动线程5停止线程使用异步的方式,将采集图片、成熟度检测、显示输出线程封装在三个不同的类中,完成稻麦成熟度检测。使用线程进行稻麦成熟度检测05使用线程进行稻麦成熟度检测使用线程进行稻麦成熟度检测05classCameraThread(threading.Thread):def__init__(self,camera_id,camera_width,camera_height):threading.Thread.__init__(self)self.working=Trueself.cap=cv2.VideoCapture(camera_id)#打开摄像头

self.cap.set(cv2.CAP_PROP_FRAME_WIDTH,camera_width)#设置摄像头分辨率宽度

self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT,camera_height)#设置摄像头分辨率高度

defrun(self):globalcamera_img#定义一个全局变量,用于存储获取的图片,以便于算法可以直接调用

camera_img=Nonewhileself.working:ret,image=self.cap.read()#获取新的一帧图片

ifret:camera_img=imagedefstop(self):self.working=Falseself.cap.release()1.编写摄像头采集线程结合的opencv采集图像的内容,利用多线程的方式串起来,形成一个可传参,可调用的通用类。这里定义了一个全局变量camera_img,用作存储获取的图片数据,以便于其他线程可以调用。init初始化函数实例化该线程的时候,会自动执行初始化函数,在初始化函数里面,打开摄像头,并设置分辨率。run函数该函数是在实例化后,执行start启动函数的时候,会自动执行。在该函数里,实现了循环获取图像的内容。使用线程进行稻麦成熟度检测05classWheatMaturityDetectThread(threading.Thread):def__init__(self):threading.Thread.__init__(self)self.working=Trueself.running=Falseself.cvNet=cv2.dnn.readNetFromTensorflow('./models/model.pb')defrun(self):self.running=Trueglobalpredicted_labelpredicted_label=''whileself.working:try:self.cvNet.setInput(cv2.dnn.blobFromImage(camera_img,1./255,size=(224,224)))cvOut=self.cvNet.forward()predicted_id=np.argmax(cvOut)predicted_label=label[predicted_id]exceptExceptionase:passself.running=Falsedefstop(self):self.working=Falsewhileself.running:pass2.编写稻麦检测线程结合调用算法接口的内容和图像显示内容,利用多线程的方式整合起来,循环识别。对摄像头采集线程中获取的每一帧图片进行识别,将识别结果定义为全局变量predicted_label,以便于其他线程可以调用。init初始化函数例化该线程的时候,会自动执行初始化函数,在初始化函数里面,定义了显示内容,并实例化算法和加载模型。run函数该函数是在实例化后,执行start启动函数的时候,会自动执行。在该函数是一个循环,实现了对采集的每一帧图片进行算法识别。使用线程进行稻麦成熟度检测05classDisplayThread(threading.Thread):def__init__(self):threading.Thread.__init__(self)self.working=Trueself.running=FalsedWindow('win',flags=cv2.WINDOW_NORMAL|cv2.WINDOW_KEEPRATIO|cv2.WINDOW_GUI_EXPANDED)cv2.setWindowProperty('win',cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)#全屏展示

defrun(self):self.running=Truewhileself.working:try:

limg=ft.draw_text(camera_img,(520,20),'{}'.format(predicted_label),34,(0,0,255))cv2.imshow('win',limg)cv2.waitKey(1)exceptExceptionase:passself.running=Falsedefstop(self):self.working=Falsewhileself.running:passcv2.destroyAllWindows()#销毁所有的窗口3.编写显示的线程结合图像显示内容,利用多线程的方式循环显示。init初始化函数实例化该线程的时候,会自动执行初始化函数,在初始化函数里面,定义了显示内容。run函数该函数是在实例化后,执行start启动函数的时候,会自动执行。在该函数是一个循环,实现了对采集的每一帧图片的识别结果进行显示。使用线程进行稻麦成熟度检测05camera_th=CameraThread(0,224,224)wheat_maturity_detect_th=WheatMaturityDetectThread()display_th=DisplayThread()camera_th.start()wheat_maturity_detect_th.start()display_th.start()4.启动线程实例化三个线程,并启动这三个线程,实现完整的稻麦成熟度检测功能,运行时加载模型比较久,需要等待几秒。display_th.stop()wheat_maturity_detect_th.stop()camera_th.stop()5.停止线程为了避免占用资源,结束实验时需要停止摄像头采集线程和算法识别线程,或者重启内核。。05任务实施模型格式转换与推理2模型评估1使用线程进行稻麦成熟度检测3边缘端应用部署与调试442在app目录下新建Python脚本1创建应用文件存放目录3在task5.py文件中补充代码使用终端进行调试边缘端应用部署与调试05边缘端应用部署与调试使用线程进行稻麦成熟度检测05importosifnotos.path.exists('./app/'):os.mkdir('./app/')1.创建应用文件存放目录使用os模块创建稻麦成熟度检测应用文件存放目录。2.在app目录下新建Python脚本(1)在JupyterLab左侧文件浏览器中进入./task5-wheat_monitoring_system/app/目录,鼠标右键并选择新建文件。(2)将该文件重命名为task5.py。使用线程进行稻麦成熟度检测05!cp-rlib./app/3.在task5.py文件中补充代码(1)将4.1导入相关依赖包至4.6启动线程的代码复制进task5.py文件中并保存。(2)将./task5-wheat_monitoring_system/lib目录拷贝至./embedded_ai/task5-wheat_monitoring_system/app/目录下。(3)将./task5-wheat_monitoring_system/models/model.pb模型文件拷贝至./embedded_ai/task5-wheat_monitoring_syst

温馨提示

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

最新文档

评论

0/150

提交评论