Darkflow: Agregar precisión de capacitación y validación al proceso de capacitación

Creado en 30 may. 2017  ·  37Comentarios  ·  Fuente: thtrieu/darkflow

Durante el entrenamiento:
paso 1 - pérdida 240,92623901367188 - pérdida media móvil 240,92623901367188
paso 2 - pérdida 241.2866668701172 - pérdida media móvil 240.96228179931643
paso 3 - pérdida 239.79562377929688 - pérdida media móvil 240.84561599731447

¿Cómo agrego precisión de entrenamiento y precisión de validación?

paso1 - pérdida 240.92623901367188 - pérdida promedio en movimiento 240.92623901367188 - tren 0.221
paso 2 - pérdida 241.2866668701172 - pérdida promedio en movimiento 240.96228179931643 - tren 0.222
paso 3 - pérdida 239.79562377929688 - pérdida promedio en movimiento 240.84561599731447 - tren 0.223
Terminado 1 Época, validación 0.210

Comentario más útil

Si no hay problema. Subiré los archivos aquí. Si tienes alguna pregunta solo pregunta.

diff.zip

Todos 37 comentarios

Hay dos métodos para hacerlo. Puede dividir el conjunto de datos en tren y validar conjuntos dentro del código o simplemente enviar 2 conjuntos de datos separados, uno para entrenar y otro para validar cuando llame al módulo de flujo.

De todos modos, para hacer eso, debe agregar algunos parámetros nuevos en el archivo default.py, luego modificar las funciones _batch, parse y shuffle desde data.py (carpetas yolo y yolov2) y modificar el método train () en flow.py file (aquí solo tiene que ejecutar otro lote (cada iteración o una vez varias iteraciones) usando la misma sesión de tensorflow, pero sin devolver el train_op para que no modifique los pesos). También puede agregar otro tf.summary.FileWriter para la validación para que pueda visualizar su gráfico de pérdida de validación usando tensorboard.

Yo personalmente elegí enviar 2 conjuntos de datos diferentes. Fue bastante sencillo. Espero haber sido lo suficientemente claro.

@ Costyv95 ¿Puede compartir su código con los parámetros agregados y los cambios que ha sugerido?

Si no hay problema. Subiré los archivos aquí. Si tienes alguna pregunta solo pregunta.

diff.zip

@ Costyv95 ¿

Lo tengo, las muestras de validación no contribuyen a la actualización del gradiente.

Sí, la validación es solo para una vista previa de los resultados del modelo fuera del conjunto de entrenamiento.

Hola,
Lo siento. No me di cuenta del último correo. Sí, la validación es solo para una vista previa de los resultados del modelo fuera del conjunto de entrenamiento.

El martes 4 de julio de 2017 a las 3:16:24 p.m. GMT + 3, yfliu [email protected] escribió:

Lo tengo, las muestras de validación no contribuyen a la actualización del gradiente.

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub o silencia el hilo.

@ Costyv95 Solo quiero saber cómo ejecutarlo después de modificar el código original. ¡Muchas gracias!

@ Costyv95 Lo ejecuto así ./flow --model cfg / yolo.cfg --train --dataset "/ home / thinkjoy / lwl / modified-darkflow-master / data / VOCdevkit / VOC2007 / JPEGImages" --annotation " / inicio / thinkjoy / lwl / modificar-darkflow-master / data / VOCdevkit / VOC2007 / Annotations "--gpu 1.0
aquí hay un error (modifique el código como el mismo que usted)
Archivo "/home/thinkjoy/lwl/modify-darkflow-master/darkflow/net/flow.py", línea 82, en tren
feed_dict [self.learning_rate] = lr
AttributeError: el objeto 'TFNet' no tiene el atributo 'learning_rate'

Esto sucede porque el código que le di tiene algunas modificaciones para la tasa de aprendizaje adaptativo y hay un cambio más que debe hacer. Lo encuentra aquí: https://github.com/thtrieu/darkflow/pull/216/commits/124d55d32d17bdee111201fd6fe520db709a4f9c

Y debe agregar --val_dataset y val_annotation a los argumentos para tener una pérdida de validación.

@ Costyv95 ¿Podemos controlar cuántos pasos validar una vez, creo que un paso uno val es una pequeña pérdida de tiempo para la capacitación? ¡Gracias!

@ Costyv95 ¿ Y ha logrado sumar la precisión cuando val?

@ dream-will Para la validación una vez en N pasos, puede agregar fácilmente un argumento (val_steps) en defaults.py y en el método de tren en flow.py simplemente ejecute el código que está después del "# tiempo de validación" dentro de una declaración if como esto:

`# tiempo de validación

if i % self.FLAGS.val_steps == 0:
    (x_batch, datum) = next(val_batches)
    feed_dict = {
        loss_ph[key]: datum[key] 
            for key in loss_ph }
    feed_dict[self.inp] = x_batch
    feed_dict.update(self.feed)
    feed_dict[self.learning_rate] = lr

    fetches = [loss_op, self.summary_op] 
    fetched = self.sess.run(fetches, feed_dict)
    loss = fetched[0]

    if loss_mva_valid is None: loss_mva_valid = loss
    loss_mva_valid = .9 * loss_mva_valid + .1 * loss

    self.val_writer.add_summary(fetched[1], step_now)

    form = 'VALIDATION step {} - loss {} - moving ave loss {}'
    self.say(form.format(step_now, loss, loss_mva_valid))`

En defaults.py simplemente agregue esta línea:

self.define('val_steps', '1', 'evaluate validation loss every #val_steps iterations')

No entiendo la segunda pregunta sobre cómo agregar la precisión.

@ Costyv95 Gracias por su respuesta, la segunda pregunta solo significa que cuando validamos, no solo obtenemos la pérdida de validación, sino que también obtenemos la precisión de la validación.

@ dream-will Para eso, debe implementar un método de precisión personalizado que compare los bboxes GT y los bboxes predichos (para obtener los bboxes predichos, vea el código utilizado en la predicción), pero no veo una razón para eso porque la pérdida es suficiente. Tenga en cuenta que la validación que ve es solo en un mini lote aleatorio del conjunto de validación, pero esto representa muy bien la pérdida de prueba en un conjunto de datos de validación lo suficientemente grande.

@ Costyv95 ok, gracias

Hola @ Costyv95 . Tengo problemas para generar valores de pérdida de valor. Modifiqué todos los archivos siguiendo sus instrucciones y códigos. Estos son los siguientes errores
File "flow", line 6, in <module> cliHandler(sys.argv) File "/home/alxe/ML/darkflow/darkflow/cli.py", line 26, in cliHandler tfnet = TFNet(FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/build.py", line 64, in __init__ self.framework = create_framework(*args) File "/home/alxe/ML/darkflow/darkflow/net/framework.py", line 59, in create_framework return this(meta, FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/framework.py", line 15, in __init__ self.constructor(meta, FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/yolo/__init__.py", line 20, in constructor misc.labels(meta, FLAGS) #We're not loading from a .pb so we do need to load the labels File "/home/alxe/ML/darkflow/darkflow/net/yolo/misc.py", line 36, in labels with open(file, 'r') as f: TypeError: coercing to Unicode: need string or buffer, NoneType found

¿Puede imprimir el valor de la variable de archivo?

@ Costyv95 no, no puedo. Esto es lo que ejecuto:
python flow --model cfg/tiny-yolo-voc-1c.cfg --train --dataset train/images --annotation train/annotations --load bin/yolo.weights --gpu 1.0 --epoch 300

Lo que quise decir con "file variabile" es el variabile usado en la línea 36 en misc.py, porque realmente no puedo entender qué está mal con su código.
¿No tienes ningún argumento --val_dataset? ¿Cómo implementó el cambio? ¿Dividió el conjunto de datos dentro del código o agregó el argumento --val_dataset?

@ Costyv95 Hola, he copiado y pegado tus archivos en diff.zip y luego intenté entrenar con el comando

"flow --train --model ./coke/yolo-coke-2c.cfg --annotation ./coke/train/annotations --dataset ./coke/train/images --gpu 1.0 --batch 8 --save 1000 --val_dataset ./coke/validation/images --val_annotation ./coke/validation/annotations

Pero todavía tiene un error
'
[ nkhanh @ localhost khanh] $ ./run_coke.sh

Analizando ./coke/yolo-coke-2c.cfg
Cargando Ninguno ...
Terminado en 0.0001392364501953125s
Rastreo (llamadas recientes más última):
Archivo "/ usr / local / bin / flow", línea 6, en
cliHandler (sys.argv)
Archivo "/usr/local/lib64/python3.6/site-packages/darkflow/cli.py", línea 26, en cliHandler
tfnet = TFNet (BANDERAS)
Archivo "/usr/local/lib64/python3.6/site-packages/darkflow/net/build.py", línea 64, en __init__
self.framework = create_framework (* argumentos)
Archivo "/usr/local/lib64/python3.6/site-packages/darkflow/net/framework.py", línea 59, en create_framework
devuelve esto (meta, BANDERAS)
Archivo "/usr/local/lib64/python3.6/site-packages/darkflow/net/framework.py", línea 15, en __init__
self.constructor (meta, BANDERAS)
Archivo "/usr/local/lib64/python3.6/site-packages/darkflow/net/yolo/__init__.py", línea 20, en el constructor
misc.labels (meta, FLAGS) # No estamos cargando desde un .pb, por lo que necesitamos cargar las etiquetas
Archivo "/usr/local/lib64/python3.6/site-packages/darkflow/net/yolo/misc.py", línea 36, ​​en etiquetas
con open (archivo, 'r') como f:
TypeError: objeto str, bytes u os.PathLike esperado, no NoneType
'

@ khanh1412
en misc.py line29
cámbielo a su archivo de etiquetas personalizadas.
file = 'etiquetas.txt'

PD: Es una solución temporal.

@ Costyv95
¿Cómo se entiende eliminar '[' y ']'?

Entrar en formación ...
Rastreo (llamadas recientes más última):
Archivo "flujo", línea 6, en
cliHandler (sys.argv)
Archivo "/Users/sisyphus/darkflow/darkflow/cli.py", línea 33, en cliHandler
print ('Ingresar entrenamiento ...'); tfnet.train ()
Archivo "/Users/sisyphus/darkflow/darkflow/net/flow.py", línea 54, en tren
arg_steps = self.FLAGS.steps [1: -1] # eliminar '[' y ']'
TypeError: el objeto 'NoneType' no es subscriptable

hola @ Costyv95

¿Dónde debo agregar tf.summary.FileWriter para la validación para visualizar el gráfico de pérdida de validación usando tensorboard?

Gracias

@ Costyv95 Probé su archivo zip, diff.zip. Pero la terminal me dice que --val_dataset es un argumento inválido. ¿Necesito cambiar otros archivos?

@ Costyv95 Probé su archivo zip, diff.zip. Pero la terminal me dice que --val_dataset es un argumento inválido. ¿Necesito cambiar otros archivos?

Debe reemplazar todos los archivos, incluidos los de yolo-data y yolov2-data. simplemente debe copiar y pegar respectivamente en las carpetas relacionadas cambiando sus nombres con solo "datos" para simplemente cambiar el archivo en ellas.

@khanhhh
agregue un código “self.define ('labels', 'labels.txt', 'ruta al archivo de etiquetas')” a "def setDefaults (self):" en "darkflow \ defaults.py", luego puede usar " --labels xxx.txt "como antes.

¡¡¡¡¡¡¡¡Muchas gracias!!!!!!!!

El 25 de mayo de 2019, a las 3:11 a. M., Jack [email protected] escribió:

@KhanhHH https://github.com/KhanhHH
agregue un código “self.define ('labels', 'labels.txt', 'ruta al archivo de etiquetas')” a "def setDefaults (self):" en "darkflow \ defaults.py", luego puede usar " --labels xxx.txt "como antes.

-
Estás recibiendo esto porque comentaste.
Responder a este correo electrónico directamente, visualizarla en GitHub https://github.com/thtrieu/darkflow/issues/264?email_source=notifications&email_token=AEIP7DOZYIFBYZHV22RVIADPXD7ELA5CNFSM4DNH2ANKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODWHLNQQ#issuecomment-495892162 , o silenciar el hilo https://github.com/notifications/ unsubscribe-auth / AEIP7DPOGFQ2EYSSZFPZSL3PXD7ELANCNFSM4DNH2ANA .

@ Costyv95
Hola, quiero saber cómo establecer la ruta "gs: // bucket_hand_detection_2" en "darkflow \ defaults.py". mi python (3.7) no puede encontrar esta ruta, arroja un error; y que dosis representa el "balde"?

@ Costyv95
Hola, quiero saber cómo establecer la ruta "gs: // bucket_hand_detection_2" en "darkflow \ defaults.py". mi python (3.7) no puede encontrar esta ruta, arroja un error; y que dosis representa el "balde"?

El mismo error, pero los puntos de control se guardan normalmente, así que no sé cuál es este error @ Costyv95

gracias @ Costyv95!

Hola, @ Costyv95 Yolo entrena y genera una pérdida de validación, pero después de 1000 pasos arroja un error. File FileNotFoundError: [Errno 2] No existe tal archivo o directorio: 'gsutil': 'gsutil'.

Error:
error

@akmeraki hola me encontré con el mismo problema, ¿encontraste alguna solución sobre este error?

@ zhe0503 @akmeraki Espero que no sea demasiado tarde, pero todo lo que hice fue escribir "pip install gsutil" y resolvió el problema.

Hola chicos.
¿Qué debo hacer si quiero obtener la precisión de todo el modelo entrenado?
Por ejemplo, estoy entrenando mi modelo y dejo de entrenar en algún momento. Ahora tengo el último punto de control guardado y quiero calcular la precisión hasta el último punto de control.
Los archivos de la carpeta cpkt se nombran como,

control
yolo-nuevo-50.data-00000-de-00001
yolo-new-50.index
yolo-new-50.meta
yolo-new-50.profile

Agradecería a los chicos de ayuda.

@ Costyv95
Seguí sus amables instrucciones cuidadosamente, pero parece que train.py no reconoce los argumentos --val _... ¿Sería tan amable de ayudarme? El error es el siguiente:
ERROR - Argumento no válido: --val_dataset

Esto sucede porque el código que le di tiene algunas modificaciones para la tasa de aprendizaje adaptativo y hay un cambio más que debe hacer. Lo encuentras aquí: 124d55d

Y debe agregar --val_dataset y val_annotation a los argumentos para tener una pérdida de validación.

No funciona para mí. Recibo un error de la siguiente manera:
ERROR - Argumento no válido: --val_dataset

¿Fue útil esta página
0 / 5 - 0 calificaciones