实验5视觉目标感知: 深度学习方法 第5章学习素材 5.1实验目的 视觉传感器具有高分辨率、低成本的特点,是自动驾驶车辆上最常用的环境感知传感器之一。随着近年来硬件计算能力的提升和深度学习算法的快速发展,深度神经网络模型被广泛应用于计算机视觉领域,相比于传统的数字图像处理方法有了很大的性能提升。通过本次实验,读者可以理解深度学习的基本原理及过程,并学会搭建简单的线性回归模型,使用深度学习的方法完成标识牌识别任务,并将模型部署到实验车上。 本章实验目的: (1) 理解深度学习原理并学会搭建简单的模型; (2) 使用深度学习进行标识牌的识别和部署应用。 5.2实验过程简介 本实验安排两个子实验: 子实验一,线性回归实验,使用Python语言及其中的NumPy库实现基本的神经网络步骤,搭建简单的线性回归网络,实现能够预测图像中的物体类别的神经网络模型,理解深度学习的基本原理,掌握深度学习的基本组成模块与实现流程; 子实验二,基于深度学习的标识牌检测实验,基于百度开发的训练平台AI Studio进行经典图像识别模型YOLOv3训练并固化模型,将模型部署到小车上执行预测推理代码,实现从摄像头画面中的实时图像中识别交通标示牌,掌握复杂神经网络应用的基本流程与方法。 5.3前导知识 视觉感知是自动驾驶领域的感知领域中的重要组成部分,广泛用于车道线识别、交通信号灯识别、交通标识识别等场景。本实验包含两部分内容,分别是使用传统图像处理来识别车道线,以及使用深度学习技术来识别特定目标。从理解视频、图像数据信息开始,实验简单识别车道线的方法,以及应用深度学习模型YOLOv3来识别交通标识并熟悉部署过程,学习和实践视觉感知相关内容。 5.3.1AI Studio介绍及使用 AI Studio是基于百度深度学习平台飞桨的人工智能学习与实训社区,提供在线编程环境、免费GPU算力、海量开源算法和开放数据,可以帮助开发者快速创建和部署模型。该平台主要分为项目、数据集、课程、比赛四大部分,具有2000多个优质的公开项目,覆盖计算机视觉、自然语言处理、推荐算法等众多人工智能热门领域。AI Studio推荐项目界面如图51所示。 图51AI Studio推荐项目 本实验主要用到AI Studio的项目平台。首先,找到需要使用的项目并双击进入,在此以“基于YOLOv3目标检测模型”项目为例进行操作示范,可以看到项目首页页面如图52所示。 图52AI Studio目标检测项目首页 项目页面的右上方有一个Fork按钮,单击该按钮即可把该开源项目复制到自己的项目中,对该项目进行个性化的训练、修改等操作。单击Fork按钮后弹出的提示框如图53所示,可以修改项目名称和项目描述。 图53单击Fork按钮后弹出的提示框 在图53所示提示框中编辑好个性化的项目名称和项目描述,单击“创建”按钮即可复制原开源项目并创建新项目,此后在AI Studio的“个人中心”→“我的主页”→“项目”→“创建和Fork的项目”中可以找到之前的所有项目,具体界面如图54所示。 图54在“个人中心”查找历史项目 在创建和Fork项目完成之后,在个人中心找到对应的项目即可训练、修改、使用,具体界面如图55所示。在其中的“版本内容”栏下,有对于该项目详细的原理解释与操作说明文档Notebook。 图55个人项目界面 一边阅读说明,一边按照顺序步骤执行,即可完成如数据处理、模型训练等过程。以“基于YOLOv3目标检测模型”项目为例,其操作讲解内容分为模型结构、解压训练数据、训练配置等部分。按照顺序,先准备好训练数据,配置训练参数,再定义日志初始化配置函数,定义网络结构……最后固化训练好的模型并加载,可对输入图像中的交通标识牌进行预测。 在了解完项目执行内容后,单击图55中右上方的“启动环境”按钮,此时会弹出Jupyter Notebook,表明进入了开启的环境,在Jupyter Notebook中修改代码,然后单击“运行”按钮,即开始在AI Studio提供的硬件平台上进行训练。 进入项目环境后,界面的左方有一个“环境”选项,可以看到当前项目使用的环境信息,有硬件信息、GPU资源信息、环境配置以及终端连接,如图56所示。 图56环境信息 完成项目后,为了防止浪费算力卡的算力资源,进入AI Studio的项目页面,单击右上方的“停止”按钮,将弹出信息提示框,如图57所示,单击“确认”按钮即可停止运行中的项目并关闭环境。 图57停止运行项目 以上是AI Studio平台的基本操作。 5.3.2小车硬件平台介绍 图58Jetson Nano小型计算机 实验小车搭载的计算硬件平台为英伟达Jetson Nano。这款外观小巧但功能强大的CUDAX人工智能计算机可以为运行现代人工智能工作负载提供472 GFLOPS(每秒十亿次浮点运算)的计算性能,并且耗电量仅为5W,具有高能效,外观如图58所示。英伟达Jetson Nano分为两种型号: 一种是面向技术爱好者的开发者套件; 另一种是面向企业的生产就绪型模块。 它支持高分辨率传感器,可以并行处理多个传感器,并且可在每个传感器流上运行多个现代神经网络。它还支持许多常见的人工智能框架,让开发人员轻松地将自己偏爱的模型及框架集成到产品中。 5.3.3Jupyter Notebook介绍 由于百度AI Studio开发平台的代码编辑区是基于Jupyter Notebook进行的,并且Jupyter Notebook也是常用的Python代码编写工具,在此对Jupyter Notebook做简单介绍。 Jupyter Notebook是一个基于网页的应用程序,可被应用于全过程计算: 开发、文档编写、记录、运行代码和展示结果。它包含两个组件,第一个是网页应用程序,它是一种基于浏览器的工具,用于交互式创作文档,将解释性文本、数学、计算及其富媒体输出结合起来; 第二个组件是笔记本文档,用于网页应用程序中所有可见内容的表示,包括计算的输入和输出、解释性文本、数学、图像和对象的富媒体表示。Jupyter Notebook文档是保存为扩展名为.ipynb的JSON格式文件,并且文档还可以导出为HTML、LaTeX、PDF等格式,不仅便于版本控制,也方便与他人共享。 Jupyter Notebook的基本交互界面如图59所示,其中Notebook name指示的是显示在页面顶部的Jupyter徽标旁边的名称,单击此处会弹出对话框允许用户重命名,该名称即为.ipynb文件的名称。 图59Jupyter Notebook界面 文件名下方的第一行是菜单栏,包括文件、编辑、插入等选项,菜单栏下方是工具栏,通过单击其中的图标,可以执行保存、粘贴、运行等操作。最后单独的“In [ ]”行是代码单元格,代码单元格允许开发者编辑和编写新代码,并提供完整的语法高亮显示和制表符补全,默认内核(IPython)运行Python代码。 当代码单元被执行时,它包含的代码被发送到与笔记本相关联的内核。从这个计算中返回的结果将作为单元格的输出显示在笔记本文档中。输出不仅限于文本,还有许多其他可能的输出形式,包括Matplotlib图和HTML表(例如,在Pandas数据分析包中使用)。这就是IPython丰富的显示功能。 5.3.4Logistic 回归模型 Logistic回归网络是最简单的单层神经网络模型,该过程包含了实现所有神经网络的基本步骤。Logistic 回归模型是一种用于分析各变量(x1,x2,…,xn)与分类结果y之间关系的监督学习方法。 典型的深度学习的计算过程包含3个过程:正向传播(forward propagation)、反向传播(backward propagation)和梯度下降(gradient descent)。正向传播是主要进行前向的计算; 反向传播简单来说是求偏导构成权值向量的过程; 梯度下降是找到目标函数最优的更新参数的方法。 1. 正向传播 正向传播由线性变换和非线性变换组成。线性变换是对输入向量进行线性组合,在线性回归模型中,设输入的特征向量为x,线性变换的结果表示为z=wTx+b。其中w表示权重,b表示偏置。线性变换之后为了提升模型的表达能力,引入非线性变换。引入非线性变换的函数通常被称为激活函数,常用的激活函数有Sigmoid、Tanh、elu、ReLU等。它们各具特点,按需使用即可。本模型使用Sigmoid()函数作为激活函数,它的特点是输入较大时趋近于1,输入较小时趋近于0。 2. 反向传播 反向传播是在前向传播后计算损失函数值,根据损失函数值从网络最末层逐层向前求梯度,最终得到所有参数偏导数的过程。 3. 梯度下降 梯度下降是更新参数的方法。 5.3.5YOLOv3图像识别模型 YOLOv3是YOLO(you only look once)系列目标检测算法中的第三版,相比之前的YOLO系列算法,针对小目标精度有显著提升,因此在计算速度快的同时具有较高精度,成为现在最常用的神经网络模型之一。 YOLOv3将输入图像分成S×S个格子,每个格子预测B个边界框,每个边界框预测内容包括: 坐标(x, y, w, h)、置信度和C个类别的概率,因此YOLOv3输出层的通道数为B(5+C)。YOLOv3的损失函数也由三部分组成: 坐标误差、置信度误差和分类误差。 YOLOv3的网络结构图510所示。 图510YOLOv3的网络结构 YOLOv3的网络结构由基础特征提取网络、multiscale特征融合层和输出层组成。 (1) 特征提取网络。YOLOv3使用 DarkNet53作为特征提取网络: DarkNet53 基本采用了全卷积网络,用步长为2的卷积操作替代了池化层,同时添加了 Residual 单元,避免在网络层数过深时发生梯度弥散。 (2) 特征融合层。为了解决之前YOLO版本对小目标不敏感的问题,YOLOv3采用了3个不同尺度的特征图来进行目标检测,分别为13×13、26×26、52×52,用来检测大、中、小三种目标。特征融合层选取 DarkNet 产出的三种尺度特征图作为输入,借鉴了FPN(feature pyramid networks)的思想,通过一系列的卷积层和上采样对各尺度的特征图进行融合。 (3) 输出层。同样使用了全卷积结构,其中最后一个卷积层的卷积核个数是255,即3×(80+4+1)=255,3表示一个格子包含3个边界框,4表示框的4个坐标信息,1表示置信度,80表示COCO数据集中80个类别的概率。如果换用别的数据集,80可以更改为实际类别数量。 由于结构简洁以及不错的性能,YOLOv3被广泛应用于目标检测,如行人检测、标示牌检测等。只需要建立目标任务以及准备相应的数据集,经过足够的训练就能获得很好的结果。在本次实验中使用aistudio平台作为训练平台,通过一个预先标记好的数据集,结合aistudio上的公开项目,就能训练一个用于小车的标示牌识别模型。 为了方便读者使用YOLOv3网络模型,以下是供参考的项目地址以及数据集地址,可直接通过访问地址在百度飞桨平台上获取相关资源。 项目地址: https://aistudio.baidu.com/aistudio/projectdetail/162431。 数据集地址: https://aistudio.baidu.com/aistudio/datasetdetail/17748。 一个实用的深度学习模型的构建和应用需要经过如下一些过程: 数据采集和处理、标注、模型搭建、调试、训练、评估、模型固化/剪枝、模型部署。 (1) 数据采集和处理。使用传感器或其他方式获取待训练、评估的数据,并根据需要加工成指定格式,并经过特定处理。如本实验过程中,对采集的图像进行了数据增强,包括裁剪、亮度调整、缩放等,力求消除采集带来的影响。一般来说,数据的采集和处理过程所得到的数据尽可能与实际要预测的情况保持一致,如光照程度、明暗程度、摄像头角度等。数据一致容易得到一个在实际场景中表现不错的模型。 (2) 标注。YOLOv3模型需要对训练的数据进行预先标注,属于监督学习。在本次项目过程中,需要学习框位置(左上角、右下角)、所属分类及概率,这些需要进行预先标注才能通过模型训练得到其“预测函数”。 (3) 模型搭建。使用某个深度学习框架作为基础,构建模型网络结构,并能在之后的训练过程中执行有效的训练计算。本实验采用飞桨框架作为深度学习框架,基于Python语言进行模型搭建。搭建过程使用基于飞桨开发的开源的YOLOv3模型,稍加改动后获得。当前深度学习模型搭建模式有两种: 静态图模式和动态图模式。其中静态图模式是指在搭建执行过程中产生一个不可再变化的计算图(graph),再交由框架去执行计算; 而动态图允许用户编写一些随着执行过程动态调整网络结构或计算方式的处理,通过牺牲一些执行效率,换取在编程调试上更加灵活。 (4) 模型调试。由于YOLOv3等深度模型网络结构本身有很多参数可以调节,如anchors的设置、学习率设置等。这些参数需要根据实际使用场景和数据情况进行微调,以得到合适的模型。 (5) 模型训练。将模型构建过程生成的计算图提交框架的执行器进行运行。计算的过程包含前向计算以及反向更新参数。由于涉及大量的计算,模型训练将耗费非常多的算力。为了加快模型训练速度,常常使用GPU来进行模型训练。如图像一类的模型,由于涉及高维特征分类计算,GPU对于训练、推理过程加速性能更是明显。 (6) 模型评估。通过设置一些指标,如准确率、召回率等,来判断模型训练的结果是否达到预期,以控制训练的次数和退出训练条件。同时还可以对比不同模型的效果情况,以选取合适的模型以及参数配置。 (7) 模型固化、剪枝。由于模型训练过程是对参数空间进行学习和更新的过程,可以根据经验和方法来对模型进行剪枝。类比说明,就是去掉不必要的一些参数,人为地选择一些对问题或目标关系更大的参数。此外,针对执行环境,常常还需要进行一些参数精度转化,如训练时是float32的参数,经过量化变成float8或者int32,以降低精度要求的方式,加快预测执行速度。另外,由于模型的训练过程包含完整的前向计算以及反向(求导)计算过程,而预测过程不涉及更新参数,所以在预测时仅需要保留前向计算图即可,并且剔除反向计算所涉及的一些参数,这部分称为模型固化。 (8) 模型部署。将固化后的模型放到指定环境上,仅仅使用模型进行预测,不再进行训练参数更新。在现实场景中,模型部署环境与训练环境差别很大,比如使用x86+cuda的环境进行训练,而部署端环境为ARM甚至是FPGA。这部分通常由框架来屏蔽硬件影响,做软件、系统、硬件层次的适配。并且针对部署环境做特定的预测优化。成熟的框架支持训练固化好的模型,在不同的端环境进行预测,并且效果差距很小甚至没有差距。而一些框架则需要针对端做特定的模型转化后才兼容。此处不做进一步说明,可以参考具体的文档。 5.3.6数据集解释与项目说明 数据集包含内容如图511所示。 图511数据集内容 其中images是图像文件夹,包含网上采集的100多张有交通标示牌的照片。 train.txt则是需要训练的文件列表,还包含图像的标注。标注使用JSON形式进行描述。包含标签名、选择框的位置。选择框位置以左上角的(x,y)坐标以及右下角的(x,y)坐标描述。 label_list.txt用来标记都有哪些标签,此处简略分成两个标签(warning,alert),可以根据需要重新标注。label_list文件则是生成的一个字典文件,用来将标签映射成数字标号,便于之后进行标签处理。 Aistudio.baidu.com是一个提供nodebook模式(Python)的在线平台。并且包含大量公开的、可供用户选择学习的深度学习项目。一边阅读说明,一边按照顺序步骤执行,即可完成如数据处理、模型训练等过程。请参考具体的项目的说明,通过一步一步执行相应的代码来得到训练并固化好的模型,以导出到小车上并执行预测。 使用之前需要查到对应的项目并进行Fork,Fork之后即可进行编辑、训练。Fork按钮位置见图512右上角。 图512Fork按钮位置 单击“启动环境”按钮,如图513所示,选择GPU环境,如图514所示。 图513“启动环境”按钮位置 图514选择运行环境 执行训练,最终固化得到一个文件目录freeze_model,下载到本地,用于传输到实验车上进行预测。 5.4实验步骤 5.4.1Logistic回归模型识别图像实验 本实验使用Python及NumPy库实现Logistic回归模型来识别猫,通过实现神经网络最简单的线性回归模型,学习基本的神经网络训练流程,掌握使用神经网络进行回归分类的方法。 具体任务: 依次编写代码引用库文件、载入数据、数据预处理,实现模型基本结构,构造模型预测与训练函数,预测函数可以通过输入得到输出判断结果,最后绘制学习曲线观察损失函数的变化情况。 操作步骤如下。 1. 引用库文件 首先,引用几个需要用到的库,具体如下。 (1) NumPy: 最常用的Python 库,用于科学计算。 (2) matplotlib.pyplot: Python中常用的生成图的库。 (3) utils: 用于载入数据的库。 引用库文件的代码如下: import matplotlib.pyplot as plt import numpy as np import utils 2. 载入数据 图片数据集包含以下内容。 (1) 训练集: 包含了train_num张图片的数据集,数据标签分为cat(y=1)和noncat(y=0)两类。 (2) 测试集: 包含了test_num张图片的数据集,数据的标签同(1)。图片数据采用三通道RGB形式存储。 读取数据代码如下: X_train, Y_train, X_test, Y_test, classes = utils.load_data_sets() 上述数据分别是训练和测试数据集 X_train、X_test 以及对应的标签集 Y_train、Y_test,还有分类列表 classes。以训练集 X_train 为例,每行都是一个表示图像的三维数组。 3. 数据预处理 获取数据后的下一步工作是获得数据的相关信息,使其成为能够被使用的数据,代码如下: train_num = X_train.shape[0] test_num = X_test.shape[0] # 本例中 num_px=64 px_num = X_train.shape[1] # 转换数据形状 data_dim = px_num * px_num * 3 X_train = X_train.reshape(train_num, data_dim).T X_test = X_test.reshape(test_num, data_dim).T #数据归一化 X_train = X_train / 255. X_test = X_test / 255. 4. 模型结构 首先,实现sigmoid()激活函数。初始化模型参数函数为 initialize_parameters(),将参数W和b都初始化为0。定义正向传播和反向传播函数forward_and_backward_propagate(),该函数的关键是计算成本和梯度,其中cost表示成本,dW和db分别表示对应的梯度。 定义参数更新函数update_parameters(),它可以使用梯度dW和db完成一次参数更新过程,关键为调用forward_and_backward_propgate()获取梯度值dW、db和成本值cost,并根据梯度值来更新参数W和b。以W为例,更新公式为W=W-learning_rate*dW。具体代码如下: #Sigmoid函数 def sigmoid(x): return 1 / (1 + np.exp(-x)) #初始化函数 def initialize_parameters(data_dim): # 将 W 初始化为 (data_dim, 1) 形状的零向量,其中 data_dim 表示 W 参数的个数 # 将 b 初始化为零 W = np.zeros((data_dim, 1), dtype = np.float) b = 0 return W, b #正向传播和反向传播 def forward_and_backward_propagate(W, b, X, Y): m = X.shape[1] # 正向传播,计算成本函数 Z = np.dot(W.T,X) + b A = sigmoid(Z) dZ = A - Y cost = np.sum(-(Y * np.log(A) + (1 - Y) * np.log(1 - A))) / m # 反向传播,计算梯度 dW = np.dot(X, dZ.T) / m db = np.sum(dZ) / m cost = np.squeeze(cost) grads = { "dW":dW, "db":db } return grads, cost #一次参数更新函数 def update_parameters(X, Y, W, b, learning_rate): grads, cost = forward_and_backward_propagate(X, Y, W, b) W = W - learning_rate * grads[‘dW’] b = b - learning_rate * grads[‘db’] return W, b, cost 定义优化函数train(),根据迭代次数iteration_nums 调用上述update_parameters()函数对参数进行迭代更新。为了观察训练情况,每100次迭代记录一次成本cost,便于之后绘图分析,具体实现代码如下: deftrain(W, b, X, Y, iteration_nums, learning_rate): costs = [] for i in range(iteration_nums): W, b, cost = update_parameters(X, Y, W, b, learning_rate) # 每一百次迭代,打印一次 cost if i % 100 == 0: costs.append(cost) print("Iteration %d, cost %f" % (i, cost)) params = { "W": W, "b": b } return params, costs 5. 模型检验 以上内容完成了模型的训练,得到了最终的线性回归模型参数W和b。用该模型进行预测的函数为predict_ image(),具体实现代码如下。输入参数W、b以及测试数据集X,预测结果A。A为连续值,为了实现二分类,再将A转化为0或1。 defpredict_image(W, b, X): data_dim = X.shape[0] m = X.shape[1] predictions = [] W = W.reshape(data_dim, 1) A = sigmoid(np.dot(W.T, X) + b)# 预测结果 A # 将连续值 A 转化为二分类结果 0 或 1 for i in range(m): if A[0, i] > 0.5: predictions.append(1) elif A[0, i] < 0.5: predictions.append(0) return predictions 6. 模型训练 上述内容完成了数据的载入和预处理、配置模型结构以及实现模型检验所需的相关函数,现在只需按序调用这些函数即可完成模型的训练过程,代码如下: X_train, Y_train, X_test, Y_test, classes, px_num = load_data() iteration_nums = 2000# 迭代次数 learning_rate = 0.005# 学习率 data_dim = X_train.shape[0]# 特征维度 W, b = initialize_parameters(data_dim)# 初始化参数 params, costs = train(X_train, Y_train, W, b, iteration_nums, learning_rate) predictions_train = predict_image(X_train, params['W'], params['b']) predictions_test = predict_image(X_test, params['W'], params['b']) print("Accuracy on train set: {} %".format(calc_accuracy(predictions_train, Y_train))) print("Accuracy on test set: {} %".format(calc_accuracy(predictions_test, Y_test))) 7. 模型预测 获得预测结果后,可以查看模型判断对某张图片的预测是否准确,通过如下代码输出图片及其预测的分类结果。 # 分类正确的示例 index = 1 # index(1) is cat, index(14) is not a cat cat_img = X_test[:, index].reshape((px_num, px_num, 3)) plt.imshow(cat_img) plt.axis('off') plt.show() print ("you predict that it's a " + classes[ int(predictions_test[index])].decode("utf8") +" picture. Congrats!") 8. 绘制学习曲线 根据之前保存的输出成本可以得到学习曲线,具体实现代码如下: # 绘制学习曲线 plot_costs(costs, learning_rate) 5.4.2从图像中识别交通标示牌 本实验使用百度AI Studio平台的YOLOv3数据集和项目代码进行,通过开源项目实现YOLOv3网络的学习理解与训练使用,掌握使用复杂神经网络进行目标检测的方法,最后通过部署固化模型到实验小车实现实车检测交通标识。 具体任务: 首先Fork 百度AI Studio的YOLOv3项目到个人项目中,然后按照项目说明的讲解和步骤,设置训练参数并训练网络,训练完成之后固化模型,最后将固化的模型部署到小车上进行测试。 操作步骤如下。 1. 学会使用训练集数据 首先需要解压训练数据,命令如下: !cd data/data17748/ && unzip qo data1211.zip 图片数量约148张,其中一张图像如图515所示。train.txt文件描述每个图片中的目标,label_list文件描述类别。以00011.png为例,对应train.txt文件中标注行: images/00011.png {"value":"warning","coordinate":[[113.3226,102.9032],[295.5806,294.8387]]} {"value":"warning","coordinate":[[97.1935,310.1613],[288.3226,506.9355]]} 其中,"value"值有"warning"和"alert"两种,代表标识牌的类别; "coordinate"为标识包围框的坐标,共两组值,每组为一个点的横、纵坐标,通过这两个点的坐标可以形成一个矩形包围框。 图515训练集中的00011.png 2. AI Studio训练网络并绘制学习过程曲线 按照AI Studio项目Note Book中的说明训练YOLOv3网络,保存训练过程Loss值并绘制训练过程的Loss变化曲线。 使用者可以配置训练参数,如控制是否启用tiny版本,tiny版本体积小,适合部署在移动设备,本次实验默认使用 tiny版本。训练参数还有训练轮数、每批次训练图片数量、是否使用GPU训练、学习率、训练图片尺寸以及选取框尺寸等。 具体代码都在AI Studio项目中,并且每个需要注意的代码处都有注释进行功能说明,说明的示例如图516所示。 def infer(image_path): """ 预测,将结果保存到一张新的图片中 :param image_path: :return: """ origin,tensor_img,resized_img=read_image(image_path) input_w,input_h=origin.size[0],origin.size[1] 图516注释说明示例 3. 实车操作步骤 (1) 为小车通电,并确认已经启动系统。登录上位机系统,连接小车启动的无线网络(如Apollo_Edu_005, 无密码)。 (2) 在上位机打开一个终端, ssh登录到小车上(ssh geekcar@10.42.0.1, 密码为123456)。 (3) 打开上位机软件,单击实验5按钮。如果没有错误,能看到左侧空白的车道线识别窗口以及右侧空白窗口。 (4) 远程连接小车系统,复制样例代码modules/exercises/example/perception_todo_4.py。 (5) 将aistudio平台上训练并固化好的模型复制到Python文件相同的目录下,注意是freeze_model。 (6) 执行Python代码,在小车摄像头前放置一个交通标示,并在上位机观察预测结果。 4. 本地部署操作步骤 (1) 在aistudio训练模型,固化模型并下载。 (2) 本地准备好Python 3.6及以上的环境,并安装有pip。 (3) 下载并解压YOLOv3_local.zip,将下载的固化模型文件覆盖到freeze_model目录下。下载路径为https://cloud.tsinghua.edu.cn/d/a1e8b5e65116457986b1/files/?p=%2FYOLOv3_local(1).zip。 (4) 到YOLOv3_local目录下执行完成pip3 install r requirements即可。安装完成相关依赖。 (5) 执行python3 infer.py。如果无错误,则能发现打开了一个计算机摄像头采集的窗口。如果要退出,选中窗口后按Q键退出。在运行时命令行窗口将滚动输出日志。 (6) 在摄像头看到的范围内,手举打印好的标识(最好是彩色),如能正确识别,将会有框标记,并且在命令窗口中有识别结果打印。 (7) 观察识别结果,反复调整代码中过滤条件“概率score”和框大小限制。 (8) 选取一次最好的结果并截图。 5. 产出 (1) 通过AI Studio训练并固化好的模型。 (2) 看到带有交通标示牌识别框的图像。 预测效果如图517所示,可以看到有对交通标识进行预测的包围框。 图517预测效果示例 思考题 本次实验进行了视觉目标感知方面的实践。视觉传感器是使用非常广泛的一种感知形式,也更接近于人类自己的感知方式。相关的技术发展时间较长,也较为成熟。在实际场景中,视觉感知处理的问题目标以及遇到的困难往往比实验中的场景更为复杂,要求也更高。请在作业中回答以下几个问题,并阐述明晰,同时给出调查学习的来源。作答不宜太长,不超过1000字,阐述明晰即可。鼓励以图文并茂的形式呈现; 鼓励阅读资料学习他人的方法与思想。 1. 如何对图像赋予标签?赋予标签的作用是什么?样本的质量会对训练效果产生什么影响? 2. YOLOv3的原理是什么?YOLOv3的网络结构是什么样的?训练时有哪些参数,分别代表什么意思? 3. 车道线识别问题中,如何看待用传统视觉方法处理和用深度学习方法处理?各自的优缺点是什么? 4. 在自动驾驶领域,视觉目标感知方面有哪些场景可以用到深度学习?使用深度学习需要注意什么? 5. 如何对深度学习模型进行优化?数据处理、模型搭建、模型调试等各个环节都有哪些经验和方式可以考虑(选取1或2个环节说明即可)? 参考文献 [1]刘祥龙.飞桨PaddlePaddle深度学习实战[M].北京: 机械工业出版社,2020. [2]REDMON J,FARHADI A.YOLOv3: An incremental improvement[J/OL].arXiv preprint arXiv:1804.02767,2018.[20210523].https://arxiv.org/abs/1804.02767.