yolov12 部署又來了。
特別說明:如有侵權告知刪除,謝謝。
完整代碼:包括onnx轉rknn和測試代碼、rknn板端部署C++代碼:
【onnx轉rknn和測試代碼】
【rknn板端部署C++代碼】
1 模型訓練
??yolov12訓練官方開源的已經非常詳細了,參考官方代碼。
2 導出 yolov12 onnx
?? 導出onnx修改以下幾處。
第一處:修改導出onnx的檢測頭
# 導出 onnx 增加y = []for i in range(self.nl):t1 = self.cv2[i](x[i])t2 = self.cv3[i](x[i])y.append(t1)y.append(t2)return y
第二處:增加保存onnx代碼
print("=========== onnx =========== ")import torchdummy_input = torch.randn(1, 3, 640, 640)input_names = ["data"]output_names = ["output1", "output2", "output3", "output4", "output5", "output6"]torch.onnx.export(self.model, dummy_input, "./yolov12n_zq.onnx",verbose=False, input_names=input_names, output_names=output_names, opset_version=11)print("======================== convert onnx Finished! .... ")
修改完以上兩處,運行以下代碼:
from ultralytics import YOLO
model = YOLO(model='yolov12n.pt') # load a pretrained model (recommended for training)
results = model(task='detect', source='./test.jpg', save=True) # predict on an image
特別說明: 修改完以上兩處后運行會報錯,但不影響onnx的生成;生成onnx后強烈建議用from onnxsim import simplify 處理一下再轉rknn。
import onnx
from onnxsim import simplifymodel_path = 'yolov12n.onnx'
model_proto = onnx.load(model_path)
model_sim, check = simplify(model_proto)
onnx.save(model_sim, 'yolov12n_smi.onnx')print('simplify finished.')
3 測試onnx效果
pytorch效果
onnx效果
4 onnx轉rknn
onnx轉rknn后仿真結果
5 rk3588板子測試yolov12模型
使用的 rknn_toolkit 版本:rknn_toolkit2-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
C++代碼中的庫和工具鏈的版本注意對應適配。
1)編譯
cd examples/rknn_yolov12_demo_dfl_openbash build-linux_RK3588.sh
2)運行
cd install/rknn_yolo_demo_Linux./rknn_yolo_demo
注意:修改模型、測試圖像、保存圖像的路徑,修改文件為src下的main.cc
int main(int argc, char **argv)
{char model_path[256] = "/home/zhangqian/rknn/examples/rknn_yolov12_demo_dfl_open/model/RK3588/yolov12n_zq.r";char image_path[256] = "/home/zhangqian/rknn/examples/rknn_yolov12_demo_dfl_open/test.jpg";char save_image_path[256] = "/home/zhangqian/rknn/examples/rknn_yolov12_demo_dfl_open/test_result.jpg";detect(model_path, image_path, save_image_path);return 0;
}
3)板端效果和時耗
這個時耗非常高,查看轉rknn時的日志,很多操作切換到cpu上進行計算。