[Percepción de depuración] Resuelva errores con la idea de BFS (recorrido primero en amplitud)

Cero Prólogo

Esta es la percepción temporal del autor al depurar en medio de la noche. Debido a que el proceso de depuración esta vez es relativamente difícil, vale la pena resumirlo.

En este blog, no obtendrá conocimientos técnicos, pero puede inspirarse en la capa de trabajo de depuración. Esto puede ayudar a avanzar en su trabajo de código de otras maneras.

1. Descripción del problema de depuración y razonamiento lógico

1.1 Descripción del problema

Cuando el autor implementó el sistema de aprendizaje profundo en el entorno de producción, surgieron algunos problemas.

Figura 1: El servidor intentó construir sobre el sistema Windows y los resultados de la reconstrucción 3D Figura 1: El servidor intentó construir sobre el sistema Windows y los resultados de la reconstrucción 3DFigura 1: El servidor y los resultados de la reconstrucción 3D intentaron construir sobre el sistema de Windows

Figura 2: El servidor intentó construir sobre el sistema Linux y los resultados de la reconstrucción 3D Figura 2: El servidor intentó construir sobre el sistema Linux y los resultados de la reconstrucción 3DFigura 2: El servidor y los resultados de la reconstrucción 3D intentaron construir en el sistema Linux

No es difícil de ver desde aquí: los dos resultados de reconstrucción 3D son muy diferentes , el primero todavía es apenas legible, pero el segundo es difícil de ver.

¿Por qué esto es tan?

1.2 Encuentra la causa

El proceso de reconstrucción 3D consiste en extraer el contorno y reconstruirlo de acuerdo con la máscara de salida. Si hay un problema con el resultado de la reconstrucción, debe haber un problema con la secuencia de la máscara de salida.

Entonces, el autor comparó la salida de máscaras de los dos entornos de Windows y Linux:

Figura 3: Salida de secuencia de imágenes de máscaras en dos entornos de sistema Figura 3: Salida de secuencia de imágenes de máscaras en dos entornos de sistemaFigura 3: salida de secuencia de imágenes de máscara en dos entornos de sistema

  • La figura de arriba es la secuencia de máscaras escritas y emitidas por el sistema de Windows, de mask_0.pngamask_19.png
  • La siguiente figura es la secuencia de máscara escrita y emitida por el sistema Linux, y las imágenes también se nombran de mask_0.pngamask_19.png

Después de una comparación cuidadosa, se encuentra que la secuencia de ventanas es básicamente normal, mientras que la secuencia de máscaras de imágenes de Linux, aunque el resultado de la predicción es correcto con la imagen de arriba, pero hay un problema con la secuencia de salida .

La imagen de abajo mask_0.pngcorresponde a la imagen de arriba mask_8.png, ¿por qué es así?

1.3 Razón revelada

De hecho, es un problema de clasificación de archivos de Linux.

Cuando el sistema de Windows lee archivos, utiliza os.listdir()funciones para clasificarlos según el orden predeterminado, y el método de clasificación de Windows es el nombre de los archivos.

Sin embargo, el método de clasificación de archivos del sistema Linux se basa en el tiempo de creación (tiempo de modificación) del archivoos.listdir() , es decir, la secuencia de lectura final de la función en Linux puede ser así:

images: ['mask_8.png', 'mask_0.png', 'mask_5.png', 'mask_3.png', ..., 'mask_17.png']

Es decir, en orden aleatorio. Luego, durante la inferencia, en la función del conjunto de datos llamada __getitem__, el esquema de lectura debe escribirse:

self.image_names = os.listdir(image_folder)
self.image_names.sort(key=lambda x: int(x.split(".")[0].split("_")[2]))

Eso es agregar una oración a continuación para ordenar la lista de modo que la función posterior de leer fotos se pueda leer en orden.

La salida en orden estándar solo es posible si se lee secuencialmente.

2. Experiencia de depuración y reflexión

2.1 Resumen

Esta respuesta parece muy simple, y en realidad es muy simple, pero ¿cómo pensó el autor al respecto? Vale la pena registrar esto, y es un hito en la carrera de depuración del autor.

Cuando entramos en contacto con un problema, como este, al principio estábamos perdidos. No sabíamos qué causaba que la secuencia de imágenes de salida fuera problemática, porque el sistema era relativamente grande.

¿Hay algún problema con la forma de cv2.imwrite() al generar? ¿O hay un problema con la lógica del procesamiento intermedio? ¿O es un problema al leer? ¿Cuáles son las causas profundas de estos grandes problemas?

Una vez que el sistema de códigos sea enorme, habrá más problemas, porque realmente se desconoce qué enlace tiene un problema, en otras palabras: cualquier enlace puede tener un problema.

2.2 El método de craqueo

El proceso de resolución de errores debe ser un proceso gradual y lógico. **Él no saldrá en un misterioso proceso de dar vueltas y vueltas. Debido a que el código en sí es un trabajo lógico, para resolver este problema, debe confiar en un método lógico.

Recordando el proceso del autor para resolver todo el problema, pasé de la confusión inicial a la posterior clarificación de ideas, progresivamente, capa por capa, confirmando constantemente qué lugares no deben ser un problema y qué lugares pueden tenerlo , y razoné capa por capa. capa, finalmente encontró el problema.

Aquí quiero simplemente tomar la idea de resolver este error como ejemplo para probar el argumento anterior:

  1. Se encuentra que la salida de los dos sistemas operativos es diferente y se sospecha que es un problema con el sistema operativo
  2. Se encuentra que las secuencias de imágenes que emiten los dos sistemas son diferentes. Puede ser la última cv2.imwrite('mask_{k}.png', xxx), etc. Hay un problema con la función de la imagen de salida final.
  3. Después de la inspección, se encuentra kque es solo un índice, y no hay problema con el método de determinación de este índice, lo que significa que no es un problema en la capa de salida, y necesitamos buscar más (este paso es en realidad afirmar algo y negar algo, esta afirmación y negación es muy importante para decidir si se puede seguir deduciendo )
  4. Investigar si es un problema que surge durante el razonamiento.
  5. Verifique estrictamente el proceso de razonamiento y descubra que no hay ningún problema con el código de razonamiento, luego avance para ver si hay un problema con la carga del conjunto de datos.
  6. Encuentre que puede haber problemas con la carga del conjunto de datos, solo en os.listdir()la función, lo que puede causar desorden.
  7. Efectivamente, esta función está fuera de servicio en el sistema Linux, las imágenes de entrada están fuera de servicio y la salida definitivamente no estará en el orden correcto, así que lo corrijo.

Hasta ahora, se ha encontrado el problema y se ha hecho una solución.

Mirando hacia atrás en todo el proceso, descubrí que el proceso de depuración parece haber usado inadvertidamente BFSla idea de recorrido primero en amplitud en los algoritmos de uso común.

Para comprobar el contenido del código capa por capa, la clave es lo que se afirma y lo que se niega.

Este proceso de afirmar y negar 剪枝es similar a lo que suele decirse en los algoritmos.

En este punto, algunas cosas parecen estar unidas:

  • algoritmo común acm
  • depuración y lógica
  • Plan de solución de problemas de depuración y plan sí o no (poda)
  • Código de proyecto construcción y arquitectura.

Algunas de las cosas aprendidas en el pasado se reúnen en este momento.

Después de esto, la práctica en el código se ha elevado a un nivel superior.

Supongo que te gusta

Origin blog.csdn.net/Samurai_Bushido/article/details/130278981
Recomendado
Clasificación