Referencia: https://github.com/AlexeyAB/darknet#how-to-train-tiny-yolo-to-detect-your-custom-objects
Cómo entrenar (para detectar sus objetos personalizados)
(para entrenar edad Yolo v2 yolov2-voc.cfg
, yolov2-tiny-voc.cfg
, yolo-voc.cfg
, yolo-voc.2.0.cfg
, ... , haga clic en el enlace )
Entrenamiento de Yolo v4 (y v3):
-
Para entrenamiento,
cfg/yolov4-custom.cfg
descargue el archivo de pesos previamente entrenado (162 MB): yolov4.conv.137 (espejo de Google Drive yolov4.conv.137 ) -
Cree un archivo
yolo-obj.cfg
con el mismo contenido que enyolov4-custom.cfg
(o cópieloyolov4-custom.cfg
enyolo-obj.cfg)
y:
- cambiar lote de línea a
batch=64
- cambiar subdivisiones de línea a
subdivisions=16
- cambie la línea max_batches a (
classes*2000
pero no menos que el número de imágenes de entrenamiento, pero no menos que el número de imágenes de entrenamiento y no menos que6000
), femax_batches=6000
si entrena para 3 clases - cambiar los pasos de línea al 80% y 90% de max_batches, fe
steps=4800,5400
- establezca el tamaño de la red
width=416 height=416
o cualquier valor múltiplo de 32: https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L8-L9 - cambie la línea
classes=80
a su número de objetos en cada una de las 3[yolo]
capas:- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L610
- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L696
- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L783
- cambie [
filters=255
] a filtros = (clases + 5) x3 en los 3[convolutional]
antes de cada[yolo]
capa, tenga en cuenta que solo tiene que ser el último[convolutional]
antes de cada una de las[yolo]
capas.- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L603
- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L689
- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L776
- cuando use
[Gaussian_yolo]
capas, cambie [filters=57
] filtros = (clases + 9) x3 en los 3[convolutional]
antes de cada[Gaussian_yolo]
capa- https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L604
- https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L696
- https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L789
Entonces, si classes=1
entonces debería ser filters=18
. Si classes=2
entonces escribe filters=21
.
(No escriba en el archivo cfg: filtros = (clases + 5) x3)
(Generalmente filters
depende del classes
, coords
y el número de mask
s, es decir, filtros = (classes + coords + 1)*<number of mask>
, donde mask
están los índices de anclas. Si mask
es ausencia, entonces filtros = (classes + coords + 1)*num
)
Entonces, por ejemplo, para 2 objetos, su archivo yolo-obj.cfg
debe diferir de yolov4-custom.cfg
esas líneas en cada una de las 3 capas de [yolo]:
[convolutional]
filters=21
[region]
classes=2
-
Cree un archivo
obj.names
en el directoriobuild\darknet\x64\data\
, con los nombres de los objetos, cada uno en una nueva línea -
Cree un archivo
obj.data
en el directoriobuild\darknet\x64\data\
, que contenga (donde clases = número de objetos ):
classes = 2
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
-
Coloque archivos de imagen (.jpg) de sus objetos en el directorio
build\darknet\x64\data\obj\
-
Debe etiquetar cada objeto en imágenes de su conjunto de datos. Utilice este software de GUI visual para marcar cuadros delimitados de objetos y generar archivos de anotaciones para Yolo v2 y v3: https://github.com/AlexeyAB/Yolo_mark
Se va a crear .txt
-file para cada .jpg
archivo -imagen - en el mismo directorio y con el mismo nombre, pero con .txt
-Ampliación, y poner a archivo: Número del objeto y las coordenadas del objeto en esta imagen, para cada objeto en la nueva línea:
<object-class> <x_center> <y_center> <width> <height>
Dónde:
<object-class>
- número de objeto entero de0
a(classes-1)
<x_center> <y_center> <width> <height>
- valores flotantes relativos al ancho y alto de la imagen, puede ser igual a(0.0 to 1.0]
- por ejemplo:
<x> = <absolute_x> / <image_width>
o<height> = <absolute_height> / <image_height>
- atención:
<x_center> <y_center>
son el centro del rectángulo (no son la esquina superior izquierda)
Por ejemplo, img1.jpg
se creará para usted que img1.txt
contiene:
1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
1 0.420312 0.395833 0.140625 0.166667
- Cree un archivo
train.txt
en el directoriobuild\darknet\x64\data\
, con los nombres de archivo de sus imágenes, cada nombre de archivo en una nueva línea, con la ruta relativa adarknet.exe
, por ejemplo, que contiene:
data/obj/img1.jpg
data/obj/img2.jpg
data/obj/img3.jpg
-
Descargue pesos previamente entrenados para las capas convolucionales y colóquelos en el directorio
build\darknet\x64
- para
yolov4.cfg
,yolov4-custom.cfg
(162 MB): yolov4.conv.137 (espejo de Google Drive yolov4.conv.137 ) - para
yolov4-tiny.cfg
,yolov4-tiny-3l.cfg
,yolov4-tiny-custom.cfg
(19 MB): yolov4-tiny.conv.29 - para
csresnext50-panet-spp.cfg
(133 MB): csresnext50-panet-spp.conv.112 - para
yolov3.cfg, yolov3-spp.cfg
(154 MB): darknet53.conv.74 - para
yolov3-tiny-prn.cfg , yolov3-tiny.cfg
(6 MB): yolov3-tiny.conv.11 - para
enet-coco.cfg (EfficientNetB0-Yolov3)
(14 MB): enetb0-coco.conv.132
- para
-
Empiece a entrenar usando la línea de comando:
darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137
Para entrenar en Linux use el comando:
./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137
(solo use en./darknet
lugar dedarknet.exe
)- (el archivo
yolo-obj_last.weights
se guardará en elbuild\darknet\x64\backup\
por cada 100 iteraciones) - (el archivo
yolo-obj_xxxx.weights
se guardará en elbuild\darknet\x64\backup\
por cada 1000 iteraciones) - (para deshabilitar el uso de la ventana de pérdida
darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -dont_show
, si entrena en una computadora sin monitor como una nube Amazon EC2) - (para ver el gráfico de mAP y pérdidas durante el entrenamiento en un servidor remoto sin GUI, use el comando y
darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map
luego abra la URLhttp://ip-address:8090
en el navegador Chrome / Firefox)
- (el archivo
8.1. Para entrenar con el cálculo de mAP (precisiones medias medias) para cada 4 épocas (establecido valid=valid.txt
o train.txt
en obj.data
archivo) y ejecutar: darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map
- Una vez finalizado el entrenamiento, obtenga el resultado
yolo-obj_final.weights
de la rutabuild\darknet\x64\backup\
-
Después de cada 100 iteraciones, puede detener y luego comenzar a entrenar desde este punto. Por ejemplo, después de 2000 iteraciones puede dejar de entrenar y luego comenzar a entrenar usando:
darknet.exe detector train data/obj.data yolo-obj.cfg backup\yolo-obj_2000.weights
(en el repositorio original https://github.com/pjreddie/darknet el archivo de pesos se guarda solo una vez cada 10 000 iteraciones
if(iterations > 1000)
) -
También puede obtener resultados antes de las 45000 iteraciones.
Nota: Si durante el entrenamiento ves nan
valores para el avg
campo (pérdida), entonces el entrenamiento sale mal, pero si nan
está en otras líneas, entonces el entrenamiento va bien.
Nota: Si cambió width = o height = en su archivo cfg, entonces el nuevo ancho y alto debe ser divisible por 32.
Nota: Después del entrenamiento, use este comando para la detección: darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights
Nota: si se Out of memory
produce un error , en el .cfg
archivo debe aumentar subdivisions=16
, 32 o 64: enlace
Cómo entrenar a tiny-yolo (para detectar sus objetos personalizados):
Realice los mismos pasos que para el modelo completo de yolo como se describe arriba. Con la excepción de:
- Descargue el archivo con las primeras 29 capas convolucionales de yolov4-tiny: https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29 (u obtenga este archivo de yolov4-tiny.weights archivo usando el comando:
darknet.exe partial cfg/yolov4-tiny-custom.cfg yolov4-tiny.weights yolov4-tiny.conv.29 29
- Haga su modelo personalizado
yolov4-tiny-obj.cfg
basado en encfg/yolov4-tiny-custom.cfg
lugar deyolov4.cfg
- Empezar a entrenar:
darknet.exe detector train data/obj.data yolov4-tiny-obj.cfg yolov4-tiny.conv.29
Para entrenar a Yolo en base a otros modelos ( DenseNet201-Yolo o ResNet50-Yolo ), puede descargar y obtener pesos pre-entrenados como se muestra en este archivo: https://github.com/AlexeyAB/darknet/blob/master/build/ darknet / x64 / partial.cmd Si creó su modelo personalizado que no se basa en otros modelos, entonces puede entrenarlo sin pesos previamente entrenados, luego se utilizarán pesos iniciales aleatorios.
para resumir
Además de cómo configurar archivos relacionados, la información que se puede obtener del tutorial del sitio web oficial incluye guiones de capacitación, guiones de prueba y guiones de capacitación continua.
Guión de entrenamiento:
darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137
Entrenamiento con visualización de mapa:
darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map
Use ctrl + c para finalizar el entrenamiento
Script de prueba (asumiendo que la prueba de entrenamiento finaliza 2000 veces):
darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_2000.weights
(Suponiendo que el entrenamiento se detiene 2000 veces, se genera en este momento yolo-obj_2000.weights
) Continuar el script de entrenamiento:
darknet.exe detector train data/obj.data yolo-obj.cfg backup\yolo-obj_2000.weights