java - móviles - programacion android pdf 2018
Reconoce un número de una imagen (5)
Intento escribir una aplicación para encontrar los números dentro de una imagen y sumarlos.
¿Cómo puedo identificar el número escrito en una imagen?
Hay muchos cuadros en la imagen que necesito para obtener los números en el lado izquierdo y sumarlos para dar un total. ¿Cómo puedo conseguir esto?
Editar: hice una ojeada de Java tesseract en la imagen, pero no obtuve ningún resultado correcto. ¿cómo puedo entrenarlo?
además
Hice una detección de bordes Obtuve esto:
En la mayoría de los problemas de procesamiento de imágenes que desea aprovechar para aprovechar la mayor información posible. Dada la imagen, hay suposiciones que podemos hacer (y posiblemente más):
- Los recuadros alrededor de los números son consistentes.
- El número a la derecha siempre es 8 (o se conoce antes de tiempo)
- El número de la izquierda es siempre un número
- El número de la izquierda es siempre a mano y escrito por la misma persona
Entonces podemos simplificar el problema usando esas suposiciones:
- Puede usar un enfoque más simple para encontrar los números (coincidencia de plantilla). Cuando tenga las coordenadas de la coincidencia, puede crear una imagen secundaria y restar la plantilla y quedarse con los números que desea darle al motor de OCR. http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html .
- Si conoce los números que debe esperar, puede obtenerlos de otra fuente y no correr el riesgo de errores de OCR. Incluso podría incluir el 8 como parte de la plantilla.
- Puede reducir enormemente el vocabulario (posibles resultados de OCR), según esto, aumentando la precisión del motor OCR. Existe una configuración de lista blanca para que TesseractOCR haga esto (consulte https://code.google.com/p/tesseract-ocr/wiki/FAQ#How_do_I_recognize_only_digits ?).
- La escritura a mano es mucho más difícil de reconocer para un motor de reconocimiento óptico de caracteres (Están diseñados para fuentes impresas). Sin embargo, puede entrenar el motor de OCR para reconocer la "fuente" del autor. (ver http://michaeljaylissner.com/posts/2012/02/11/adding-new-fonts-to-tesseract-3-ocr-engine/ )
Sin embargo, la idea principal es utilizar cualquier suposición que pueda para reducir el problema a problemas menores más simples. Luego, observe qué herramientas están disponibles para resolver cada uno de esos subproblemas individualmente.
También es difícil hacer suposiciones si tiene que preocuparse por el mundo real, por ejemplo, si se van a escanear, tendrá que considerar el sesgo o la rotación de la "plantilla" o los números.
Las redes neuronales son un enfoque típico para este tipo de problemas.
En este escenario, puede considerar cada número manuscrito como una matriz de píxeles. Puede obtener mejores resultados si entrena la red neuronal con imágenes del mismo tamaño que la imagen que desea reconocer.
Puede entrenar la red neuronal con diferentes imágenes de números escritos a mano. Una vez entrenado, si pasa la imagen del número escrito a mano para identificar, devolverá el número más similar.
Por supuesto, la calidad de las imágenes de entrenamiento es un factor clave para obtener buenos resultados.
Lo más probable es que necesite hacer lo siguiente:
Aplique el algoritmo Hough Transform en toda la página, esto debería generar una serie de secciones de página.
Para cada sección que reciba, vuelva a aplicarla. Si la sección actual arrojó 2 elementos, entonces debería tratar con un rectángulo similar al anterior.
Una vez que haya terminado, puede usar un OCR para extraer el valor numérico.
En este caso, recomendaría que eche un vistazo a JavaCV
(OpenCV Java Wrapper) que debería permitirle abordar la parte de Hough Transform. Entonces necesitaría algo similar a Tess4j
(Tesseract Java Wrapper) que debería permitirle extraer los números que Tess4j
.
Como nota adicional, para reducir la cantidad de falsos positivos, es posible que desee hacer lo siguiente:
Recorta la imagen si estás seguro de que ciertas coordenadas nunca contendrán los datos que estás buscando. Esto debería darte una imagen más pequeña para trabajar.
Puede ser conveniente cambiar la imagen a escala de grises (suponiendo que esté trabajando con una imagen en color). Los colores pueden tener un impacto negativo en la capacidad del OCR para resolver la imagen.
EDITAR: según su comentario, dado algo como esto:
+------------------------------+
| +---+---+ |
| | | | |
| +---+---+ |
| +---+---+ |
| | | | |
| +---+---+ |
| +---+---+ |
| | | | |
| +---+---+ |
| +---+---+ |
| | | | |
| +---+---+ |
+------------------------------+
Recortaría la imagen para que elimine el área que no tiene datos relevantes (la parte de la izquierda) recortando la imagen, obtendría algo así:
+-------------+
|+---+---+ |
|| | | |
|+---+---+ |
|+---+---+ |
|| | | |
|+---+---+ |
|+---+---+ |
|| | | |
|+---+---+ |
|+---+---+ |
|| | | |
|+---+---+ |
+-------------+
La idea sería ejecutar Hough Transform para que puedas obtener segmentos de la página que contengan rectángulos de esta forma:
+---+---+
| | |
+---+---+
Luego aplicaría la Transformada Hough nuevamente y terminaría con dos segmentos, y tomaría la izquierda.
Una vez que tenga el segmento izquierdo, entonces aplicará el OCR.
Puede intentar aplicar el OCR de ante mano, pero en el mejor de los casos, el OCR reconocerá tanto los valores numéricos, escritos como los escritos, que, por lo que recibo, no es lo que busca.
Además, las líneas adicionales que representan los rectángulos podrían desviar el OCR y hacer que arroje malos resultados.
Renunciar a ella. De Verdad. Yo como ser humano no puedo decir con certeza si la tercera letra es un ''1'' o un ''7''. Los humanos son mejores para descifrar, por lo que una computadora fallará por esto. ''1'' y ''7'' son solo un caso problemático, ''8'' y ''6'', ''3'' y ''9'' también son difíciles de descifrar / distinguir. Su cotización de error será> 10%. Si toda la escritura es de la misma persona, podría intentar entrenar un OCR para eso, pero incluso en este caso, todavía tendrá aproximadamente ~ 3% de errores. Puede ser que su caso de uso sea especial, pero esta cantidad de errores generalmente prohíbe cualquier tipo de procesamiento automatizado. Buscaría en Mechanical Turk si realmente tengo que automatizar esto.
Yo recomendaría combinar 2 componentes básicos de redes neuronales:
- Perceptron
- Mapa autoorganizado (SOM)
Un perceptrón es un componente de red neuronal muy simple. Toma múltiples entradas y produce 1 salida. Necesitas entrenarlo alimentándolo con entradas y salidas. Es un componente de autoaprendizaje.
Internamente tiene una colección de factores de peso, que se utilizan para calcular la salida. Estos factores de peso se perfeccionan durante el entrenamiento. Lo bonito de un perceptrón es que, (con un entrenamiento adecuado) puede manejar datos que nunca antes había visto.
Puede hacer que un perceptrón sea más poderoso al organizarlo en una red multicapa , lo que significa que la salida de un perceptrón actúa como la entrada de otro perceptrón.
En su caso, debe usar 10 redes perceptron, una para cada valor numérico (0-9).
Pero para usar perceptrones necesitará una matriz de entradas numéricas. Entonces, primero necesita algo para convertir su imagen visual en valores numéricos. Un mapa autoorganizado (SOM) usa una grilla de puntos interconectados. Los puntos se deben atraer a los píxeles de su imagen (consulte a continuación)
Los 2 componentes funcionan bien juntos. El SOM tiene un número fijo de nodos de cuadrícula, y su perceptron necesita un número fijo de entradas.
Ambos componentes son realmente populares y están disponibles en paquetes de software educativos como MATLAB .
ACTUALIZACIÓN: 01/06/2018 - Tensor Flow
Este video tutorial demuestra cómo se puede hacer en Python usando el marco TensorFlow de Google. (haga clic here para obtener un tutorial escrito).