《嵌入式人工智能技术应用》课件 项目五 基于计算机视觉技术实现稻麦监测系统_第1页
《嵌入式人工智能技术应用》课件 项目五 基于计算机视觉技术实现稻麦监测系统_第2页
《嵌入式人工智能技术应用》课件 项目五 基于计算机视觉技术实现稻麦监测系统_第3页
《嵌入式人工智能技术应用》课件 项目五 基于计算机视觉技术实现稻麦监测系统_第4页
《嵌入式人工智能技术应用》课件 项目五 基于计算机视觉技术实现稻麦监测系统_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

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

文档简介

项目五基于计算机视觉技术实现稻麦监测系统嵌入式人工智能技术应用项目引导案例

农业既是人类所从事的最古老行业,也是人类文明的基础。工业革命之后,由于机械在农业领域的应用,使得收获的粮食大大增加。但是,较高的生产成本、农业生态环境遭到破坏、农作物病虫害等问题,仍然是制约农业发展的瓶颈。要解决以上问题,根本出路在于依靠科技发展,人工智能就是解决的方法之一。思考一下,大家见过哪些智慧农业?项目引导案例稻麦成熟度监测系统模型训练任务一职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务一稻麦成熟度监测系统模型训练了解智慧农业应用发展;了解水稻生长周期;了解深度学习。能够根据需求完成模型搭建;能够完成图像数据集的预处理及数据增强;能够配置模型微调训练所需参数;能使根据需求完成模型的微调训练;能够实现训练结果的可视化。职业能力目标01知识目标技能目标职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务一稻麦成熟度监测系统模型训练

本实验将实现基于预训练的稻麦监测模型用新数据对模型进行微调训练,训练出新的检测模型用于任务二的系统部署。任务描述任务要求能使用Sequential模块检定义序贯模型;能使用add方法构建神经网络层;能使用Adam优化算法函数创建优化器;能使用compile方法配置训练方法;能使用ModelCheckpoint模块设置函数保存方式;能使用fit_generator方法训练模型;能使用pyplot模块对训练结果进行可视化展示。任务描述与要求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知识储备智慧农业133数据增强智慧农业04含有人工智能技术的农业,我们称为智慧农业。它是指现代科学技术与农业种植相结合,从而实现无人化、自动化、智能化管理。智慧农业是人工智能、物联网技术在现代农业领域的应用,主要具有监控功能系统、监测功能系统、实时图像与视频监控功能等等。人工智能在农业中的作用041、种子检测

种子是农业生产中最重要的生产资料之一,种子质量直接关系到作物产量。种子的纯度和安全性检测,是提升农产品质量的重要手段。人工智能在农业中的作用042、智能种植

在传统农业中,需要耗费大量的人力、物力。搭载人工智能技术的机器人将有助于缓解农民的负担,大大降低土地对劳动力的需求量。人工智能在农业中的作用043、作物监控

人工智能技术可在农作物检测中提供强大的技术的支持,通过机器人视觉技术,模拟人类的视觉功能,判断农作物的生长状态、病虫害监测以及杂草辨别。人工智能在农业中的作用044、土壤灌溉

人工神经网络具备机器学习能力,能够根据检测得到的气候指数和当地的水文气象观测数据,选择最佳灌溉规划策略。04水稻生长周期从水稻种子发芽至幼苗拔节期,大约需要90天。这个时期又分4个时期:a.幼苗期,是从水稻种子萌芽到移栽插秧前,一共大约需要35天时间。b.插秧期,是从开始插秧到定植开始生长的这段时间,大约需要7-10天。c.分蘖期,是从插秧开始生长拔节前这段时间,大约需要30天。d.拔节期是从开始拔节到孕穗前这段时间,大约需要15天。(1)营养生长阶段水稻的一生要经历营养生长和生殖生长两个时期,水稻生长期最短三到四个月。04水稻生长周期从孕穗到成熟这段时间称为生殖生长阶段,大约需要经过70天时间,共分四个时期:a.孕穗期。是从开始孕穗到抽穗始时,这段时间大约15天。b.抽穗期。从开始破口抽穗起到开始破壳扬花止,大约需要15天。c.扬花授粉期。从开始扬花到开始籽粒灌浆时止,大约15-20天。d.灌浆期。从开始灌浆到成熟收获止,大约需要20天时间。(2)生殖生长阶段204知识储备133深度学习和卷积神经网络智慧农业数据增强

04

深度学习(DL,DeepLearning)是机器学习(ML,MachineLearning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI,ArtificialIntelligence)。

深度学习在搜索技术,数据挖掘,机器学习,机器翻译,自然语言处理,多媒体学习,语音,推荐和个性化技术,以及其他相关领域都取得了很多成果。深度学习的概念源于人工神经网络的研究,含多个隐藏层的多层感知器就是一种深度学习结构。

深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

深度学习深度学习的概念04深度学习的训练过程

(1)自下上升的非监督学习

从底层开始,一层一层地往顶层训练。采用无标定数据分层训练各层参数,这一步可以看作是一个无监督训练过程,这也是和传统神经网络区别最大的部分,可以看作是特征学习过程。(2)自顶向下的监督学习

通过带标签的数据去训练,误差自顶向下传输,对网络进行微调。基于第一步得到的各层参数进一步优调整个多层模型的参数,这一步是一个有监督训练过程。卷积神经网络04

卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetworks),是深度学习(deeplearning)的代表算法之一。卷积神经网络结构04(1)输入层卷积神经网络的输入层可以处理多维数据。

(2)隐含层卷积神经网络的隐含层包含卷积层、池化层和全连接层3类常见构筑,在一些更为现代的算法中可能有Inception模块、残差块(residualblock)等复杂构筑。(3)输出层卷积神经网络中输出层的上游通常是全连接层,因此其结构和工作原理与传统前馈神经网络中的输出层相同。03010204①重用分类器权重(对最后的分类层进行的处理)源数据可能也有目标数据中的部分标号可以使用预训练好的模型分类器中对应标号对应的向量作初始化值②固定一些层神经网络通常学习有层次的特征表示(底层描述的特征更加通用,而高层的特征和数据集相关性更强)可以固定相对底部的层,不参与参数更新(应用了更强的正则化)微调训练常见的微调技术04用训练集的数据来训练模型,然后用测试集的数据来测试模型。应对新场景的误差率称为泛化误差(或者样例外误差),通过测试集来评估你的模型,就可以得到对这个误差的评估。这个估值可以告诉你,你的模型在处理新场景时的能力如何。(通常使用80%的数据进行训练,保留另外的20%来做测试)训练集:训练集的数据来训练模型测试集:用测试集的数据来测试模型,通过测试集来评估你的模型,就可以得到对这个误差的评估训练集和测试集04损失函数损失函数

损失函数用来评价模型的预测值和真实值不一样的程度,给模型的优化指引方向。损失函数选择的越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。优化神经网络的基准,就是缩小损失函数的输出值。04交叉熵损失(CrossEntropy):均方差损失与评价绝对误差损失

均方差(MSE)损失是机器学习、深度学习回归任务中最常用的一种损失函数,也称为L2Loss。

平均绝对误差(MAE)是另一类常用的损失函数,也称为L1Loss。MSE比MAE能够更快收敛,MAE对异常点更加鲁棒。MSE与MAE区别损失函数04

合页损失函数是一种将MSE与MAE结合起来,取两者优点的损失函数。从图中可以看到:1)0-1损失:当样本被正确分类时,损失为0;当样本被错误分类时,损失为1。2)感知机损失函数:当样本被正确分类时,损失为0;当样本被错误分类时,损失为-y(wx+b)。3)合页损失函数:当样本被正确分类且函数间隔大于1时,合页损失才是0,否则损失是1-y(wx+b)。也就是说,合页损失函数对学习有更高的要求。缺点:合页损失函数是对错误越大的样本施以更严重的惩罚。可这样会导致损失函数对噪音敏感。损失函数04

softmax函数,又称归一化指数函数。

我们知道概率有两个性质:预测的概率为非负数;各种预测结果概率之和等于1。softmax就是将在负无穷到正无穷上的预测结果按照这两步转换为概率的。softmax第一步就是将模型的预测结果转化到指数函数上。为了确保各个预测结果的概率之和等于1,只需要将转换后的结果进行归一化处理。损失函数04

交叉熵损失函数,也称为对数损失或者logistic损失。交叉熵能够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。

损失函数204知识储备133深度学习和卷积神经网络智慧农业数据增强04数据增强

数据增强也叫数据扩增,意思是在不实质性的增加数据的情况下,让有限的数据产生等价于更多数据的价值。

比如右图,第1列是原图,后面3列是对第1列作一些随机的裁剪、旋转操作得来。04数据增强1.有监督的数据增强

有监督数据增强,即采用预设的数据变换规则,在已有数据的基础上进行数据的扩增,包含单样本数据增强和多样本数据增强,其中单样本又包括几何操作类,颜色变换类。数据增强可以分为:有监督的数据增强和无监督的数据增强方法04数据增强2.无监督的数据增强无监督的数据增强方法包括两类:①通过模型学习数据的分布,随机生成与训练数据集分布一致的图片,代表方法GAN。②通过模型,学习出适合当前任务的数据增强方法,代表方法AutoAugment。ImageDataGenerator将图片转化成数组。转换前元素类型是整型,转换后元素类型是浮点型(和keras等机器学习框架相适应的图像类型)load_imgImageDataGenerator04ImageDataGenerator:i.图片生成器,负责生成一个批次一个批次的图片,以生成器的形式给模型训练;ii.对每一个批次的训练图片,适时地进行数据增强处理。加载了一个图片文件,没有形成numpy数组img_to_array04fromPILimportImageimg_data=np.random.random(size=(100,100,3))img=tf.keras.preprocessing.image.array_to_img(img_data)array=tf.keras.preprocessing.image.img_to_array(img)img_to_array功能img:输入PILImage实例。data_format:图像数据格式,可选“channels_first”或“channels_last”。默认为没有一个,在这种情况下为全局设置tf.keras.backend.image_data_format()使用(除非你改变它,它默认为“channels_last”)。dtype:要使用的d类型。默认为没有一个,在这种情况下为全局设置tf.keras.backend.floatx()使用(除非你改变它,它的默认值为“float32”)用法:04image=tf.keras.preprocessing.image.load_img(image_path)input_arr=tf.keras.preprocessing.image.img_to_array(image)input_arr=np.array([input_arr])#Convertsingleimagetoabatch.predictions=model.predict(input_arr)load_img功能path:镜像文件路径。grayscale:不赞成使用color_mode=“灰度”.color_mode:"grayscale","rgb","rgba"中的一个。默认值:“rgb”。所需的图像格式。target_size:要么没有一个(默认为原始大小)或整型元组(img_heightimg_width).interpolation:如果目标大小与加载的图像大小不同,用于对图像重新采样的插值方法。支持的方法有“nearest”、“bilinear”和“bicubic”。用法:职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务一稻麦成熟度监测系统模型训练05任务实施训练环境配置2了解稻麦监测系统1稻麦模型训练实验3模型微调训练4了解稻麦监测系统05稻麦监测系统是人工智能应用于农业生产的一个典型案例,能够在较低成本,轻量化的系统下做到农田稻麦状态的精确识别与环境参数的采集和监测。该实验以训练深度学习模型来对稻麦生长阶段进行识别为案例,通过实现环境配置、模型搭建、训练、测试到边缘端部署,深入体验深度学习的应用开发全流程。此次实验的数据集由稻麦生长的三个不同阶段的图片集所组成,分别为稻麦的生长期,孕穗期和成熟期。分别对应标签seeding,green,golden。深度学习应用从模型开发到应用部署的全流程,其中包括:(1)数据采集与数据处理:数据采集、开源数据集的使用、数据筛选与处理;(2)模型搭建:模型设计,使用TensorFlow框架实现神经网络模型构建;(3)模型训练:超参数调整,使用TensorFlow框架实现训练图像分类模型;(4)模型评估:模型训练结果数据可视化,模型泛化能力评估,以及模型优化策略;(6)边缘端应用设计与开发:ui设计与实施,模型推理与调用,应用功能的实现;(7)边缘端部署:环境调试,边缘端开发板的实战部署。05任务实施训练环境配置2了解稻麦监测系统1稻麦模型训练实验3模型微调训练4训练环境配置05!pipinstall-rrequirements.txt-i/simple(边缘网关环境已安装,跳过)pip是python包管理工具,使用pip能够快速搭建所需要的实验环境。-i/simple是国内下载源,安装其他python包也可以使用该下载源。05任务实施训练环境配置2了解稻麦监测系统1稻麦模型训练实验3模型微调训练442定义优化器1模型结构搭建与查看3数据集预处理训练数据集设置5设置模型保存稻麦模型训练实验05稻麦模型训练实验稻麦模型训练实验051.模型结构搭建与查看使用Sequential()方法可以自定义网络结构,通过使用.add()添加自定义网络层。Conv2D(filters,kernel_size,padding='valid',activation=None):二维卷积层,提取局部特征。参数说明:当使用该层作为模型第一层时,需要提供input_shape参数。在keras中,数据是以张量的形式表示的,张量的形状称之为shape,表示从最外层向量逐步到达最底层向量的降维解包过程。例如:一个三阶的张量[[[1],[2],[3]],[[4],[5],[6]]]的shape是(2,3,1);filters:整数,卷积输出滤波器的数量;kernel_size:指定卷积窗口的高度和宽度;padding:有valid或same。(注:卷积会导致输出图像越来越小,图像边界信息丢失,若想保持卷积后的图像大小不变,需要设置padding参数为same);activation:如relu、sigmoid等。使用激活函数。如果不特别指定,将不会使用任何的激活函数。MaxPool2D(pool_size=(2,2),strides=None):可以加快计算速度和防止过拟合的作用。参数说明:pool_size:指定池窗口的大小;strides:指定池操作的步幅。keras.layers.Permute(dims):更改维度的顺序,维度索引从1开始。参数说明:dims:整数元组,是置换模式,不包含样本维度,索引从1开始,例如(2,1)即置换输入的第1和第2个维度。keras.layers.Reshape(target_shape):实现不同维度任意层之间的对接。参数说明:target_shape:目标shape,为整数的tuple,不包含样本数目的维度(batch大小)。Dense(units,activation):全连接层。参数说明:units:该层的神经单元结点数;activation:激活函数。Dropout(keep_prob):丢弃层。参数说明:keep_prob:保留一个神经元为激活状态的概率。在测试的时候keep_prob=1.0,即不进行dropout。稻麦模型训练实验05model=Sequential()#第一个卷积部分model.add(Conv2D(input_shape=(224,224,3),filters=32,kernel_size=3,padding='same',activation='relu'))model.add(Conv2D(filters=32,kernel_size=3,padding='same',activation='relu'))model.add(MaxPool2D(pool_size=2,strides=2))#第二个卷积部分model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))model.add(MaxPool2D(pool_size=2,strides=2))#第三个卷积部分model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))model.add(MaxPool2D(pool_size=2,strides=2))#替换平坦层a,b,c,d=model.output_shapea=b*c*dmodel.add(keras.layers.Permute([1,2,3]))#IndicateNHWCdatalayoutmodel.add(keras.layers.Reshape((a,)))model.add(Dense(64,activation='relu'))model.add(Dropout(0.5))model.add(Dense(3,activation='softmax'))1.模型结构搭建与查看使用model.summary()可以快速打印模型结构。model.summary()稻麦模型训练实验05adam=Adam(learning_rate=1e-5)pile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])2.定义优化器Adam(learning_rate):优化算法。参数说明:learning_rate:学习率。将输出误差反向传播给网络参数,以此来拟合样本的输出。本质上是最优化的一个过程,逐步趋向于最优解。pile(optimizer,loss,metrics):用于在配置训练方法时,告知训练时用的优化器、损失函数和准确率评测标准。参数说明:optimizer:优化器;loss:损失函数;多分类损失函数有:二分类交叉熵损失函数binary_crossentropy、多类别交叉熵损失函数categorical_crossentropy;metrics:评价指标;提供了六种准确率accuracy、二分类准确率binary_accuracy、分类准确率categorical_accuracy、稀疏分类准确率;sparse_categorical_accuracy、多分类TopK准确率top_k_categorical_accuracy和稀疏多分类TopK准确率parse_top_k_categorical_accuracy。稻麦模型训练实验053.数据集预处理ImageDataGenerator(rotation_range=0.0,width_shift_range=0.0,height_shift_range=0.0,shear_range=0.0,zoom_range=0.0,fill_mode='nearest',horizontal_flip=False,rescale=None):keras.preprocessing.image模块中的图片生成器,同时也可以在batch中对数据进行增强,扩充数据集大小,增强模型的泛化能力。比如进行旋转,变形,归一化等等。参数说明:rotation_range:旋转范围;width_shift_range:水平平移范围;height_shift_range:垂直平移范围;rescale:系数值将在执行其他处理前乘到整个图像上,实现归一化;shear_range:float,透视变换的范围;zoom_range:缩放范围;horizontal_flip:水平反转;fill_mode:填充模式,constant、nearest(默认)、reflect、wrap。稻麦模型训练实验05train_datagen=ImageDataGenerator(rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,rescale=1/255,shear_range=20,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')test_datagen=ImageDataGenerator(rescale=1/255)3.数据集预处理稻麦模型训练实验05batch_size=2train_generator=train_datagen.flow_from_directory(directory='./datasets/train',target_size=(224,224),batch_size=batch_size)test_generator=test_datagen.flow_from_directory(directory='./datasets/test',target_size=(224,224),batch_size=batch_size)4.训练数据集设置flow_from_directory(directory,target_size,batch_size):以文件夹路径为参数,生成经过数据提升/归一化后的数据,在一个无限循环中无限产生batch数据。参数解释directory:目标文件夹路径,对于每一个类,该文件夹都要包含一个子文件夹。子文件夹中任何JPG、PNG、BNP、PPM的图片都会被生成器使用。target_size:整数tuple,默认为(256,256)。图像将被resize成该尺寸。batch_size:batch数据的大小。稻麦模型训练实验05fromtensorflow.keras.callbacksimportModelCheckpoint#保存最好模型checkpoint=ModelCheckpoint(filepath='./models/val_accuracy={val_accuracy:.4f}.h5',monitor='val_accuracy',verbose=1,save_best_only=True,mode='auto')callback_lists=[checkpoint]5.设置模型保存ModelCheckpoint(filepath,monitor,verbose,save_best_only,mode):将在每个epoch后保存模型到指定路径中参数说明:filepath:模型保存的位置,可以只指定到文件夹,也可以指定到具体的文件名。monitor:需要监视的值,通常为:val_accuracy或val_loss或accuracy或loss。verbose:信息展示模式,0或1。为1表示输出epoch模型保存信息,默认为0表示不输出该信息。save_best_only:设为True或False,为True就是保存在验证集上性能最好的模型,如果用像val_accuracy={val_accuracy:.4f}.h5这样的格式化名,因为每个文件名字不同,就不会覆盖;mode:可以设为auto,min或max,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_accuracy时,模式应为max,当检测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。05任务实施训练环境配置2了解稻麦监测系统1稻麦模型训练实验3模型微调训练42进行模型微调训练1载入预训练模型3训练结果可视化模型微调训练05模型微调训练模型微调训练是指将新数据集加入预训练过的模型进行训练,并使参数适应新数据集的过程。模型微调适用场景:数据集和预训练模型的数据集相似,但数据量小;个人搭建或者使用的CNN模型正确率低;模型训练计算资源不足。模型微调训练05fromtensorflow.keras.modelsimportload_modelmodel=load_model('./models/pre_trained_model.h5')1.载入预训练模型load_model(filepath):载入预训练模型.参数说明:filepath:需要载入模型的路径。history=model.fit_generator(generator=train_generator,steps_per_epoch=round(len(train_generator)),epochs=3,validation_data=test_generator,validation_steps=len(test_generator),callbacks=callback_lists)2.进行模型微调训练fit_generator(self,generator,steps_per_epoch,epochs=1,verbose=1,callbacks=None,validation_data=None,validation_steps=None,class_weight=None,max_q_size=10,workers=1,pickle_safe=False,initial_epoch=0):利用Python的生成器,逐个生成数据的batch并进行训练。生成器与模型将并行执行以提高效率。参数说明:generator:生成器函数,所有的返回值都应该包含相同数目的样本。每个epoch以经过模型的样本数达到steps_per_epoch时,记一个epoch结束steps_per_epoch:整数,表示一个epoch中迭代的次数;当生成器返回steps_per_epoch次数据时计一个epoch结束,执行下一个epochepochs:整数,数据迭代的轮数validation_data:验证集数据validation_steps:当validation_data为生成器时,本参数指定验证集的生成器返回次数callbacks:在训练期间应用的回调函数。可以使用回调函数来查看训练模型的内在状态和统计。函数返回一个History对象。模型微调训练05plt.plot(history.history['accuracy'])#绘制训练精度曲线plt.plot(history.history['val_accuracy'])#绘制测试精度曲线plt.title('Modelaccuracy')#图名plt.ylabel('Accuracy')#y轴标签plt.xlabel('Epoch')#x轴标签plt.legend(['Train','Val'],loc='upperleft')#给图像加上图例,置于左上角plt.show()3.训练结果可视化绘制模型精度变化图。绘制模型精度变化图。plt.plot(history.history['loss'])plt.plot(history.history['val_loss'])plt.title('Modelloss')plt.ylabel('Loss')plt.xlabel('Epoch')plt.legend(['Train','Val'],loc='upperright')plt.show()职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务一稻麦成熟度监测系统模型训练任务检查与评价06序号评价内容评价标准分值得分1知识运用(20%)掌握相关理论知识,理解本次任务要求,制定详细计划,计划条理清晰,逻辑正确(20分)20分

理解相关理论知识,能根据本次任务要求、制定合理计划(15分)了解相关理论知识,有制定计划(10分)无制定计划(0分)2专业技能(40%)完成了解稻麦检测系统、训练环境配置、稻麦模型训练实验、模型微调训练。(40分)40分

完成了解稻麦检测系统、训练环境配置、稻麦模型训练实验。(30分)完成了解稻麦检测系统、训练环境配置。(20分)完成了解稻麦检测系统。(10分)没有了解稻麦检测系统。(0分)3核心素养(20%)具有良好的自主学习能力、分析解决问题的能力、整个任务过程中有指导他人(20分)20分

具有较好的学习能力和分析解决问题的能力,任务过程中无指导他人(15分)能够主动学习并收集信息,有请教他人进行解决问题的能力(10分)不主动学习(0分)4课堂纪律(20%)设备无损坏、设备摆放整齐、工位区域内保持整洁、无干扰课堂秩序(20分)20分

设备无损坏、无干扰课堂秩序(15分)无干扰课堂秩序(10分)干扰课堂秩序(0分)总得分1、请参照评价标准完成自评和对其他小组的互评。2、各组请代表分析本组任务实施经验。职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务一稻麦成熟度监测系统模型训练任务小结07职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务一稻麦成熟度监测系统模型训练任务拓展08从新训练模型:1不采用微调训练,从零开始训练模型;1.从零开始训练就不需要加载预训练模型;解题

思路提示任务要求2对比两种训练方式的训练速率和预测精度;谢谢大家学习项目五基于计算机视觉技术实现稻麦监测系统嵌入式人工智能技术应用稻麦成熟度监测系统模型评估与应用部署任务二职业能力目标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)exceptExceptio

温馨提示

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

评论

0/150

提交评论