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

在这里插入图片描述
导出成功:
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_

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

·菜鸟看世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值