前面的所有内容与实验,全部都是关于“推理识别(inference)”的部分,主要是为了让用户先体会到“最终结果”,包括需要花费的精力、以及最后得到的效率。由于项目提供非常多的预训练模型文件,因此我们可以很轻松地调用这些资源,去进行推理计算,并且得到相当惊人的性能。
然而,真正要完成一个深度学习的项目,还是必须完成前面阶段的模型训练部分,本文的重点就是带着大家,利用Hello AI World所提供的资源,开始进行简单的图像分类应用的模型训练。
所有深度学习的模型训练,都必须具备以下的几个元素,缺一不可:
事实上数据集的质量,直接关系到训练出来的模型质量,就如同做菜一样,如果食材不够好,再厉害的厨师也没办法做出真正的好菜。
数据集的来源主要有三个:
这个部分是深度学习的精髓,目前在几个主流神经网络模型之间,很难去评孰优孰劣,就像大餐厅的名厨一样,各有侧重点与风格。在这里,为了要能在Jetson设备上进行训练,因此我们挑选ResNet-18这个网络。
这个就是作为深度学习的模型训练与推理识别的重要工具,目前最主流的应该是Tensorflow,不过这里为了配合迁移学习(transfer learning)的特性,因此选择用pytorch这个轻量级的框架工具
事实上训练用的设备,会直接影响到网络模型与框架工具的选择。这里我们使用NVIDIA Jetson系列设备进行训练,就必须选择轻量级的网络模型与框架工具。
现在就开始我们的图像分类模型训练实验,在开始实验之前,还是有以下几个准备动作需要确认:
1 2 |
|
1 2 3 4 |
将“/mnt/4GB.swap none swap sw 0 0”加入 /etc/fstab 文件后重启 |
1 2 3 4 |
|
接下来就正式进入模型训练的环节,项目作者已经为我们提供基于pytorch的图像分类的Python训练代码,为了便于操作,先将工作目录移到代码的位置:
1 |
|
里面的train.py与onnx_export.py是这个训练过程会用到的两只程序,至于代码内容则不作说明。
接下去的任务就是获取数据集。项目作者提供了两个现成的数据集“cat_dog”与“PlantCLEF_Subset”,除了数据集本身的内容(含类别)不一样之外,其余操作过程是完全一样的,因此这里我们只演示“cat_dog”这个数据集的完整过程,将“PlantCLEF_Subset”的实验留给读者去比照办理。
为了保持指令参数的一致性,建议将数据下载到data目录下,并且将生成的模型文件制定到models路径,现在就开始执行完整的步骤:
1
2
3
4
5 |
# 下载并解压缩 cat_dog.tar.gz(758MB)
# 下载并解压缩 PlantCLEF_Subset.tar.gz(1.34GB)
|
检查看看cat_dog与PlantCLEF_Subset下面,是否都存在<test>、<train>、<val>三个目录以及一个labels.txt文件?
在cat_dog下面的test、train、val目录下,应该都有cat与dog子目录,这个子目录名称会与labels.txt内容对应上。根据这样的原则,请检视一下PlantCLEF_Subset数据集,是否也具备相同的特性?这里应该有20种植物名称分类。
接下去回到train.py与onnx_export.py工作目录下,准备开始执行模型训练任务:
1 2 |
|
由于训练程序使用了迁移学习的技巧,因此在第一次开始训练之前,会先下载合适的预训练模型,然后让这些数据在这个模型基础上进行叠加训练,一方面提高精准度,另一方面也会减少训练时间,这就是“迁移学习”的迷人之处。
系统预设使用resnet-18这个网络,这是比较适合Jetson Nano(含2GB)的轻量级模型,我们也可以使用 --arch= 去指定使用其他网络模型。如果这时候打开jetson-stats监控工具,可以看到GPU持续处于满载状态。
这个cat_dog数据集共有6200张图片,其中训练集5,000张、验证集1,000张、测试集200张,系统预设的epoch数为35,可使用--epoch=去改变epoch数。epoch数量设为多少比较合适?这个没有一定的答案,我们需要观察训练过程中Loss值的变化。
如此的数据量在Jetson Nano 2GB上的训练时间,总共花了285分钟(4小时45分钟)
现在训练完成之后,下一步就是要把这个训练的模型,使用onnx_import.py将pytorch模型文件转换成ONNX格式,以便在后面使用时很轻松地转换成TensorRT加速引擎。
1 |
|
会在models/cat_dog目录下生成“resnet18.onnx”文件,最后以这个文件为基础,调用前面所熟悉的imagenet图像分类指令,来进行推理计算任务,请执行以下代码:
1 2 3 |
--model=$NET/resnet18.onnx --labels=$DATASET/labels.txt \ #模型的文件 --input_blob=input_0 --output_blob=output_0 |
现在使用自己训练的模型来执行imagenet.py,因此需要个别给定--model、--labels的路径,以及--input_blob、--output_blob的内容,其他部分与前面讲解过的用法是一致的,可以用视频、摄像头、文件夹作为输入源,检测一下识别的效果如何?
请自行尝试PlantCLEF_Subset这个关于植物类别的数据集,按照上面完全一样的做法,自行走过一遍,这会让你更加熟悉与掌握整个“图像分类”的应用,从数据集收集、模型训练,到推理识别这三个阶段。
最后,如果您需要建立自己专属的数据集的话,这个Hello AI World项目还提供一个camera-capture这个现场抓图的工具,开启之后会出现一个控制面板(如下图左),可选择Classification或Detection功能,同时还会启动一个摄像头画面市场(如下图右),可以自行调整所需要的的分类与指定路径。
收集完足够的图像数据之后,再按照前面的步骤进行模型训练,就能建立自己专属的模型文件,给自己的Jetson设备进行图像分类的推理识别应用。
好文章,需要你的鼓励
临近年底,苹果公布了2024年App Store热门应用和游戏榜单,Temu再次成为美国下载量最多的免费应用。
云基础设施市场现在已经非常庞大,很难再有大的变化。但是,因为人们可以轻松地关闭服务器、存储和网络——就像开启它们那样,预测全球云基础设施开支可能非常困难。