ocr ios
Usar tesseract para reconocer las matrĂculas (5)
Estoy desarrollando una aplicación que puede reconocer matrículas (ANPR). El primer paso es extraer las placas de licencia de la imagen. Estoy usando OpenCV para detectar las placas en función de la relación ancho / alto y esto funciona bastante bien:
Pero como puede ver, los resultados de OCR son bastante malos.
Estoy usando tesseract
en mi entorno Objective C
(iOS). Estas son mis variables init
al arrancar el motor:
// init the tesseract engine.
tesseract = new tesseract::TessBaseAPI();
int initRet=tesseract->Init([dataPath cStringUsingEncoding:NSUTF8StringEncoding], [language UTF8String]);
tesseract->SetVariable("tessedit_char_whitelist", "BCDFGHJKLMNPQRSTVWXYZ0123456789-");
tesseract->SetVariable("language_model_penalty_non_freq_dict_word", "1");
tesseract->SetVariable("language_model_penalty_non_dict_word ", "1");
tesseract->SetVariable("load_system_dawg", "0");
¿Cómo puedo mejorar los resultados? ¿Debo dejar que OpenCV haga más manipulación de la imagen? ¿O hay algo que pueda mejorar con tesseract?
Ahora License Matrix puede ser fácilmente reconocido por mlmodel. He creado el modelo básico que puedes encontrar here . Solo necesita dividir caracteres en una resolución de 28 * 28 a través del marco de visión y enviar esta imagen a VNImageRequestHandler como se indica a continuación-
let handler = VNImageRequestHandler(cgImage: imageUI.cgImage!, options: [:])
Obtendrás los resultados deseados utilizando mi modelo ml de núcleo. Use this enlace para una mejor aclaración, pero use mi modelo para obtener mejores resultados en el reconocimiento de matrículas. También creé el here para el reconocimiento de matrículas.
Aquí está mi ejemplo del mundo real con la prueba de OCR de mi viejo medidor de potencia. Me gustaría utilizar su código OpenCV para que OpenCV recorte automáticamente la imagen, y haré scripts de limpieza de imágenes.
- La primera imagen es la imagen original (números del medidor de potencia)
- La segunda imagen está ligeramente limpiada en GIMP, con una precisión del 50% de OCR en tesseract
- La tercera imagen está completamente limpia: ¡100% reconocimiento de OCR sin ningún entrenamiento!
Dos cosas arreglarán esto por completo:
Elimine todo lo que no sea texto de la imagen. Necesitará usar algún CV para encontrar el área de la placa (por ejemplo, por color, etc.) y luego enmascarar todo el fondo. Desea que la entrada a Tesseract sea en blanco y negro, donde el texto es negro y todo lo demás es blanco
Retire skew (como se menciona por FrankPI arriba). se supone que tesseract funciona correctamente con skew (consulte la descripción general de " Tesseract OCR Engine " de R. Smith) pero, por otro lado, no siempre funciona , especialmente si tiene una sola línea en lugar de unos pocos párrafos. Por lo tanto, eliminar el sesgado manualmente primero siempre es bueno, si puede hacerlo de manera confiable. Probablemente sabrá la forma exacta del trapecio delimitador de la placa desde el paso 1, así que esto no debería ser demasiado difícil. En el proceso de eliminación del sesgo, también puede eliminar la perspectiva: todas las placas de matrícula (normalmente) tienen la misma fuente, y si las escala a la misma forma (sin perspectiva) las formas de las letras serían exactamente las mismas, eso ayudaría reconocimiento de texto
Algunos punteros adicionales ...
No intente codificar esto al principio: tome una imagen de una placa que sea realmente fácil de OCR (es decir, directamente de frente, sin perspectiva), edítela en photoshop (o gimp) y ejecútela a través de tesseract en la línea de comandos. Sigue editando de diferentes maneras hasta que esto funcione. Por ejemplo: seleccione por color (o inundar seleccione las formas de letra), rellene con negro, invierta la selección, rellene con blanco, transfórmela en perspectiva para que las esquinas del plato sean un rectángulo, etc. Tome un grupo de imágenes, algunas más difíciles (quizás de impar ángulos, etc.). Haz esto con todos ellos. Una vez que esto funcione por completo, piensa en cómo hacer un algoritmo de CV que haga lo mismo que hiciste en photoshop :)
PD: también es mejor comenzar con una imagen de mayor resolución si es posible. Parece que el texto de tu ejemplo tiene una altura de 14 píxeles. tesseract funciona bastante bien con texto de 12 puntos a 300 ppp, tiene unos 50 píxeles de alto y funciona mucho mejor a 600 ppp. Intenta hacer que tu tamaño de carta sea al menos 50, preferiblemente 100 píxeles.
PPS ¿Estás haciendo algo para entrenar tesseract ? Creo que tienes que hacer eso, la fuente aquí es lo suficientemente diferente como para ser un problema. Probablemente también necesites algo para reconocer (y no penalizar) guiones que serán muy comunes en tus textos, parece que en el segundo ejemplo "T-" se reconoce como H.
He estado trabajando en una aplicación iOS, si necesita mejorar los resultados, debe entrenar tesseract OCR, esto me ha mejorado un 90%. Antes de la transición, los resultados de OCR fueron bastante malos.
Entonces, utilicé esta gist en el pasado para entrenar tesseract ORC con una fuente de matrícula.
Si está interesado, abrí este proyecto hace algunas semanas en github
No sé demasiado tesseract, pero tengo información sobre OCR. Aquí vamos.
- En una tarea de OCR debe asegurarse de que los datos de su tren tengan la misma fuente que está tratando de reconocer. O si está intentando reconocer varias fuentes, asegúrese de tener esas fuentes en los datos de su tren para obtener el mejor rendimiento.
- Hasta donde sé, tesseract aplica OCR de diferentes maneras: una, le das una imagen que tiene varias letras y deja que tesseract haga la segmentación. Y otro, le das cartas segmentadas a tesseract y solo esperas que reconozca la letra. Tal vez puedas intentar cambiar el que estás usando.
- Si está entrenando el reconocedor usted mismo, asegúrese de tener suficiente cantidad e igual cantidad de cada letra en los datos de su tren.
Espero que esto ayude.