fbpixel
Etiquetas: , ,

En este tutorial veremos cómo entrenar un modelo YOLO para el reconocimiento de objetos sobre datos específicos. La dificultad radica en crear el banco de imágenes que se utilizará para el entrenamiento.

Hardware

  • Un ordenador con una instalación de Python3
  • Una cámara

Principio

Ya vimos en un tutorial anterior cómo reconocer objetos con Yolo. Este modelo ha sido entrenado para detectar un cierto número de objetos, pero esta lista es limitada.

{0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 4: 'airplane', 5: 'bus', 6: 'train', 7: 'truck', 8: 'boat', 9: 'traffic light', 10: 'fire hydrant', 11: 'stop sign', 12: 'parking meter', 13: 'bench', 14: 'bird', 15: 'cat', 16: 'dog', 17: 'horse', 18: 'sheep', 19: 'cow', 20: 'elephant', 21: 'bear', 22: 'zebra', 23: 'giraffe', 24: 'backpack', 25: 'umbrella', 26: 'handbag', 27: 'tie', 28: 'suitcase', 29: 'frisbee', 30: 'skis', 31: 'snowboard', 32: 'sports ball', 33: 'kite', 34: 'baseball bat', 35: 'baseball glove', 36: 'skateboard', 37: 'surfboard', 38: 'tennis racket', 39: 'bottle', 40: 'wine glass', 41: 'cup', 42: 'fork', 43: 'knife', 44: 'spoon', 45: 'bowl', 46: 'banana', 47: 'apple', 48: 'sandwich', 49: 'orange', 50: 'broccoli', 51: 'carrot', 52: 'hot dog', 53: 'pizza', 54: 'donut', 55: 'cake', 56: 'chair', 57: 'couch', 58: 'potted plant', 59: 'bed', 60: 'dining table', 61: 'toilet', 62: 'tv', 63: 'laptop', 64: 'mouse', 65: 'remote', 66: 'keyboard', 67: 'cell phone', 68: 'microwave', 69: 'oven', 70: 'toaster', 71: 'sink', 72: 'refrigerator', 73: 'book', 74: 'clock', 75: 'vase', 76: 'scissors', 77: 'teddy bear', 78: 'hair drier', 79: 'toothbrush'}

El modelo puede entrenarse para reconocer objetos adicionales u otros objetos utilizando un banco de imágenes adecuado.

Configuración de Python

Si no, puedes descargar e instalar Python 3

A continuación, puede instalar las bibliotecas necesarias: imutils, OpenCV, ultralytics, etc.

python3 -m pip install imutils opencv-python ultralytics

Configuración de datos

Una vez que haya creado una base de datos de imágenes con etiquetas y casillas en formato Yolo, coloque la base de datos en la carpeta YOLO\datasets. A continuación, puedes resumir la información en un archivo YAML en el que especifiques:

  • la ruta a la base de datos contenida en datasets (coffe_mug)
path: coffee_mug/
train: 'train/'
val: 'test/'
 
# class names
names: 
  0: 'mug'

N.B.: puede pasar rutas de acceso como directorios de imágenes, archivos de texto (ruta

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: [./coco128/images/train2017/, coffee_mug/test/]  
val: [./coco128/images/train2017/, coffee_mug/train/] 


# class names
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
        'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
        'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
        'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
        'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
        'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
        'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
        'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
        'hair drier', 'toothbrush', 'mug']

Recuperar un modelo preentrenado

Es posible recuperar un modelo preentrenado del script python, que se utilizará como base para entrenar el nuevo modelo.

# load the pre-trained YOLOv8n model
model = YOLO("yolov8n.pt")

N.B.: fíjese bien en el modelo que corresponde a su máquina y a sus necesidades, ya que tienen prestaciones diferentes.

Script en Python para entrenar a Yolo

Una vez que el banco de imágenes está listo, el script de formación es bastante sencillo. Todo lo que tiene que hacer es especificar:

  • el nombre del nuevo modelo (yolov8n_v8_50e)
  • el número de iteraciones (epochs)
  • la base de datos que se utilizará (datos)
  • el número de archivos que se utilizarán en una iteración (lote)

entrenar_yolo.py

from ultralytics import YOLO
 
# Load the model.
model = YOLO('yolov8n.pt')
 
# Training.
results = model.train(
   data='coffee_mug_v8.yaml',
   imgsz=1280,
   epochs=50,
   batch=8,
   name='yolov8n_v8_50e'
)
yolov8-training-process Entrenamiento de un modelo Yolo

El algoritmo de entrenamiento registra una cierta cantidad de datos durante el proceso, que puede ver después para analizar el entrenamiento. Los resultados se encuentran en la carpeta .\runs\detect\.

yolo-training-results Entrenamiento de un modelo Yolo

Script en Python para la evaluación de modelos

Una vez entrenado el modelo, puede comparar su rendimiento con imágenes nuevas.

Para recuperar el modelo entrenado, puede copiarlo en la raíz o introducir la ruta de acceso

«./runs/detect/yolov8n_v8_50e2/weights/best.pt»

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

import datetime
from ultralytics import YOLO
import cv2
from imutils.video import VideoStream
#from helper import create_video_writer


# define some constants
CONFIDENCE_THRESHOLD = 0.65
GREEN = (0, 255, 0)


image_list=['./datasets/coffee_mug/test/10.png','./datasets/coffee_mug/test/19.png']

# load the pre-trained YOLOv8n model
#model = YOLO("yolov8n.pt")
model = YOLO("./runs/detect/yolov8n_v8_50e2/weights/best.pt") # test trained model


for i,img in enumerate(image_list):
	#detect on image
	frame= cv2.imread(img)#from image file

	detections = model(frame)[0]
	# loop over the detections
	#for data in detections.boxes.data.tolist():
	for box in detections.boxes:
		#extract the label name
		label=model.names.get(box.cls.item())
			
		# extract the confidence (i.e., probability) associated with the detection
		data=box.data.tolist()[0]
		confidence = data[4]

		# filter out weak detections by ensuring the
		# confidence is greater than the minimum confidence
		if float(confidence) < CONFIDENCE_THRESHOLD:
			continue

		# if the confidence is greater than the minimum confidence,
		# draw the bounding box on the frame
		xmin, ymin, xmax, ymax = int(data[0]), int(data[1]), int(data[2]), int(data[3])
		cv2.rectangle(frame, (xmin, ymin) , (xmax, ymax), GREEN, 2)

		#draw confidence and label
		y = ymin - 15 if ymin - 15 > 15 else ymin + 15
		cv2.putText(frame, "{} {:.1f}%".format(label,float(confidence*100)), (xmin, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, GREEN, 2)

	# show the frame to our screen
	cv2.imshow("Img{}".format(i), frame)

while True:
	if cv2.waitKey(1) == ord("q"):
		break

Resultados

Hemos logrado nuestro objetivo creando un nuevo modelo que sólo reconoce tazas ({0: ‘mug’}).

yolov8-training-mug-result Entrenamiento de un modelo Yolo

Puedes probar este código con tu webcam o con fotos, por ejemplo, para ver cómo funcionan el modelo y el reconocimiento de objetos.

Para que el modelo pueda reconocer más tipos de objetos, es necesario añadir imágenes del objeto en cuestión a la base de datos.

Fuentes