你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
作者 |
郭俊廷 |
难度 |
普通 |
一、前言
前篇介绍了机器学习与深度学习的相关基础知识,并且介绍了如何搜集数据。
后篇我们来介绍如何将搜集好的数据训练成模型文件,并且实际应用到JetBot小车上,让JetBot可以判断前方有无障碍物,该前进还是转弯呢。
注意:
如果你是接续前一个项目继续执行此项目,执行完前一个档案的功能之后记得关闭kernel和使用窗口,才不会发生摄影机被占用等错误讯息。(相关教学请参考在Jetson nano 上执行JetBot项目Part2 移动篇之说明)
二、Train Model 训练模型
点选左边的路径"Home > Notebooks >collision_avoidance > train_model.ipynb",就能打开以下的JupyterLab的Collision Avoidance - Train Model画面。
这里是负责把之前搜集到的数据集训练成模型文件的程序。
以下是Train Model 训练模型流程图
首先执行第1个区块,JetBot使用深度学习库PyTorch来训练模型并且使用了多种PyTorch函式库来训练模型。
第2个区块是解压缩dataset.zip文件,这是给已经搜集完数据想更换搜集数据集的人使用的指令,如果Data Collection程序已搜集完数据并有dataset文件夹者不用执行这一区块,如果有想要更改数据集的人可以根据刚刚更改压缩的档名来解压缩该档案。
更改以下指令dataset.zip档名来更改要解压缩的文件名。
!unzip -q dataset.zip -y
第4个区块创建dataset的实例,把dataset文件夹里面搜集的数据使用torchvision.datasets数据包跟torchvision.transforms数据包来分类跟转换数据。
第5个区块将数据集拆分为训练集和验证集
第6个区块将会设定训练集和验证集的参数
第7个区块将会定义我们的神经网络,并且设定使用alexnet模型,初次使用会下载alexnet模型,这里执行的时间会根据网络的速度而异,请耐心等候,并区块前面显示*号。
下载完之后显示画面如下图。
第8个区块是将alexnet模型原本1000个类别卷标的数据集训练的转换成2个输出。
第9个区块是将转移模型在GPU上执行。
第10个区块即开始将数据集训练成模型文件,默认训练30回合,根据建议各类别100张左右的照片训练时间大约为十分钟。训练完成会产生一个best_model.pth的模型文件(如下图左边红框所示)
可以更改以下指令数字更改训练回合数。
NUM_EPOCHS = 30
更改以下指令best_model.pth档名可以将训练的档案储存为不同档名。
BEST_MODEL_PATH = 'best_model.pth'
三、Live Demo应用范例
点选左边的路径"Home > Notebooks >collision_avoidance > live_demo.ipynb",就能打开以下的JupyterLab的Collision Avoidance - Live Demo画面。
这里将会将看到的画面根据是free或是blocked做出相对应的动作,这里需要有相对应的模型文件才可以执行该档案。
注意这里执行场地的背景跟灯光请跟训练时的状况一样,否则执行辨识的效果会不好。
Live Demo应用范例执行步骤流程图
首先执行第1个区块宣告使用PyTorch函式库设定模型参数
第2个区块使用模型文件best_model.pth为模型,如果之前有储存模型文件文件名为别的档名一样在这个部分更改为自己的模型文件名。(如下图的红框所示)
model.load_state_dict(torch.load('best_model.pth'))
第3个区块是把模型权重从CPU内存转移到GPU上执行。
第4个区块是定义影像预处理方法
从BGR转换为RGB模式
从HWC布局转换为CHW布局
使用与训练期间相同的参数进行标准化(我们的摄像机提供[0,255]范围内的值,并在[0,1]范围内训练加载的图像,因此我们需要缩放255.0
将数据从CPU内存传输到GPU内存
批量添加维度
第5个区块创建一个摄影机画面,大小是224*224,并且创建一个滑杆可以显示摄影机目前看到的画面是blocked的机率为多少(机率由0.00至1.00)。
第6个区块,定义马达参数,这里使用之前文章讲解过的DFrobot马达驱动板的马达参数。
robot = Robot(driver_board="dfrobot")
第7个区块,这里会开始JetBot会开始移动请注意不要将JetBot放在桌上或是容易摔落撞到的地方。
根据下列程序代码,会执行以下动作当判断blocked的机率小于0.5的时候就以40%的速度前进,当判断blocked的机率大于0.5就以40%的速度左转。可以根据自己的使用情境更改下面的机率跟速度的数值。
if prob_blocked < 0.5:
robot.forward(0.4)
else:
robot.left(0.4)
time.sleep(0.001)
第8个区块这里会更新摄影机画面传回去给程序判断,如果没有执行这一步骤,摄影机的画面将一直是没有同步的状态,执行完这个区块可以回到第5个区块查看JetBot避障效果如何。
当看到绿布的画面blocked的机率为0.07远小0.5,所以是free的状态车子会直走。
当看到三角锥的画面blocked的机率为1.00远大0.5,所以是blocked的状态车子会向左转。
第9个区块,这里会停止同步画面传送,blocked的机率判断会停止执行,JetBot也会停止。
第10个区块、第11个区块这里可以设定是否要将摄影机画面链接到JupyterLab同步显示,第10个区块是中断连结,第11个区块是继续连结。
车子避障实际影片:
以上避障篇后篇-训练模型、应用范例的讲解到这边告一段落,各位有没有成功让车子避开障碍物呢?接着我们会继续介绍更多JetBot相关的范例,有兴趣的欢迎继续关注我们。