jetson nano上使用jetson-inference进行机器学习和深度神经网络分类训练
jetson nano开发板上进行一个简单的分类训练
1、jetson-推理库的下载编译以及简单使用
此处请参考:
Github:https://github.com/dusty-nv/jetson-inference
Gitee:https://gitee.com/jinwei_1/jetson-inference#https://www.youtube.com/watch?v=QXIwdsyK7Rw&list=PL5B692fm6–uQRRDTPsJDp4o0xbzkoyf8&index=9
说明比较详细具体,建议跟着链接将流程走一遍。
2、jetson nano上实现迁移学习训练
(1)为jetson nano创建交换空间以转移训练
sudo fallocate -l 4G /mnt/4GB.swap
sudo mkswap /mnt/4GB.swap
sudo swapon /mnt/4GB.swap
sudo gedit /etc/fstab
在最后添加一行
/mnt/4GB.swap none swap sw 0 0
(2)创建文件及标签
cd jetson-inference
#创建存放数据集和标签的目录
mkdir Train/myTrain
#在myTrain目录下创建训练标签文件:
gedit labels.txt
labels.txt文件存放我们需要分类的标签字符,这里我要做一个分类训练
:主要分六个类:ArduinoNano
ArduinoUno
JetsonNano
JetsonXavierNX
RaspberryPiThree
RaspberryPiZero
以训练区分六种开发板
所以我的labels.txt文件内容如下:
保存labels.txt文件后
(3)数据集的采集
开始进入目录,开启相机捕获工具进行数据集采集
cd /jetson-inference/tools
#启动相机捕获工具
camera-capture --width=800 --height=600 --camera=/dev/video0
打开相机捕获程序后,此时在我们创建的myTrain目录中会自动创建出现 test、train、val,分别存放测试集、训练集、验证集。
右上角的捕获控制面板是方便我们使用摄像头采集数据的选项:
其中Dataset Type数据设置类型有两个选项:分类和检测,依据我们要做的训练选择,这里我们做一个六种类别的分类,所以选择分类—>calssification
Dataset Path :数据路径是我们刚才创建存放数据标签的包文件(按照自己的实际情况),我的是目录:/jetson-inference/Tain/myTrain
Class Labels :分类标签,是我们创建的labels.txt文件,我得目录是:/jetson-inference/Tain/myTrain/labels.txt
Current Set:训练类别选择,是我们三种数据集采集的类别,下拉框有三个选项:train、test、val ---->训练、测试、验证
Current Class:当前类别,我们不是做六种开发板的分类训练么,所以下拉框有六种选项:
ArduinoUno
JetsonNano
JetsonXavierNX
RaspberryPiThree
RaspberryPiZero
填完后如下:
此时我们选定一种训练类别和一种标签进行相机图片采集:
采集图片时尽量使用比较单一的背景色,从不同角度,按下空格键space即可拍照采集,采集大约100张train训练集图片、20张val验证集、5张test集(这里三种样本依据自己情况,此处做个小训练,进度还可以,数据集采集没那么大);然后换类别分别进行
ArduinoNano
ArduinoUno
JetsonXavierNX
RaspberryPiThree
RaspberryPiZero
的采集
(4)开始进行迁移训练
数据采集完成后,开始进行迁移训练:
训练模型:
#进入训练分类目录:
cd jetson-inference/python/training/classification
#运行后会在classification中创建myModel文件夹,并在此文件夹下产生训练模型数据。
python3 train.py --model-dir=myModel ~/jetson-inference/Train/myTrain
这里对第二个命令行解释一下:
--model-dir=myModel
在当前classification目录下产生模型文件并命名myModel
~/jetson-inference/Trains/myTrain
是我们数据集的路径
训练大约10分钟左右,训练对jetson nano性能是一次压榨,可能会出现内存不足的warning,这就需要我们一开始进行交换空间的操作。
(5)导出训练成功的模型
训练后导出模型到myModel目录下
cd jetson-inference/python/training/classification
python3 onnx_export.py --model-dir=myModel
导出成功:
此时目录下有了我们的模型文件:
3、测试训练结果
python中引入自己训练的模型关键代码。添加自己训练的模型,预训练后面加数组,添加自己的模型标签
net=jetson.inference.imageNet('alexnet',['--model=/home/nano/jetson-inference/python/training/classification/myModel/resnet18.onnx','--input_blob=input_0','--output_blob=output_0','--labels=/home/nano/jetson-inference/myTrain/labels.txt'])
import jetson.inference
import jetson.utils
import cv2
import numpy as np
import time
width=1280
height=720
dispW=width
dispH=height
flip=2
#以下是使用nano板载摄像头
#camSet='nvarguscamerasrc ! video/x-raw(memory:NVMM), width=3264, height=2464, format=NV12, framerate=21/1 ! nvvidconv flip-method='+str(flip)+' ! video/x-raw, width='+str(dispW)+', height='+str(dispH)+', format=BGRx ! videoconvert ! video/x-raw, format=BGR ! videobalance contrast=1.5 brightness=-.3 saturation=1.2 ! appsink '
#cam1=cv2.VideoCapture(camSet)
#此处我们使用的usb摄像头
cam1=cv2.VideoCapture('/dev/video0')
#cam1.set(cv2.CAP_PROP_FRAME_WIDTH,dispW)
#cam1.set(cv2.CAP_PROP_FRAME_HEIGHT,dispH)
#添加自己训练的模型,预训练后面加数组,添加自己的模型标签!!
net=jetson.inference.imageNet('alexnet',['--model=/home/nano/jetson-inference/python/training/classification/myModel/resnet18.onnx','--input_blob=input_0','--output_blob=output_0','--labels=/home/nano/jetson-inference/myTrain/labels.txt'])
#字体设置
font=cv2.FONT_HERSHEY_SIMPLEX
timeMark=time.time()
fpsFilter=0
#以下是opencv处理
while True:
_,frame=cam1.read()
img=cv2.cvtColor(frame,cv2.COLOR_BGR2RGBA).astype(np.float32)
img=jetson.utils.cudaFromNumpy(img)
classID, confidence =net.Classify(img, width, height)
item=''
item =net.GetClassDesc(classID)
dt=time.time()-timeMark
fps=1/dt
fpsFilter=.95*fpsFilter +.05*fps
timeMark=time.time()
cv2.putText(frame,str(round(fpsFilter,1))+' fps '+item,(0,30),font,1,(0,0,255),2)
cv2.imshow('recCam',frame)
cv2.moveWindow('recCam',0,0)
if cv2.waitKey(1)==ord('q'):
break
cam.releast()
cv2.destroyAllWindows()
到这里我们就可以成功识别我们的jetson nano ,哎,就是玩!
哈哈,如果你也和我一样,对技术热爱,请关注我,一起探寻技术奥秘。
管他什么真理无穷,进一步有进一步的欢喜!
jetson nano视频学习油管链接:https://www.youtube.com/playlist?list=PLGs0VKk2DiYxP-ElZ7-QXIERFFPkOuP4_