一、訓(xùn)練自己的模型
yolov5訓(xùn)練好自己的模型,例如訓(xùn)練完后,名稱為best.pt,路徑為runs/exp/weights/best.pt。
采用detect.py文件驗(yàn)證best.pt可以正常檢測目標(biāo),再進(jìn)行下一步工作。
二、pt轉(zhuǎn)onnx
修改utils/yolo.py文件的后處理部分,將class Detect(nn.Module) 類的子函數(shù)forward由
def forward(self, x): z = [] # inference outputfor i in range(self.nl): x[i] = self.m[i](x[i]) # conv bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0,1,3,4,2).contiguous()ifnot self.training: # inferenceif self.grid[i].shape[2:4] != x[i].shape[2:4] or self.onnx_dynamic: self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) y = x[i].sigmoid()if self.inplace: y[...,0:2] = (y[...,0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i] # xy y[...,2:4] = (y[...,2:4] * 2) ** 2 * self.anchor_grid[i] # whelse: # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953 xy = (y[...,0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i] # xy wh = (y[...,2:4] * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, y[...,4:]), -1) z.append(y.view(bs, -1, self.no))return x if self.training else (torch.cat(z,1), x)
修改為:
def forward(self, x): z = [] # inference outputfor i in range(self.nl): x[i] = self.m[i](x[i]) # convreturn x
注意:訓(xùn)練和檢測的時(shí)候,yolo.py文件應(yīng)保持原來的樣子。
修改export.py文件
2.1修改export_onnx函數(shù)以下內(nèi)容:
(1)將opset_version=opset?修改為:opset_version=12;
(2)修改outputnames為:?output_names=['out378', 'out439', 'out500'])
(3)刪除output_names后的dynamic段落;
2.2?修改parse_opt函數(shù)以下內(nèi)容:
(1)將--data 的default修改為自己的yaml文件路徑;
(2)將--weights的default修改為自己的pt文件路徑:runs/exp/weights/best.pt。
(3)運(yùn)行export.py文件,會(huì)在pt所在文件夾下生成onnx文件。
三、onnx轉(zhuǎn)rknn
創(chuàng)建rknn虛擬環(huán)境進(jìn)行轉(zhuǎn)換。(已創(chuàng)建rknn虛擬環(huán)境,則跳至下一步)
需要的配置在rknn-toolkit2(-master)文件夾?的doc/requirements_cp38-1.4.0.txt中,按照以下步驟進(jìn)行創(chuàng)建:
(1)進(jìn)入rknn-toolkit2(-master)文件夾,右鍵打開終端,
(2)conda創(chuàng)建虛擬環(huán)境rknn:
conda create -n rknn python=3.8
(3)安裝需要的環(huán)境:
pip install -r doc/requirements_cp38-1.4.0.txt -i https://pypi.douban.com/simple
進(jìn)入rknpu2/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5文件夾。
(1)將onnx文件復(fù)制到onnx_models文件夾下。
(2)將需要檢測的圖片例如mmj.jpg放入當(dāng)前路徑。
(3)將dataset.txt內(nèi)容修改為mmj.jpg。
修改onnx2rknn.py文件:
(1)修改MODEL_PATH = './onnx_models/best.onnx'
(2)修改檢測圖片名稱im_file = './mmj.jpg'
(3)修改生成的rknn文件名稱RKNN_MODEL_PATH = './{}/best.rknn'.format(OUT_DIR,exp)
修改運(yùn)行環(huán)境為rknn虛擬環(huán)境,運(yùn)行onnx2rknn.py文件,生成的best.rknn文件在rknn_models文件夾下。
四、rknn編譯
進(jìn)入rknpu2/examples/rknn_yolov5_demo/convert_rknn_demo文件夾。
(1)將best.rknn文件復(fù)制到model/RK3588文件夾。
(2)將mmj.jpg?和?dataset.txt文件復(fù)制到model文件夾。
修改?/include/postprocess.h?文件中的?OBJ_CLASS_NUM?為自己訓(xùn)練的目標(biāo)種類個(gè)數(shù)。
修改 /mode/coco_80_labels_list.txt文件內(nèi)容為自己訓(xùn)練的種類名稱。
gcc編譯器配置(如已喔誒之,則跳至下一步5)
(1)下載gcc編譯器并解壓至自定義路徑(xxx/RK3588/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu)
(2)添加gcc編譯器環(huán)境變量:在終端輸入命令?vim /etc/profile。在文件末端添加gcc編譯器路徑/bin:
export PATH=$PATH:/home/yf01/ssd/RK3588/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin
(3):wq?保存退出。
修改build-linux_RK3588.sh文件:
(1)修改TARGET_SOC="rk3588"
(2)修改gcc編譯器路徑為gcc編譯器所在位置。
export TOOL_CHAIN=/home/yf01/ssd/RK3588/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu
運(yùn)行環(huán)境為rknn虛擬環(huán)境,運(yùn)行build-linux_RK3588.sh文件,生成install文件夾。文件夾中的rknn_yolov5_demo_Linux即為可以在RK3588開發(fā)板上運(yùn)行的文件。
五、RK3588開發(fā)板上運(yùn)行
將rknn_yolov5_demo_Linux文件夾復(fù)制到rk3588開發(fā)板上,進(jìn)入rknn_yolov5_demo_Linux文件夾。
打開終端,輸入指令:
./rknn_yolov5_demo ./model/RK3588/best.rknn ./model/mmj.jpg
運(yùn)行結(jié)果為out.jpg,即mmj.jpg的檢測結(jié)果。文章來源:http://www.zghlxwxcb.cn/news/detail-427907.html
注意:待檢測圖片尺寸應(yīng)大于訓(xùn)練圖片尺寸,否則可能報(bào)錯(cuò)。文章來源地址http://www.zghlxwxcb.cn/news/detail-427907.html
到了這里,關(guān)于yolov5訓(xùn)練自己的pt文件,轉(zhuǎn)onnx,再轉(zhuǎn)成rknn,到RK3588開發(fā)板運(yùn)行測試的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!