Guía de capacitación Yolov5 - Conjunto de datos en formato CoCo

1 Preparaciones

  1. Los archivos y formatos de archivo a preparar para el entrenamiento del modelo Yolo son los siguientes:

    /trianing # 根目录
    	/datasets # 数据集目录(可以任意取名)
    		/images
    			/train
    			/val
    		/labels
    			/train
    			/val
    	/yolov5
    
  2. Primero crea una carpeta de entrenamientomkdir training/

  3. Úselo en la carpeta de entrenamiento git clonepara clonar yolov5 e instalar dependencias
    cd training

    git clone clone https://github.com/ultralytics/yolov5

    pip install -qr requirements.txt

  4. Comprobar la versión de pytorch y torchvision

    pip install --upgrade torch

    pip install --upgrade torchvision

  5. Verifique si la etiqueta es continua, si no es continua, debe recodificarse

  6. Use Pesos y sesgos para la visualización, donde la API de inicio de sesión se puede obtener en Pesos y sesgos .
    %load_ext tensorboard
    %tensorboard --logdir /kaggle/training/yolov5/runs
    %pip install -q --upgrade wandb

    import wandb
    wandb.login()
    

2 Convierta el conjunto de datos de coco en el conjunto de datos de yolo

  1. json.load(open(file_path,'r'))leer datos usando

  2. Cree un csv para almacenar la identificación y el nombre de archivo de la imagen

  3. Lea el csv creado en 2 train_test_splitpara dividir el conjunto de entrenamiento y el conjunto de validación

  4. Agregue una nueva columna a los archivos trian y de prueba divididos para marcar si la imagen es una imagen de entrenamiento o una imagen de prueba
    train['split']='train'
    val['split']='val'
    df = pd.concat([trian,val],axis=0).rest_index(drop=True)

  5. Guarde las etiquetas de cada imagen por separado en sus respectivos archivos .txt, donde está la anotación del conjunto de datos de coco [lowest_x,lowest_y,w,h]y los requisitos de anotación de yolo [center_x,center_y,w,h], use la siguiente función:

    def coco2yolo(image_w,image_h,annotation):
        """Convert coco format data into yolo format data.
        Note: x,y in coco format are lowest left x and y. x,y in yolo format are center x,y.
        """
        x,y,w,h = annotation['bbox']
        
        x = (x+w)/2.0
        y = (y+h)/2.0
        
        return (x/image_w,y/image_h,w/image_w,h/image_h)
    
  6. Crear una carpeta de conjuntos de datos en el directorio de entrenamiento
    os.makedirs('/kaggle/training/cowboy/images/train', exist_ok=True)

    os.makedirs('/kaggle/training/cowboy/images/test', exist_ok=True)

    os.makedirs('/kaggle/training/cowboy/labels/train', exist_ok=True)

    os.makedirs('/kaggle/training/cowboy/labels/test', exist_ok=True)

  7. Copie las imágenes y etiquetas correspondientes a las carpetas de tren y prueba.

  8. Cree un archivo .ymal, que se usa para almacenar:
    1) rutas de datos de entrenamiento y datos de prueba
    2) número total de categorías
    3) nombres correspondientes a categorías

    data_yaml = dict(train='/kaggle/training/cowboy/images/train/'
                     ,val='/kaggle/training/cowboy/images/test/'
                     ,nc=5
                     ,names=['belt', 'sunglasses', 'boot', 'cowboy_hat', 'jacket'])
    with open('/kaggle/training/yolov5/data/data.yaml', 'w') as outfile:
        yaml.dump(data_yaml, outfile, default_flow_style=True)
    

3 Definición de parámetros de entrenamiento

Los parámetros son los siguientes:

lr0: 0.01  # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2  # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937  # SGD momentum/Adam beta1
weight_decay: 0.0005  # optimizer weight decay 5e-4
warmup_epochs: 3.0  # warmup epochs (fractions ok)
warmup_momentum: 0.8  # warmup initial momentum
warmup_bias_lr: 0.1  # warmup initial bias lr
box: 0.05  # box loss gain
cls: 0.5  # cls loss gain
cls_pw: 1.0  # cls BCELoss positive_weight
obj: 1.0  # obj loss gain (scale with pixels)
obj_pw: 1.0  # obj BCELoss positive_weight
iou_t: 0.20  # IoU training threshold
anchor_t: 4.0  # anchor-multiple threshold
# anchors: 3  # anchors per output layer (0 to ignore)
fl_gamma: 0.0  # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015  # image HSV-Hue augmentation (fraction)
hsv_s: 0.7  # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4  # image HSV-Value augmentation (fraction)
degrees: 0.0  # image rotation (+/- deg)
translate: 0.1  # image translation (+/- fraction)
scale: 0.5  # image scale (+/- gain)
shear: 0.0  # image shear (+/- deg)
perspective: 0.0  # image perspective (+/- fraction), range 0-0.001
flipud: 0.0  # image flip up-down (probability)
fliplr: 0.5  # image flip left-right (probability)
mosaic: 1.0  # image mosaic (probability)
mixup: 0.0  # image mixup (probability)
copy_paste: 0.0  # segment copy-paste (probability)

4 modelo de entrenamiento

Al elegir un modelo, puede elegir modelos de diferentes tamaños: Yolov5

BATCH_SIZE = 32 # wisely choose, use the largest size that can feed up all your gpu ram
EPOCHS = 5
MODEL = 'yolov5m.pt'  # 5s, 5m 5l
name = f'{
      
      MODEL}_BS_{
      
      BATCH_SIZE}_EP_{
      
      EPOCHS}'

# 在yolov5目录下
!python train.py --batch {
    
    BATCH_SIZE} \
                 --epochs {
    
    EPOCHS} \
                 --data data.yaml \
                 --weights {
    
    MODEL} \
                 --save-period 1 \
                 --project /kaggle/working/kaggle-cwoboy \
                 --name {
    
    name} \
                 -- workers 4

5 predicciones

  1. El modelo entrenado se almacena en W&B, descargue el mejor modelo y cárguelo en Kaggle

  2. Pon la imagen de prueba en VALID_PATHla carpeta.

  3. Regrese a la ruta yolov5 y ejecute la siguiente línea de código para la predicción

    !python detect.py --weights {
          
          MODEL_PATH} \
    	                  --source {
          
          VALID_PATH} \
    	                  --conf 0.546 \
    	                  --iou-thres 0.5 \
    	                  --save-txt \
    	                  --save-conf \
    	                  --augment
    

Los resultados finales de la predicción están en/kaggle/training/yolov5/runs/detect/exp/labels/

  1. Para convertir a coordenadas coco use la siguiente función

    def yolo2cc_bbox(img_width, img_height, bbox):
        x = (bbox[0] - bbox[2] * 0.5) * img_width
        y = (bbox[1] - bbox[3] * 0.5) * img_height
        w = bbox[2] * img_width
        h = bbox[3] * img_height
        
        return (x, y, w, h)
    
  2. Si la etiqueta se codificó antes, la etiqueta debe volver a mapearse

  3. Para visualizar los resultados, puede usar Opencv o PIL para leer las fotos en yolov5/runs/detect/exp/.

    m = Image.open('/kaggle/training/yolov5/runs/detect/exp/0007c3f55f707547.jpg')
    im
    

    inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44027006/article/details/124457469
Recomendado
Clasificación