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.