Método de cálculo de mAp del modelo de detección de objetivos y pasos de comparación: compare el mAp entre el modelo original y el modelo cuantificado

prefacio

1. mAP es un indicador importante para medir un modelo de detección de objetivos. Generalmente, después de completar el entrenamiento del modelo, el marco del algoritmo dará el valor de mAP de un resultado de entrenamiento. Por ejemplo, usando yolov5s entrenados por pytorch, dará el mAP del modelo .pt original, sin embargo, en el proceso de implementación y aterrizaje del proyecto, el modelo .pt a menudo no se usa como modelo final. La aceleración del razonamiento, el tamaño del modelo y la coincidencia de potencia informática del terminal móvil son En este caso, el modelo se convertirá en una biblioteca de aceleración correspondiente.Modelos, como ncnn, mnn, onnx, etc., y la cuantificación del modelo.
2. El propósito de convertir o cuantificar el modelo es mejorar la velocidad del razonamiento del modelo, pero a menudo afecta la precisión del modelo. Esto demuestra cuánta pérdida tiene la conversión y el despliegue del modelo de verificación y evaluación en mAP.

1. Análisis del proyecto MAP

1. El IDE utilizado es pycharm, que debe basarse en python-OpenCV.
2. git clone https://github.com/Cartucho/mAP.git este código fuente.
3. Hay tres directorios en la entrada del código fuente
inserte la descripción de la imagen aquí
3.1 resultados de detección: almacena los archivos de detección de objetivos detectados por el modelo.
El formato es el siguiente:
<nombre_de_clase>
<nombre_de_clase> - nombre de clase
---- confianza
- la coordenada x del punto superior izquierdo del cuadro de destino
——La coordenada y del punto inicial izquierdo del cuadro de destino
——La coordenada x del punto inferior derecho del cuadro de destino
——La coordenada x de la parte inferior derecha punto del marco de destino

tvmonitor 0.91 5 165 156 264
chair 0.83 293 218 354 317
person 0.80 415 158 465 295
chair 0.72 360 216 424 314
vase 0.61 550 300 586 399
chair 0.58 400 220 442 310
pottedplant 0.54 231 174 266 212
person 0.46 384 173 404 213
pottedplant 0.43 333 178 368 225
clock 0.41 449 121 462 142
vase 0.41 167 234 185 267
vase 0.39 242 195 252 211
book 0.32 68 61 73 100
tvmonitor 0.31 553 208 639 294

3.2 Ground-Truth: almacena el contenido del archivo de anotaciones.
El formato es el siguiente:
<nombre_de_clase>
<nombre_de_clase> — nombre de clase
— coordenada x del punto superior izquierdo del cuadro objetivo
— coordenada y del punto inicial izquierdo del cuadro objetivo
— coordenada x del punto inferior derecho del cuadro objetivo
— objetivo La coordenada x del punto inferior derecho del cuadro
es similar a los datos detectados arriba, solo falta un nivel de confianza, porque el nivel de confianza de cada uno marcado los datos son 100%.

pottedplant 237 143 262 213
tvmonitor 8 168 157 263
tvmonitor 558 210 639 288
chair 359 219 415 321
chair 291 218 353 317
chair 414 224 444 305
chair 318 220 339 231
person 413 158 466 296
person 385 173 400 208
microwave 513 206 527 222
refrigerator 494 175 514 283
book 605 306 620 352
book 614 309 627 355
clock 448 122 462 144
vase 550 310 586 400
vase 351 209 363 232
chair 413 220 422 232
vase 242 195 256 213
vase 337 200 347 217
diningtable 322 232 447 321

3.3 imágenes-opcional — almacena las imágenes a probar

2. Conversión de conjuntos de datos

1. Descargue el conjunto de datos de coco 2017, que utiliza el conjunto de datos de coco 2017 val, aproximadamente 5000 imágenes.
2. Datos Ground-Truth
Coloque el archivo de anotaciones del conjunto de datos coco en el directorio Ground-Truth. Si es el archivo json original, primero conviértalo en un archivo .txt utilizado por yolov5. El formato del archivo txt de yolov5 es de la siguiente manera: índice de etiqueta y
retorno de marco de etiqueta Cuatro coordenadas después de la normalización

58 0.389578 0.416103 0.038594 0.163146
62 0.127641 0.505153 0.233312 0.222700
62 0.934195 0.583462 0.127109 0.184812
56 0.604656 0.632547 0.087500 0.241385
56 0.502508 0.627324 0.096609 0.231174
56 0.669195 0.618991 0.047141 0.190986
56 0.512797 0.528251 0.033719 0.027207
0 0.686445 0.531960 0.082891 0.323967
0 0.612484 0.446197 0.023625 0.083897
68 0.811859 0.501725 0.023031 0.037488
72 0.786320 0.536373 0.031703 0.254249
73 0.956156 0.771702 0.022406 0.107300
73 0.968250 0.778075 0.020125 0.109014
74 0.710555 0.310000 0.021828 0.051362
75 0.886562 0.831608 0.057313 0.210493
75 0.556945 0.516702 0.017766 0.052934
56 0.651664 0.528826 0.015047 0.029390
75 0.388047 0.478415 0.022219 0.041385
75 0.533836 0.487946 0.015203 0.039272
60 0.599984 0.647148 0.196188 0.208756

inserte la descripción de la imagen aquí
3. Coloque las imágenes del conjunto de datos en el directorio de imágenes opcionales, pero algunas imágenes no tienen archivos marcados, también puede eliminar las imágenes sin marcar y eliminar los códigos de imagen sin los archivos marcados correspondientes:

# -*- coding: utf-8 -*-
import os
root_path = 'D:/code/data/val2017/'

def contrastDir(file_dir):
    jpg_list = []
    label_list = []
    for root, dirs, files in os.walk(file_dir+'images'): #图像目录
        for file in files:
            if os.path.splitext(file)[1] == '.jpg':
                jpg_list.append(os.path.splitext(file)[0])
    for root, dirs, files in os.walk(file_dir+'labels'): #标签目录
        for file in files:
            if os.path.splitext(file)[1] == '.txt':
               label_list.append(os.path.splitext(file)[0])
#对比xml与jpg
    diff = set(label_list).difference(set(jpg_list))
    print(len(diff))
    for name in diff:
        print("No corresponding image file", name + ".txt")
        os.remove(file_dir + 'labels/' + name + '.txt')
# 对比jpg与标签文件
    diff2 = set(jpg_list).difference(set(label_list))
    print(len(diff2))
    for name in diff2:
        print("No corresponding XML file", name + ".jpg")
#删除没有的对应标签的图像
        os.remove(file_dir+'images/'+ name+'.jpg')
    return jpg_list,label_list

if __name__ == '__main__':

    contrastDir(root_path)

4. Agregue el nombre de la clase de etiqueta en class_list.txt, coco 2017 tiene 80 categorías, contenido del archivo class_list.txt:

person
bicycle
car
motorbike
aeroplane
bus
train
truck
boat
trafficLight
fireHydrant
stopSign
parkingMeter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sportsBall
kite
baseballBat
baseballGlove
skateboard
surfboard
tennisRacket
bottle
wineGlass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hotDog
pizza
donut
cake
chair
sofa
pottedplant
bed
diningtable
toilet
tvmonitor
laptop
mouse
remote
keyboard
cellPhone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddyBear
hairDrier
toothbrush

5. Ejecute el archivo convert_gt_yolo.py y generará automáticamente un archivo de etiqueta que se puede usar para calcular mAP y hacer una copia de seguridad del archivo de etiqueta anterior. Directorio de verdad después de ejecutar:
inserte la descripción de la imagen aquí

3. Datos para la inferencia del modelo

Este es un ejemplo de los resultados de detección de yolov5s a onnx, la biblioteca de razonamiento utilizada es onnxruntime y el lenguaje es C++.
1. Detecte la imagen y genere un archivo txt correspondiente al nombre de la imagen

int onnxResultToTxt(std::string images_path)
{
    
    
    std::string classNamesPath = "models/coco.names";
    std::string onnx_model = "models/yolov5s.onnx";

    const float confThreshold = 0.3f;
    const float iouThreshold = 0.4f;

    const std::vector<std::string> class_names = utils::loadNames(classNamesPath);

    YoloOnnx onnx_detector{
    
     nullptr };
    onnx_detector = YoloOnnx(onnx_model, false, cv::Size(640, 640));

    std::vector<std::string> filenames;
    cv::glob(images_path, filenames, false);
    for (auto name : filenames)
    {
    
    
        //1.读取一张图像
        cv::Mat cv_src = cv::imread(name);
        if (cv_src.empty())
        {
    
    
            continue;
        }

        //2.以这张图像的名字创建一个同名的txt文件
        int len = name.rfind(".");
        std::string txt = name.substr(0, len) + ".txt";
        std::ofstream out_txt;

        //3.检测图像
        std::vector<Detection> onnx_result;
        onnx_result = onnx_detector.detect(cv_src, confThreshold, iouThreshold);

        //4.检测结果判断
        if (onnx_result.size() > 0)
        {
    
    
            //创建同名txt文件
            out_txt.open(txt);
            for (auto detection : onnx_result)
            {
    
    
                //获取检测的结果
                int tx = detection.box.tl().x;
                int ty = detection.box.tl().y;
                int bx = detection.box.br().x;
                int by = detection.box.br().y;

                int conf = (int)std::round(detection.conf * 100);
                int classId = detection.classId;
                std::string label = class_names[classId] + " 0." + std::to_string(conf);

                //把检测结果写入txt文件
                //格式:
                // <class_name> <confidence> <left> <top> <right> <bottom>
                // tvmonitor     0.471781       0     13     174     244
                out_txt << label << " " << tx << " " << ty << " " << bx << " " << by << std::endl;
            }
            //写完之后关闭txt
            out_txt.close();
            //输出txt名
            std::cout << txt << std::endl;
        }
        else
        {
    
    
            std::cout << "------------------------------------" << std::endl;
            std::cout << name << std::endl;
            std::cout << "------------------------------------" << std::endl;
        }
    }
}

2. Compruebe si el archivo de detección generado tiene el mismo formato que los resultados de detección.
3. Coloque todos los archivos .txt generados en el directorio de resultados de detección.
inserte la descripción de la imagen aquí

4. Calcular mapa

1. Después de completar todos los pasos anteriores, ejecute main.py en el proyecto python y aparecerá un directorio de salida en el directorio del proyecto.
inserte la descripción de la imagen aquí

2. Después de esperar a que se complete la operación, aparecerán los resultados calculados de cada clasificación de
inserte la descripción de la imagen aquí
mAp en el directorio de salida : los resultados de la imagen detectada:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/matt45m/article/details/125162192
Recomendado
Clasificación