Esta es una guía de apoyo para el video de YouTube para entrenar tu propio modelo de YOLOv7 a la medida. Todos los comandos mencionados en el video están en esta guía.

1) Descargar images

Primer descarguemos todas las imágenes que vamos a requerir para hacer el etiquetado

2) Descarga de LabelImg

Para descargar LabelImg, la herramienta que nos ayudará con el etiquetado tenemos que entrar al repositorio de LabelImg y seguir las instrucciones dependiendo de cómo lo queramos instalar.

La manera más sencilla es correr los siguientes comandos.

pip3 install labelImg
labelImg

3) Etiquetado

Usa el programa de labelImg para etiquetar todas las imágenes que tienes

4) Clonar el repositorio

Entrar al repositorio de YOLOv7 y clonarlo con el siguiente comando:

git clone https://github.com/WongKinYiu/yolov7.git

5) Crear contenedor de docker

Para descargar la imagen y crear el contenedor de Docker que necesitaremos tenemos que correr el siguiente comando:

nvidia-docker run --name yolov7 -it -v CARPETA_CON_REPO_YOLOV7:/yolov7 --shm-size=64g nvcr.io/nvidia/pytorch:21.08-py3

6) Instalacion inicial docker

Una vez DENTRO del contenedor de docker corremos estos comandos para instalar algunas dependencias requeridas

apt update
apt install -y zip htop screen libgl1-mesa-glx
pip install seaborn thop

Ya terminada la configuración nos cambiamos al directorio donde esta el repositorio con

cd /yolov7

7) Estructura de imágenes

La imágenes que etiquetaste con labelImg deben de estar en una estructura de folders especifica y deber colocarla en el directorio raíz del repositorio de yolov7

La estructura es la siguiente:

  • train/images (carpeta con las imágenes para entrenar)
  • train/labels (carpeta con los txt del etiquetado correspondiente a las imágenes de entrenamiento)
  • valid/images (carpeta con las imágenes para validar)
  • valid/labels (carpeta con los txt del etiquetado correspondiente a las imágenes de validación)

8) YAMLS

Dentro de la carpeta de data creamos un YAML (En este caso será llamado resistencias.yaml) y le ponemos la dirección del directorio donde están las imágenes, las etiquetas, el numero de clases a detectar y el nombre de cada una de ellas.

train: /yolov7/train/images

val: /yolov7/valid/images

  

nc: 1

names: ['Resistencias']

Después dentro de cfg/training modificamos el archivo yolov7.yaml y únicamente cambiamos la linea que dice nc: 80 por el número de clases que tenemos etiquetadas

nc: 1 # number of classes

depth_multiple: 1.0 # model depth multiple

width_multiple: 1.0 # layer channel multiple

9) Descarga de modelo

Entra al repositorio de yolov7 y en la sección de performance da click en YOLOv7 para descargar el archivo con los pesos del modelo pre entrenado.

También puedes descargar el archivo desde aquí

10) Entrenamiento

Una vez que tenemos todos los YAML y las imágenes en etiquetadas en los directorios requeridos corremos el siguiente comando dentro del contenedor de docker para entrenar el modelo:

python train.py --workers 1 --device 0 --batch-size 4 --data data/resistencias.yaml --img 640 640 --cfg cfg/training/yolov7.yaml --weights 'yolov7.pt' --name yolov7-custom --hyp data/hyp.scratch.yaml

El valor del batch size y los workers dependen del procesador y la tarjeta gráfica con la que cuentes.

11) Predicciones en imágenes

Para correr las predicciones en sobre algunas imágenes debemos correr el siguiente comando:

python detect.py --weights runs/train/yolov7-custom3/wights/best.pt --conf 0.25 --img-size 640 --source <DIRECTORIO_DE_LA_IMAGEN>

Puede ser que para el parámetro de –weights tengas que cambiar el directorio a donde sea que tienes guardado el archivo con los pesos de tu red neuronal después del entrenamiento-

12) Predicciones en video

Para hacer predicciones sobre video se tiene que correr el mismo comando únicamente cambiando el directorio a que apunte al video sobre el que quieres correr las predicciones.

Para correr las predicciones en sobre algunas imágenes debemos correr el siguiente comando:

python detect.py --weights runs/train/yolov7-custom3/wights/best.pt --conf 0.25 --img-size 640 --source <DIRECTORIO_DEL_VIDEO>

Si después de haber procesado el video no se genero ningun nuevo .mp4 en la carpeta runs/detect/expX te recomiendo correr este comando ya que puede ser un problema con la version de openCV instalada. Para correr las predicciones en sobre algunas imágenes debemos correr el siguiente comando dentro del contenedor de docker:

pip install opencv-python==4.5.5.64

14) Código

En el archivo detect.py del repositorio, en la linea 96 hay una variable llamada pred esta variable contiene la información sobre cada una de las detecciones que has corrido con YOLOv7, esto es útil para que puedas hacer cosas como conteo de los elementos, ver cuantas clases aparecieron en una imagen o cuadro de video etc.