Yolov5 instancia segmentación Tensorrt despliegue combate real

0 Prefacio

Ultralytics lanzó el modelo de segmentación de instancias          en la versión 6.2 de yolov5 , que puede realizar una segmentación rápida de instancias. El efecto de usar el v5s-seg.pt oficial se muestra en la siguiente figura:

         Este blog usará esto como base para desarrollar el código de razonamiento tensorrt de la versión C++ y lo vinculará directamente: Aquí , mi entorno es:

cuda10.2 cudnn8.2.4 Tensorrt8.0.1.6 Opencv4.5.4 . . . . . . La lista de códigos es la siguiente

├── CMakeLists.txt
├── images
│   ├── bus.jpg
│   └── zidane.jpg
├── logging.h
├── main1_onnx2trt.cpp
├── main2_trt_infer.cpp
├── models
│   ├── yolov5s-seg.engine
│   └── yolov5s-seg.onnx
├── output.jpg
├── README.md
└── utils.h

1. Generar modelo onnx

        Primero, clonamos la última versión del código, es decir, la versión 6.2, y descargamos el modelo pt correspondiente, aquí tomamos yolov5s-seg.pt como ejemplo para la siguiente descripción.

git clone [email protected]:ultralytics/yolov5.git#官方代码
git clone [email protected]:fish-kong/Yolov5-instance-seg-tensorrt.git#我的tensort推理c++代码

        El código oficial export.py de yolov5-6.2 proporciona un método para generar directamente un motor, pero no recomiendo usarlo directamente porque el motor generado está relacionado con el entorno de la computadora. Después de cambiar el entorno, el motor generado por la computadora antes será No se puede usar, a menos que el entorno de las dos computadoras sea exactamente el mismo, por lo que solo generamos el modelo onnx, el comando es el siguiente

python export.py --data coco128-seg.yaml --weights yolov5s-seg.pt --cfg yolov5s-seg.yaml --include onnx

Se generará el nombre yolov5s-seg.onnx, después de abrirlo con Netron , podemos ver que la entrada es 1x3x640x640, la salida output0 es 1x25200x117 y la salida output1 es 1x32x160x160, estos tamaños son muy importantes para el razonamiento posterior y todos deben escribirse en los parámetros del código de razonamiento de C++ en formato .

 2. Generar modelo de motor

1. Primero ubique el directorio repo de su clon, que es el directorio Yolov5-instance-seg-tensorrt
2. Copie yolov5s-seg.onnx a models/

3. Ejecute el siguiente código para generar archivos ejecutables para conversión e inferencia -->onnx2trt trt_infer

mkdir build
cd build
cmake ..
make  

4. Conversión de modelo

sudo ./onnx2trt ../models/yolov5s-seg.onnx ../models/yolov5s-seg.engine

        A través de las operaciones anteriores, podemos obtener yolov5s-seg.engine (siempre que estén instalados cuda, cudnn, tensorrt, opencv y se recomiende mi versión)

3. Razonamiento

A través de 2 operaciones, el archivo ejecutable trt_infer realmente se ha generado y solo necesita ejecutarse

sudo ./trt_infer ../models/yolov5s-seg.onnx ../images/bus.jpg
for (int i = 0; i < 10; i++) {//计算10次的推理速度
    auto start = std::chrono::system_clock::now();
    doInference(*context, data, prob, prob1, 1);
    auto end = std::chrono::system_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl;
}

El código anterior en main2_trt_infer.cpp infiere 10 veces y muestra la hora. En mi 1080ti, básicamente mantiene un marco de 10 ms, que es bastante rápido.

El resultado final es el siguiente: en comparación con la imagen al principio del artículo (este es el resultado del código oficial usando directamente el razonamiento pt), se puede ver que es básicamente lo mismo.

4. Referencia

1. Tensorrtx de wangxinyu

2. El razonamiento opencv del jefe UNeedCryDear

3. 2022.09.29 Actualice c++ y use opencv para implementar los modelos de segmentación de instancias yolov5 y yolov7 (6)

El código completo se ha subido y puede usarlo directamente mediante la clonación. Los comentarios son bienvenidos en el área de comentarios. Si lo encuentra útil, preste atención a mi repositorio de github, gracias.

Supongo que te gusta

Origin blog.csdn.net/qq_41043389/article/details/127754384
Recomendado
Clasificación