Guía de capacitación Yolov5 - Conjunto de datos en formato CoCo
1 Preparaciones
-
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
-
Primero crea una carpeta de entrenamiento
mkdir training/
-
Úselo en la carpeta de entrenamiento
git clone
para clonar yolov5 e instalar dependencias
cd training
git clone clone https://github.com/ultralytics/yolov5
pip install -qr requirements.txt
-
Comprobar la versión de pytorch y torchvision
pip install --upgrade torch
pip install --upgrade torchvision
-
Verifique si la etiqueta es continua, si no es continua, debe recodificarse
-
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
-
json.load(open(file_path,'r'))
leer datos usando -
Cree un csv para almacenar la identificación y el nombre de archivo de la imagen
-
Lea el csv creado en 2
train_test_split
para dividir el conjunto de entrenamiento y el conjunto de validación -
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)
-
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)
-
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)
-
Copie las imágenes y etiquetas correspondientes a las carpetas de tren y prueba.
-
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íasdata_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
-
El modelo entrenado se almacena en W&B, descargue el mejor modelo y cárguelo en Kaggle
-
Pon la imagen de prueba en
VALID_PATH
la carpeta. -
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/
-
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)
-
Si la etiqueta se codificó antes, la etiqueta debe volver a mapearse
-
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