Tasa alta de falsos positivos de Tensorflow y problema de supresión no

Tasa alta de falsos positivos de Tensorflow y problema de supresión no máxima

Estoy entrenando la detección de objetos de Tensorflow en Windows 10 usando faster_rcnn_inception_v2_coco como modelo preentrenado. Estoy en Windows 10, con tensorflow-gpu 1.6 en NVIDIA GeForce GTX 1080, CUDA 9.0 y CUDNN 7.0.

Mi conjunto de datos contiene solo un objeto, "Pistola", y 3000 imágenes (2700 conjuntos de trenes, 300 conjuntos de prueba). El tamaño de las imágenes es de ~100x200 a ~800x600.

Entrené este modelo para 55k iteraciones, donde el mAP fue ~0.8 y el TotalLoss parece converger a 0.001. Sin embargo, al ver la evaluación, hay muchos cuadros delimitadores múltiples en el mismo objeto detectado (por ejemplo, this y esto), y muchos falsos positivos (casa detectada como pistola). Por ejemplo, en esta foto tomada por mí (más tarde se aplicó el filtro de desenfoque), el modelo detecta una persona y un automóvil. como pistolas, así como la correcta detección.

El conjunto de datos se carga aquí, junto con los tfrecords y el mapa de etiquetas. Usé este archivo de configuración, donde las únicas cosas que cambié son: num_classes a 1, el fine_tune_checkpoint, input_path y label_map_path para entrenar y evaluar, y num_examples. Como pensé que los cuadros múltiples no son un problema de supresión máxima, cambié el score_threshold (línea 73) de 0 a 0.01 y el iou_threshold (línea 74) de 1 a 0,6. Con los valores estándar el resultado fue mucho peor que esto.

¿Qué puedo hacer para tener una buena detección? ¿Qué debo cambiar? Tal vez extraño algo sobre el ajuste de parámetros...

Gracias

Mostrar la mejor respuesta

Creo que antes de sumergirse en el ajuste de parámetros (es decir, el score_threshold mencionado) tendrá que revisar su conjunto de datos.

No revisé todo el conjunto de datos que compartiste, pero desde una vista de alto nivel, el principal problema que encontré es que la mayoría de las imágenes son realmente pequeñas y con una relación de aspecto muy variable.

En mi opinión, esto entra en conflicto con esta parte de su archivo de configuración:

image_resizer {
  keep_aspect_ratio_resizer {
    min_dimension: 600
    max_dimension: 1024
  }
}

Si tomas una de las imágenes de tu conjunto de datos y aplicas manualmente esa transformación verás que el resultado es muy ruidoso para imágenes pequeñas y muy deformado para muchas imágenes que tienen una relación de aspecto diferente.

Le recomiendo encarecidamente que reconstruya su conjunto de datos con imágenes con más definición y tal vez intente preprocesar las imágenes con una relación de aspecto inusual con relleno, recorte u otras estrategias.

Si quiere quedarse con las imágenes pequeñas, al menos tendría que cambiar las dimensiones mínimas y máximas del image_resizer pero, según mi experiencia, el mayor problema aquí es el conjunto de datos y lo haría invierta el tiempo en tratar de arreglar eso.

P.

No veo el falso positivo de la casa como un gran problema si consideramos que es de un dominio totalmente diferente de su conjunto de datos.

Probablemente podría ajustar la confianza mínima para considerar las detecciones como positivas verdaderas y eliminarlas.

Si tomas al ganador actual de COCO y lo alimentas con imágenes extrañas como de dibujos animados, verás que genera muchos falsos positivos.

Así que es más como un problema con los enfoques actuales de detección de objetos que no son robustos a los cambios de dominio.

Gracias por tu sugerencia. Mi conjunto de prueba será de imágenes de 800x600, así que edito keep_aspect_ratio_resizer con una dimensión mínima de 600 y una dimensión máxima de 800 y eliminé de mi conjunto todas las imágenes con un tamaño <= 400 o>= 1000 y aquellas con una relación de aspecto <= 1.5 o>= 2.0. Además, como sugirió implícitamente, todas las imágenes con diferentes dominios también se eliminan. Sin embargo, el problema sigue ahí: después de más de 80k iteraciones, todavía tengo un falso positivo como este imgur.com/qb1gOb8 , con autos detectados como pistolas con alta confianza. ¿Tienes otros consejos?

Creo que en esa foto en particular el problema es el desenfoque. Si desea que su modelo sea robusto frente a ese tipo de imágenes, debe agregar imágenes con un desenfoque similar a su conjunto de entrenamiento.

Yo agrego el desenfoque después de la detección: no hay desenfoque en las imágenes procesadas.

Otro ejemplo de falso positivo es este: en el mismo video (700x448), se detecta correctamente la pistola imgur.com/R8CLNEY , pero, cuando la pistola desaparece, hay un falso positivo "estable" que cubre el 50% de la imagen imgur. com/RHJigqh

@darkdrake, ¿has superado el tema de los falsos positivos? Si es así, ¿pueden guiarme para superar esto ya que también me ocurre el mismo problema?

Mucha gente que veo en línea se ha encontrado con el mismo problema al usar la API de Tensorflow. Creo que hay algunos problemas inherentes con la idea o el proceso de usar modelos preentrenados con clasificadores personalizados en casa. Por ejemplo, la gente quiere usar SSD Mobile o Faster RCNN Inception para detectar objetos como "Persona con casco", "pistola" o "caja de herramientas", etc. El proceso general es alimentar imágenes de ese objeto, pero la mayoría de el tiempo, no importa cuántas imágenes... 200 a 2000, aún terminas con falsos positivos cuando lo ejecutas en tu escritorio.

El clasificador de objetos funciona muy bien cuando le muestra el objeto en su propio contexto, pero termina obteniendo una coincidencia del 99 % en elementos cotidianos como la ventana de su habitación, su escritorio, el monitor de su computadora, el teclado, etc. La gente ha mencionado la estrategia de introducir imágenes negativas o imágenes blandas. Creo que el problema tiene que ver con el contexto limitado en las imágenes que usa la mayoría de la gente. Los modelos preentrenados fueron entrenados con más de una docena de clasificadores en una gran variedad de entornos, como en un ejemplo, podría ser un automóvil en la calle. La CNN ve el automóvil y luego todo en esa imagen que no es un automóvil es una imagen negativa que incluye la calle, los edificios, el cielo, etc. En otra imagen, puede ver una botella y todo lo que en esa imagen incluye escritorios, tablas, ventanas, etc. Creo que el problema con el entrenamiento de clasificadores personalizados es que es un problema de imagen negativa. Incluso si tiene suficientes imágenes del objeto en sí, no hay suficientes datos de ese mismo objeto en diferentes contextos y fondos. Entonces, en cierto sentido, no hay suficientes imágenes negativas, incluso si conceptualmente no deberías necesitar imágenes negativas. Cuando ejecuta el algoritmo en casa, obtiene falsos positivos por todas partes identificando objetos alrededor de su propia habitación. Creo que la idea de transferir el aprendizaje de esta manera es errónea. Terminamos viendo muchos tutoriales geniales en línea de personas que identifican naipes, Millenium Falcons, etc., pero ninguno de esos modelos se puede implementar en el mundo real, ya que todos generarían un montón de falsos positivos cuando ve algo fuera de su conjunto de imágenes. La mejor estrategia sería volver a entrenar la CNN desde cero con múltiples clasificadores y agregar los deseados allí también. Sugiero volver a introducir un conjunto de datos anterior de ImageNet o Pascal con 10-20 clasificadores preexistentes y agregar los suyos propios y volver a entrenarlo.