當前位置: 妍妍網 > 碼農

OpenVINO與TensorRT部署YOLOv10物件檢測

2024-05-27碼農

點選上方 藍字 關註我們

微信公眾號: OpenCV學堂

關註獲取更多電腦視覺與深度學習知識

模型匯出與輸入輸出

YOLOv10模型匯出ONNX指令碼如下:

from ultralytics import YOLOv10"""Test exporting the YOLO model to ONNX format."""f = YOLOv10("yolov10n.pt").export(format="onnx", opset=11, dynamic=False)

如果不指明opset=11或者12,預設opset=10匯出的模型推理時候會非常的慢。指定opset=11以後,匯出的模型結構如下:

輸入與輸出格式解釋如下:

輸入支持格式為:1x3x640x640輸出格式為1x300x6

輸出格式300是指輸出得預測框數目,6分別是

x1 y1 x2 y2 score classid

C++推理

OpenVINO2023 C++ 推理 ,發現一個很大的BUG,就是當使用AUTO模式的時候:

ov::CompiledModel compiled_model = ie.compile_model("D:/python/yolov10-1.0/yolov10n.onnx", "AUTO");auto infer_request = compiled_model.create_infer_request();

模型推理針對視訊推理會發生結果紊亂現象,圖示如下:

但是當我把推理裝置設定為CPU時候就會非常穩定的執行。說明OpenVINO虛擬推理裝置AUTO對YOLOv10支持度還有待提升。

把ONNX格式模型透過下面的命令列轉換為engine檔

trtexec.exe -onnx=yolov10n.onnx --saveEngine=yolov10n.engine

TensorRT8.6 C++ 推理演示 , 本人筆記本 顯卡為3050ti

C++推理的相關程式碼如下:

int64 start = cv::getTickCount();
// 圖像預處理 - 格式化操作
int w = frame.cols;
int h = frame.rows;
int _max = std::max(h, w);
cv::Mat image = cv::Mat::zeros(cv::Size(_max, _max), CV_8UC3);
cv::Rect roi(00, w, h);
frame.copyTo(image(roi));
// HWC => CHW
float x_factor = image.cols / static_cast<float>(input_w);
float y_factor = image.rows / static_cast<float>(input_h);
cv::Mat tensor = cv::dnn::blobFromImage(image, 1.0f / 225.f, cv::Size(input_w, input_h), cv::Scalar(), true);
// 記憶體到GPU視訊記憶體
cudaMemcpyAsync(buffers[0], tensor.ptr<float>(), input_h * input_w * 3 * sizeof(float), cudaMemcpyHostToDevice, stream);
// 推理
context->enqueueV2(buffers, stream, nullptr);
// GPU視訊記憶體到記憶體
cudaMemcpyAsync(prob.data(), buffers[1], output_h *output_w * sizeof(float), cudaMemcpyDeviceToHost, stream);
// 後處理
cv::Mat det_output(output_h, output_w, CV_32F, (float*)prob.data());
for (int i = 0; i < det_output.rows; i++) {
float tl_x = det_output.at<float>(i, 0) * x_factor;
float tl_y = det_output.at<float>(i, 1) * y_factor;
float br_x = det_output.at<float>(i, 2)* x_factor;
float br_y = det_output.at<float>(i, 3)* y_factor;
float score = det_output.at<float>(i, 4);
int class_id = static_cast<int>(det_output.at<float>(i, 5));
if (score > 0.25) {
cv::Rect box((int)tl_x, (int)tl_y, (int)(br_x - tl_x)(int)(br_y - tl_y));
rectangle(frame, box, cv::Scalar(00255), 280);
putText(frame, cv::format("%s %.2f", classNames[ class_id], score), cv::Point(box.tl().x, box.tl().y-5), fontface, fontScale, cv::Scalar(2550255), thickness, 8);
}
}
float t = (cv::getTickCount() - start) / static_cast<float>(cv::getTickFrequency());
putText(frame, cv::format("FPS: %.2f"1.0 / t), cv::Point(2040), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(25500), 28);
cv::imshow("YOLOv10物件檢測 + TensorRT8.6", frame);






對比YOLOv5跟YOLOv8同等的模型,速度還是非常快。唯一不是很滿意的就是感覺對小目標檢測能力好像沒有YOLOv5跟YOLOv8那麽厲害,只是個人感覺。

掌握深度學習模型部署

掌握三種主流的深度學習模型部署框架,實作模型在CPU、GPU、AMD等不同平台硬體上加速推理最佳效能。 OpenCV學堂已經推出 OpenVINO、TensorRT、ONNXRUNTIME深度學習部署系統化學習路線圖 「工欲善其事,必先利其器」 ,做深度學習工程師,學完部署再打工,一切都來得及,現在開始剛剛好!

深度學習模型部署路線圖視訊課程

推薦閱讀