mmdetection combate real, entrenamiento de conjuntos de datos de naipes (formato VOC) y prueba y cálculo de mAP

1. Preparación del conjunto de datos

El conjunto de datos que utilicé esta vez proviene de aquí: el conjunto de datos de póquer , descargue el archivo zip completo y cópielo. Puntos clave: Sin embargo , no te recomiendo que descargues directamente de él. No me digas, encontré un problema más tarde, es decir, aparecería el siguiente mensaje de error:

FileNotFoundError: el archivo img no existe: /home/ymz/lsm/mmdetection/data/VOCdevkit/VOC2007/JPEGImages/IMG_2608.jpg

Más tarde, descubrí que IMG_2608.JPG está en el conjunto de datos. La única diferencia es que el formato del archivo está en mayúsculas. Más tarde, confirmé que mmcv.imreadno puedo leer .JPG en mayúsculas, así que puse el enlace al conjunto de datos después de todos los formatos de archivo en minúsculas aquí Extraiga el código: El conjunto de
datos vmsy no recopila todos los tipos de naipes, solo hay 6 tipos: nueve, diez, jota, reina, rey, as. Hay un total de 364, por lo que el entrenamiento no tardará mucho después, básicamente se terminan 20 épocas en media hora. El directorio de archivos después de la descompresión se ve así:

├── poker
│   ├── VOC2007
│   │   ├── Annotations
│   │   ├── JPEGImages
│   │   ├── ImageSets
│   │   │   ├── Main
│   │   │   │   ├── val.txt
│   │   │   │   ├── train.txt

En segundo lugar, la instalación de mmdetection

mmdetection es un marco de detección de objetivos basado en pytorch. Es muy fácil de usar y admite una gama completa de modelos. Actualmente hay 8k estrellas en Github, y las confirmaciones también son muy activas. Esta vez quería familiarizarme con cómo usar este marco, así que lo ejecuté con el conjunto de datos que encontré.
Básicamente, siga las instrucciones del sitio web oficial para la instalación, pero parece que a menudo hay algunos pequeños cambios recientemente . También puede ver este https://mmdetection.readthedocs.io/en/latest/ arriba. Colocaré todos los comandos integrados aquí (es mejor ir al sitio web oficial para ver la actualización a tiempo):
la versión del código que uso, porque la última versión del código actualiza algunos archivos de evaluación

# 注意官方的Requirements
conda create -n open-mmlab python=3.7 -y
conda activate open-mmlab
# 安装pytorch和torchvision自己来也行
conda install -c pytorch pytorch torchvision -y
# cython一定要安装,编译需要
conda install cython -y
git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
# 若自己离线安装pytorch和torchvision,可注释requirements.txt对应行
# 还有也可以把pycocotools那行注释了,官方建议通过下面那句安装
pip install -r requirements.txt
pip install "git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI"
pip install -v -e .
# 官方建议创建软连接,节省硬盘空间,在mmdetection目录下运行下面的命令
mkdir data
ln -s $COCO_ROOT data

Por supuesto, aquí está nuestro propio conjunto de datos en formato VOC. El último enlace flexible no puede ser la última línea anterior. De acuerdo con la estructura de directorio del conjunto de datos anterior, debería ser:

mkdir data
cd data
ln -s /home/你的存放路径/poker VOCdevkit

Esto está en consonancia con la estructura de recomendación oficial.

Tres, modificar documentos relevantes

1. Modifique el archivo class_names.py

Modifique voc_classes en class_names.py en mmdetection / mmdet / core / Evaluation y cámbielo al nombre de categoría del conjunto de datos a entrenar, de lo contrario, el nombre del resultado de la prueba será aeroplano, bicicleta, pájaro, barco, ... estas. Después de la modificación, como se muestra en la figura:
Modificar el archivo class_names.py

2. Modifique el archivo voc.py

Modifique la categoría en mmdetection / mmdet / datasets / voc.py. Si solo hay una categoría, porque CLASSES es una tupla, agregue una coma; de lo contrario, se informará un error.
Modificar el archivo voc.py

3. Modifique el archivo de configuración

El archivo de configuración es el nombre del siguiente grupo de archivos mmdetection / configs, como cascade_rcnn_r50_fpn_1x.py, porque estamos usando el formato VOC, estos son el formato COCO por defecto (excepto los pocos bajo la carpeta mmdetection / configs / pascal_voc) , así que elegí cascade_rcnn_r50_fpn_1x.py , lo copie y renombre cascade_rcnn_r50_fpn_1x_poker.py , hay varios lugares en los que necesita modificar lo siguiente:
1. modificar la variable num_classes , es el fondo para agregar al número de clasificación de la clase, así que estamos aquí para 7 :
Modificar la variable num_classes
2, modificar la configuración de datos Parte , principalmente los valores de las variables dataset_type, data_root, img_scale, ann_file y img_prefix: la configuraciónModificar la sección de configuración de datos
Inserte la descripción de la imagen aquí
final del tiempo de ejecución también se puede modificar, como total_epochs y workflow [[('train', 1)] significa solo entrenamiento, sin verificación; [('entrenar', 2), ('val', 1)] significa entrenamiento de 2 épocas, 1 verificación de época], configuré total_epochs en 20, por lo que la tasa de aprendizaje se establece en step = [ 8, 15], checkpoint_config = dict (intervalo = 2), mantenga el valor predeterminado para todo lo demás.

Cuarto, empieza a entrenar

Ahora puede comenzar a entrenar, en el directorio mmdetection:

python tools/train.py configs/cascade_rcnn_r50_fpn_1x_poker.py

De esta manera, puede entrenar con éxito, y se imprimirán muchos registros en la pantalla. Por supuesto, después de que se complete el entrenamiento, aparecerán cosas como la siguiente imagen en el directorio work_dirs: hay registros .log y. log.json, y cada época determinada (aquí está Cada 2 épocas) Guarde el modelo. Para la conveniencia de realizar pruebas posteriores, está el modelo final latest.pth.
Archivos guardados durante el entrenamiento

Cinco, prueba y calcula mAP

1. Prueba el efecto de una imagen

Imité el archivo demo / webcam_demo.py y escribí un script de demostración image_demo.py para una imagen:

import argparse
import torch

from mmdet.apis import inference_detector, init_detector, show_result


def parse_args():
    parser = argparse.ArgumentParser(description='MMDetection image demo')
    parser.add_argument('config', help='test config file path')
    parser.add_argument('checkpoint', help='checkpoint file')
    parser.add_argument('imagepath', help='the path of image to test')
    parser.add_argument('--device', type=int, default=0, help='CUDA device id')
    parser.add_argument(
        '--score-thr', type=float, default=0.5, help='bbox score threshold')
    args = parser.parse_args()
    return args


def main():
    args = parse_args()

    model = init_detector(
        args.config, args.checkpoint, device=torch.device('cuda', args.device))

    result = inference_detector(model, args.imagepath)
    # 这里的result是一个列表,长度为类别数,例如我这里就是6
    # 其中每个元素就是对一类的预测出来的bbox,是一个np.ndarray
    # shape为(N,5),N可能大于测试图中实际的该类的数量
    # 5是4个坐标值,加1个置信度
    show_result(
        args.imagepath, result, model.CLASSES, score_thr=args.score_thr, wait_time=0)


if __name__ == '__main__':
    main()

Luego ejecute el siguiente comando:

python demo/image_demo.py configs/cascade_rcnn_r50_fpn_1x_poker.py work_dirs/cascade_rcnn_r50_fpn_1x_poker/latest.pth demo/poker_test.jpg

Obtenga los siguientes resultados, puede ver que el cuadro bbox está muy ajustado y la clasificación es correcta:
Gráfico de resultado de la prueba de demostración

2. Calcular mAP

Antes de calcular mAP, es necesario modificar la función voc_eval en el archivo mmdetection / tools / voc_eval.py. La imagen después de la modificación:
Modifique el archivo voc_eval.py
Luego genere el archivo poker_results.pkl mediante el siguiente comando :

python tools/test.py configs/cascade_rcnn_r50_fpn_1x_poker.py work_dirs/cascade_rcnn_r50_fpn_1x_poker/latest.pth --out poker_results.pkl

Luego ejecute el siguiente comando para calcular mAP usando el estándar voc:

python tools/voc_eval.py poker_results.pkl configs/cascade_rcnn_r50_fpn_1x_poker.py

Se obtiene el siguiente resultado y puede ver que mAP es tan alto como 0,977 . Por supuesto, esto se debe a que el cuadro de póquer es fácil de detectar:
Resultados de la prueba mAP
Bien, juguemos a mmdetection. Lo encontraré a menudo en el futuro ~~

Consejos

Actualización el 1 de marzo de 2020

  • Aquí hay un recordatorio de que el latest.pth en work_dirs /.../ latest.pth no es un archivo de modelo .pth real, sino un enlace simbólico (enlace simbólico), que apunta a epoch_20.pth (asumiendo que su época máxima es 20) , por lo que cuando desee eliminar archivos de modelo generados redundantes, debe mantener un epoch_20.pth final (excepto el último.pth); de lo contrario, es posible que vea este error:
    OSError: work_dirs/.../latest.pth is not a checkpoint file
  • Debido a que mmdetection se actualiza con frecuencia para corregir errores, etc., su documentación también se actualizará con frecuencia. Por ejemplo, no hay voc_eval.py en las herramientas y se reemplaza con unified robustness_eval.py # 2074. Por supuesto, si desea reproducir mis resultados, puede ir a la versión anterior para descargar y usar tools / voc_eval.py

Supongo que te gusta

Origin blog.csdn.net/laizi_laizi/article/details/104256781
Recomendado
Clasificación