Cómo aprender rápidamente el algoritmo de red neuronal para identificar códigos de verificación
Lo que estoy estudiando es un método para identificar el código de verificación sobre un fondo blanco y negro después de interceptar la imagen del código de verificación, en la que solo hay líneas de interferencia del código de verificación.
Aprendizaje automático para identificar códigos de verificación simples
Hora 2016-10-15 22:46:31 Blog de Suifeng
Tema minería de datos
Hay muchos artículos sobre el reconocimiento de códigos de verificación en Internet y hay muchos tutoriales de expertos en reconocimiento de imágenes, pero la mayoría de ellos son demasiado profesionales y los no profesionales los leerán como biblias. Sin embargo, con la popularidad del aprendizaje automático, ha aparecido una gran cantidad de herramientas de aprendizaje automático de código abierto, lo cual es una buena noticia para la mayoría de los cabrones como yo. Dado que el proyecto reciente involucra algunas cosas relacionadas con el aprendizaje automático, he estado aprendiendo sobre el aprendizaje automático recientemente. Para cosas relacionadas, esta vez el reconocimiento del código de verificación se puede considerar como una práctica. Este artículo se considera una nota durante el estudio, por lo que inevitablemente habrá algunos errores en el artículo y el artículo no será correcto. Bienvenida la guía de todos los maestros.
Debido a que no soy un profesional relevante, no discutiré los algoritmos relevantes en este artículo en detalle, sino que me centraré principalmente en el combate real.
Trabajo de preparación
Se utilizaron principalmente algunos marcos de aprendizaje automático de código abierto y algunas herramientas auxiliares.
Scikit-Learn es un módulo de aprendizaje automático de Python muy conocido, principalmente por su sencillo funcionamiento.
Pybrain es un módulo de aprendizaje automático de Python, que toma principalmente la red neuronal como núcleo. Todos los métodos de entrenamiento utilizan la red neuronal como ejemplo.
Dispositivo de reconocimiento de imágenes pytesseract. Este artículo se utiliza principalmente para preprocesar muestras de entrenamiento.
Biblioteca de procesamiento de imágenes PIL Python.
Análisis de problemas
En primer lugar, antes del trabajo específico, debemos ver qué problemas necesitamos resolver. Luego, la identificación del código de verificación puede considerarse como un problema de clasificación. Entonces, el número de imágenes del código de verificación es en realidad un problema de clasificación del número del 0 al 9. La parte más difícil del reconocimiento del código de verificación es cómo cortar el código de verificación en imágenes de un solo carácter. para cortar imágenes métodos de extracción de características, como el método de proyección vertical, el método de corte equidistante, etc. Entre ellos, el método de corte equidistante es relativamente simple, pero la precisión del reconocimiento para códigos de verificación un poco más complejos es muy baja, porque el método de corte equidistante corta el código de verificación de acuerdo con el mismo ancho. Para caracteres con diferentes anchos y tamaños, incluso si. Cortarlo no puede expresar muy bien las características de los caracteres, por lo que a veces es necesario cortar el código de verificación en caracteres individuales primero. Características de los caracteres, por lo que a veces es necesario realizar una serie de preprocesamiento en la imagen, como corrección de caracteres, etc., y luego usar el método de proyección vertical para recortar de acuerdo con el tamaño proyectado en los ejes x e y. eje.
Para la proyección vertical, debemos considerar que el conjunto de entrenamiento es consistente en tamaño. Debido al recorte sin nivel, los píxeles de cada imagen deben ser diferentes, por lo que debemos rellenarlos para que los tamaños sean consistentes. , lo cual es un poco complicado de todos modos.
Aquí tomamos principalmente el corte equidistante como ejemplo. Debido a que la operación es relativamente simple, la máscara también selecciona de 0 a 9 códigos de verificación numéricos puros para la identificación. El código es el siguiente.
Esta La distancia entre las imágenes parece básicamente la misma, por lo que es relativamente fácil segmentar la imagen en cuatro partes y puede usar cada pieza para entrenar el reconocimiento.
Al utilizar el aprendizaje automático para capacitación e identificación, debemos considerar la selección de funciones. Generalmente, existe un proceso estándar para identificar códigos de verificación.
No nos preocupa el. identificación de códigos de verificación El color del código no es el significado de los caracteres. Por lo tanto, se requieren escala de grises, binarización y eliminación de ruido en el procesamiento de imágenes. Por ejemplo, si se eliminan las líneas de interferencia, existen los algoritmos correspondientes para la eliminación de ruido.
También hay algoritmos correspondientes para implementar, que no se discutirán uno por uno aquí. La binarización es en realidad presentar la imagen en dos colores, ya sea negro o blanco. La ventaja de esto es que se pueden usar 0 y 1 durante el procesamiento de características. Representa el blanco y el negro. Lo que representan los colores 0 y 1 depende de las preferencias personales.
En este caso, la imagen se procesa a través de pasos como la binarización para la extracción de características, y los píxeles negros se marcan como 1 y los píxeles blancos se marcan como 0, de modo que la representación digital de la imagen pueda En este momento, las características Las dimensiones son iguales al tamaño de los píxeles de la imagen. En última instancia, la imagen se representará a lo largo del eje X o el eje Y, es decir, los valores etiquetados de los píxeles. combinado en una fila, por ejemplo
1111100000000000010
111000000000000
se representa como 1111100000000000010111000000000000000000000, de modo que cada imagen se pueda representar mediante una fila de valores 0 y 1 .
Después de la extracción de características, obtenemos la representación matemática de la imagen. El siguiente paso es entrenar el modelo. Como se mencionó anteriormente, el reconocimiento de imágenes es un problema de clasificación, por lo que en el aprendizaje automático utilizo principalmente dos modelos. para el entrenamiento, SVM admite máquinas vectoriales y redes neuronales BP para entrenar el modelo, SVM usa el modelo en el paquete de aprendizaje automático scikit-learn, SVM usa el paquete de aprendizaje automático learn y la red neuronal usa Pybrain.
En cuanto a los algoritmos de la red neuronal SVM y BP, es mejor que busque artículos relevantes en Internet para saber qué algoritmo puede resolver qué problema y cómo es su principio. Estudiantes competentes Puedes deducir estos dos algoritmos.
Práctica
En la parte de análisis del problema, tenemos una comprensión general de la identificación de códigos de verificación, por lo que el contenido principal de esta parte es la implementación específica mencionada anteriormente.
En primer lugar, debemos comprender que tanto el algoritmo SVM como el modelo de red neuronal son aprendizaje supervisado, lo que significa que debemos etiquetar las muestras, es decir, etiquetar el número representado por cada imagen, pero el número real El problema es que si la cantidad de datos es pequeña, podemos etiquetarla manualmente, pero cuando la cantidad de datos es grande, el etiquetado manual puede no ser realista, por lo que para las imágenes, lo mismo, después de completar el corte, solo hay un Hay pocos números que desee etiquetar, por lo que debemos preprocesar las imágenes cortadas, es decir, etiquetarlas. Soy vago, así que no las etiquetaré una por una, por lo que necesito usar OCR para cortarlas aquí. están preclasificados La precisión del OCR en el reconocimiento de texto único sigue siendo aceptable. Después de la clasificación previa del OCR, solo necesitamos corregir esos errores de clasificación. error. Solo necesitamos corregir esas imágenes mal clasificadas, lo que puede reducir en gran medida la carga de trabajo.
Hay varios pasos para lograr este objetivo:
Adquisición de imágenes
Preprocesamiento de imágenes (incluido corte de imágenes, binarización y mejora de imágenes)
p>
Anotaciones de preclasificación de imágenes y anotaciones de corrección manual de errores
Extracción de características
Entrenamiento y predicción de modelos
Adquisición de imágenes
El reconocimiento de imágenes es relativamente simple. La recopilación de imágenes es relativamente simple y no requiere demasiada elaboración, como se muestra en el siguiente código
La imagen descargada se guardará en la ubicación especificada de acuerdo con la marca de tiempo
Preprocesamiento de la imagen y recorte de imagen
Preprocesar y recortar la imagen mediante recorte isométrico
La imagen recortada es la siguiente
Preclasificación de la imagen mediante corte pitométrico
La clasificación previa de imágenes es la siguiente > Utilice pytesseract para clasificar previamente las imágenes segmentadas para reducir la carga de trabajo.
El código específico es el siguiente
La precisión del efecto de clasificación del OCR debe alcanzar más del 50%, y el resto es preclasificar las imágenes con corrección de errores manual.
Representaciones de clasificación de Ocr
Resultados después de la corrección y anotación manual de errores
Cada directorio representa una etiqueta de categoría.
Extracción de características
La extracción de características se describe en detalle en Análisis de problemas.
El código clave es el siguiente
La representación matemática de la imagen final se registrará en /Users/iswin/Downloads/yzm/traindata/train_data.txt, y el formato de los datos es como se muestra en la siguiente figura
La estructura alámbrica roja representa la representación numérica de la imagen, el último dígito 0 representa el tipo de imagen, agregué la etiqueta a la última línea por conveniencia.
Clasificación del modelo SVM
La implementación de svm aquí se implementa usando scikit-learn. Para usar scikit-learn, vaya al sitio web oficial para ver los tutoriales relevantes. Para hablar sobre la selección de parámetros de SVM. Con respecto al problema, todos sabemos que SVM admite una variedad de núcleos, como el núcleo gaussiano, el núcleo lineal, el núcleo poli y el núcleo sgmoide. Núcleos poli y sgmoide, funciones del núcleo poli y sgmoide, pero elegir dicha función del núcleo es realmente un problema para los estudiantes que no están familiarizados con ella al principio, por lo que aquí se utiliza GridSearchCV de scikit-learn para optimizar la selección de parámetros. El efecto final del uso del núcleo gaussiano aquí sigue siendo bueno, por lo que el núcleo gaussiano se utiliza directamente durante el entrenamiento.
Para facilitar el uso de la predicción, los resultados del entrenamiento se conservan aquí utilizando el módulo joblib. Para facilitar la evaluación del modelo, se utilizó una validación cruzada quíntuple para examinar los resultados.
La precisión del resultado final es precisión: 0,96 (/- 0,09)
El código específico es el siguiente:
Ejemplo de predicción, vea el efecto
Clasificación del modelo de red neuronal BP
La red neuronal BP también se denomina red neuronal de retroalimentación negativa, que es una red de alimentación directa de múltiples capas entrenada de acuerdo con el algoritmo de retropropagación de errores. La red neuronal BP es uno de los modelos de red neuronal más utilizados en la actualidad. Después de la red neuronal BP, es la CNN más utilizada en aprendizaje profundo, es decir, la red neuronal convolucional, que también se está estudiando recientemente.
Este artículo utiliza una red neuronal BP de tres capas para entrenar el conjunto de entrenamiento, es decir, la capa de entrada, 2 capas ocultas y la capa de salida. En cuanto a la red neuronal BP en sí, cabe señalar lo siguiente. Aquí está la selección de la función de activación y para problemas de clasificación múltiple. Las funciones de activación incluyen principalmente sigmod, tanh y relu. Generalmente, cada función de activación se ejecuta una vez y se ve el efecto final.
La clasificación de modelos de redes neuronales aquí implica principalmente aprender el uso de Pybrain y la comprensión básica de las redes neuronales BP. La capa de entrada usa LinearLayer, que es una capa de entrada lineal, y la capa oculta usa SigmoidLayer. lo que significa que la función de activación es La capa oculta y la capa de salida de sigmod usan SoftmaxLayer porque existen múltiples problemas de clasificación. Debido a que la capa de salida es un problema de clasificación múltiple, se utiliza SoftmaxLayer. Al final, la posición de índice con el valor más grande en el resultado del cálculo de la red neuronal es la categoría del código de verificación predicha, es decir, el valor está entre 0 y 9.
Además de la documentación oficial sobre Pybrain, hay dos formas de construir una red neuronal, una es construir usando la función buildNetwork y la otra es usar la función FeedForwardNetwork.
Al crear FeedForwardNetwork, tenga cuidado de agregar manualmente compensaciones de sesgo a cada capa; de lo contrario, los resultados pueden ser muy pobres. No lo agregué durante el experimento y me tomó mucho tiempo descubrirlo. El código fuente de la función buildNetwork descubrió que no se agregó Bias. Una cosa a tener en cuenta es que la función de convergencia de pasos de iteración tiene *maxEpochs=500. Esto se ajusta según la situación. Los datos deben inicializarse según su formato.
Aquí, además de fijar la dimensionalidad de la capa de entrada (es decir, la dimensionalidad del conjunto de entrenamiento del código de verificación) y la salida, también se puede ajustar el número de neuronas en la capa oculta. Si está interesado, puede hacerlo usted mismo y ver los resultados.
El modelo se evaluó simplemente mediante validación cruzada 10 veces. La tasa de error en el error total fue de aproximadamente 0,062:0,062. El efecto es un poco peor que el de SVM. La precisión debe mejorarse mediante el ajuste de parámetros. , pero el punto clave es seguir estudiando.
Conjunto de entrenamiento de muestra:/Users/iswin/Downloads/yzm/traindata/train_data_uniq.txt
El código principal es el siguiente:
Ejemplo de predicción p>
Resumen
A través de este pequeño experimento, al menos tengo una comprensión general del aprendizaje automático y los algoritmos relacionados. Tengo un conocimiento general del aprendizaje automático y los algoritmos relacionados. Al mismo tiempo, como personal de seguridad, al menos sé cómo usar el marco de aprendizaje automático de código abierto para construir mi propio modelo. Inevitablemente habrá errores en las notas. y todos son bienvenidos a dar opiniones.