java - recognition - Mejora del algoritmo OCR
firebase text recognition (2)
Estoy creando un OCR basado en Java. Mi objetivo es extraer texto de un archivo de video (post-procesamiento).
Ha sido una búsqueda difícil, tratar de encontrar un OCR gratuito y de código abierto que funcione exclusivamente en Java. Descubrí que Tess4J es la única opción popular, pero dada la necesidad de la interfaz nativa, de alguna manera me sentí inclinado a desarrollar el algoritmo desde cero.
Necesito crear un OCR confiable que identifique correctamente los alfabetos en inglés (solo tipografías computarizadas, no texto manuscrito) con una precisión razonable, dado que la región en la que se encuentra el texto en el marco del video está predefinida. También podemos suponer que el color del texto está dado.
Lo que he hecho hasta ahora:
(Todo el procesamiento de imágenes se realiza mediante enlaces de Java para openCV)
He extraído características para entrenar a mi clasificador usando:
A. Intensidades de píxeles, después de muestrear la imagen del personaje a una resolución de 12 X 12. (144 vectores de características)
B. Transformada de wavelet de Gabor a través de 8 ángulos diferentes (0, 11.25, 22.5 ... etc) y la energía calculada utilizando el valor cuadrático medio de la señal para todos estos ángulos. (8 vectores de características)
A + B me da el vector de características de las imágenes. (Total de 152 vectores de características)
Tengo 62 clases para la clasificación, a saber. 0,1,2 ... 9 | a, b, c, d ... y, z | A, B, C, D ... Y, Z
Entreno al clasificador utilizando 20 x 62 muestras (20 para cada clase).
Para la clasificación, he utilizado los siguientes dos enfoques:
A. ANN con 1 capa oculta (de 120 nodos). La capa de entrada tiene 152 nodos y la salida tiene 62. La capa oculta y de salida tiene una función de activación sigmoide y la red se entrena mediante la propagación de la parte posterior resistente.
B. Clasificación de kNN para las 152 dimensiones completas.
Donde estoy:
k-La búsqueda de vecinos más cercanos está resultando ser un mejor clasificador que la red neuronal (hasta ahora). Sin embargo, incluso con kNN, me resulta difícil clasificar letras como: O .
Además, está clasificando. como Z ... para nombrar algunas de las anomalías.
Lo que estoy buscando:
Quiero descubrir lo siguiente:
¿Por qué se está llevando a cabo la ANN? ¿Qué configuración de red debo usar para aumentar el rendimiento? ¿Podemos ajustar la ANN para obtener mejores resultados que la búsqueda de kNN?
¿Qué otros vectores de características puedo usar para hacer que el OCR sea más robusto?
Cualquier otra sugerencia para la optimización del rendimiento son bienvenidas.
El algoritmo kNN no necesita mucha sintonización, a diferencia de las redes neuronales, por lo que puede obtener un buen rendimiento fácilmente, pero un perceptrón multicapa puede superar a kNN. Actualmente, creo que los mejores resultados se obtienen utilizando el aprendizaje profundo, por ejemplo, debería echar un vistazo a la red neuronal convolucional.
De wikipedia:
Una CNN se compone de una o más capas convolucionales con capas totalmente conectadas (que coinciden con las de las redes neuronales artificiales típicas) en la parte superior. También utiliza pesas atadas y capas de agrupación. Esta arquitectura permite a las CNN aprovechar la estructura 2D de los datos de entrada. En comparación con otras arquitecturas profundas, las redes neuronales convolucionales están comenzando a mostrar resultados superiores tanto en aplicaciones de imagen como de voz. También pueden ser entrenados con backpropagation estándar. Las CNN son más fáciles de entrenar que otras redes neuronales regulares y profundas, y tienen muchos menos parámetros que estimar, lo que las convierte en una arquitectura muy atractiva de usar.
Hablando sobre su MLP, hay una gran cantidad de algoritmos para buscar mejores parámetros, por ejemplo, la búsqueda en cuadrícula o la optimización de enjambre. Me gusta usar un algoritmo genético para ajustar los parámetros de una NN, es bastante simple y produce un buen rendimiento.
Te recomiendo JGap , un bonito marco de algoritmo genético en java, que se puede utilizar de forma JGap :)
Aquí está la presentación de JGAP del algoritmo genético, que sería mejor que cualquiera de mi presentación:
Los algoritmos genéticos (GA) son algoritmos de búsqueda que funcionan a través del proceso de selección natural. Comienzan con un conjunto de muestra de soluciones potenciales que luego evolucionan hacia un conjunto de soluciones más óptimas. Dentro del conjunto de muestra, las soluciones que son pobres tienden a extinguirse mientras que las mejores soluciones se aparean y propagan sus características ventajosas, introduciendo así más soluciones en el conjunto que cuentan con un mayor potencial (el tamaño total del conjunto permanece constante; por cada nueva solución agregada, una antigua uno es eliminado). Una pequeña mutación aleatoria ayuda a garantizar que un conjunto no se estanque y simplemente se llene con numerosas copias de la misma solución.
En general, los algoritmos genéticos tienden a funcionar mejor que los algoritmos de optimización tradicionales porque tienen menos probabilidades de ser desviados por los óptimos locales. Esto se debe a que no utilizan las reglas de transición de un solo punto para pasar de una instancia en el espacio de la solución a otra. En su lugar, los GA aprovechan un conjunto completo de soluciones repartidas por todo el espacio de soluciones, todas las cuales están experimentando en muchos potenciales óptimos.
Sin embargo, para que los algoritmos genéticos funcionen de manera efectiva, se deben cumplir algunos criterios:
Debe ser relativamente fácil evaluar qué tan "buena" es una solución potencial en relación con otras soluciones potenciales.
Debe ser posible dividir una solución potencial en partes discretas que puedan variar independientemente. Estas partes se convierten en los "genes" en el algoritmo genético.
Finalmente, los algoritmos genéticos son más adecuados para situaciones en las que una respuesta "buena" será suficiente, incluso si no es la mejor respuesta absoluta.
Para los vectores de características: ¿normalizaste las intensidades? Tal vez utilice ecualización de histograma.
Para clasificación: Eche un vistazo a t-SNE . Es un método estocástico para reducir características de alta dimensión en un plano 2D más fácil de agrupar.