Экспорт модели, ввод и вывод
Скрипт экспорта ONNX модели YOLOv10 выглядит следующим образом:
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
рассуждения на С++
Вывод OpenVINO2023 C++,Нашёл большую ОШИБКУ,То есть при использовании режима АВТО:
ov::CompiledModel compiled_model = ie.compile_model("D:/python/yolov10-1.0/yolov10n.onnx", "AUTO");
auto infer_request = compiled_model.create_infer_request();
Модельное рассуждение приведет к неупорядоченным результатам видеорассуждения, как показано ниже:
Но когда я настраиваю устройство вывода на процессор, оно работает очень стабильно. Это показывает, что поддержка виртуального устройства вывода OpenVINO AUTO для YOLOv10 нуждается в улучшении.
Преобразуйте модель формата ONNX в файл ядра с помощью следующей командной строки
trtexec.exe -onnx=yolov10n.onnx --saveEngine=yolov10n.engine
TensorRT8.6 C++ Демонстрация рассуждений , личный блокнот Видеокарта 3050ti.
рассуждения на Соответствующий код для С++ выглядит следующим образом:
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(0, 0, 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);
// Память в память графического процессора
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(0, 0, 255), 2, 8, 0);
putText(frame, cv::format("%s %.2f",classNames[class_id], score), cv::Point(box.tl().x, box.tl().y-5), fontface, fontScale, cv::Scalar(255, 0, 255), thickness, 8);
}
}
float t = (cv::getTickCount() - start) / static_cast<float>(cv::getTickFrequency());
putText(frame, cv::format("FPS: %.2f", 1.0 / t), cv::Point(20, 40), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 0, 0), 2, 8);
cv::imshow("YOLOv10objectDetection + TensorRT8.6", frame);
Сравнивая эквивалентные модели YOLOv5 и YOLOv8, скорость по-прежнему очень высокая. Единственное, что меня не очень устраивает, это то, что способность обнаружения небольших целей не так хороша, как у YOLOv5 и YOLOv8. Это всего лишь личное ощущение.
Освоить развертывание модели глубокого обучения
Освойте три основных направления глубоко Платформа обучения Модельразвертывания позволяет модели максимально ускорить процесс распределения на аппаратном обеспечении различных платформ, таких как ЦП, графический процессор и AMD. Академия OpenCVУже запущенДорожная карта систематического обучения по развертыванию глубокого обучения OpenVINO, TensorRT, ONNXRUNTIME。«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты».,Быть инженером глубокого обучения,После изучения развернуть, потом работать,Все приходит вовремя,Это хорошее время, чтобы начать!