為了把yolov5在rk3588上跑起來,在網上搜羅了一圈,踩了一些坑。由于瑞芯微的文檔有升級,導致和網絡的文章有出入,所以做個記錄。
rknn-toolkit 轉換文檔:
瑞芯微的轉換文檔在 rknn-toolkit/example/pytorch/yolov5/REAME.md 里
當版本升級到 1.7.5的時候,文檔被刪除,說是要根據airockchip/rknn_model_zoo (github.com) 里的指令來完成。但是model_zoo里的文檔也是沒有說太清楚。
把rknn-toolkit版本退回到,在 1.7.3 版本中還是有的。下面就是按照1.7.3的說明來操作。
yolov-v50 的環境:
官方文檔指定使用yolov5 v5.0,因此需要獲取特定的版本。
需要安裝 pytorch 1.10.0 以下版本,否則會報錯:
AttributeError: ‘Upsample’ object has no attribute ‘recompute_scale_factor’
但是在python 3.10 版本下沒有 pytorch 1.9.1 了,所以要裝python 3.8的環境:
conda create -n YOLOV5-V50 python==3.8
然后把requirement.txt 中的torch 改成 torch<1.10.0
pip3 install -r requirements.txt -i?https://pypi.tuna.tsinghua.edu.cn/simpleSimple Indexhttps://pypi.tuna.tsinghua.edu.cn/simple
權重文件:
在執行 python detect.py 默認下載的是最新版本的權重文件,我們需要v5.0的權重文件,所以需要手動下載
wget https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt
檢測:
默認使用coco數據集,yolov5s.pt
python detect.py
修改模型,導出
重點是RKNN把最終的sigmoid從模型內部給拿到外部,把sigmoid交給cpu去計算了。具體的參見 rknn-toolkit/example/pytorch/yolov5/REAME.md
3. 直接使用pt模型轉為rknn模型時,需要修改 yolov5/models/yolo.py文件的后處理部分,將class Detect(nn.Module) 類的子函數forward修改為:
def forward(self, x):
? ? ? z = [] # inference output
? ? ? for i in range(self.nl):
? ? ? ? ? ?x[i] = self.m[i](x[i]) # conv
? ? ? return x ```
導出:
python export.py --weights yolov5s.pt --img 640 --batch 1 --include onnx
測試和轉換
測試:
測試的時候生成的rknn文件是用于3566的,不知道怎么給弄成3588的,所以測試只能測試
然后把這個.onnx 文件放到
rknn-toolkit2/examples/onnx/yolov5/
修改 test.py,轉換為rknn模型,并查看 result.jpg是不是正確
轉換為3588的:
轉換的腳本不在rknn-toolkit2下,而在 rknpu2/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5 下,修改
platform = 'rk3588' 和 model path,然后運行腳本可以得到rknn
用這個rknn替換掉板子上的文件,可以運行,識別率似乎下降了一點,發現推理時間從20多ms變為30ms左右。
在測試的時候,發現官方提供的onnx是81層,而我們轉化出來的是96層,可能延時時間長跟這個有關系。