Y otra vez sobre el captcha

Aquí en Habré a menudo hay artículos sobre el reconocimiento de captcha. Siempre los he leído con mucho interés y hoy me toca a mí escribir. El camino desde una implementación ingenua con Tesseract a un servicio web con una red neuronal compleja me llevó aproximadamente un año. El número de errores de reconocimiento se redujo de 90 a menos del 1%.





Una vez, un servicio de alojamiento de archivos bastante conocido volvió a cambiar algo en el algoritmo y, antes de la descarga, comenzó a aparecer una ventana de entrada de captcha en el programa de descarga. Era molesto y las viejas soluciones ya no parecían funcionar. Empecé a pensar en cómo solucionar el problema. Con el plug-in conectado al programa, todo resultó sencillo, depende del reconocimiento del propio captcha. Consistía en 4 símbolos de colores (letras, números) de diferentes tamaños girados hasta 30 grados en ambas direcciones sobre un fondo de color con líneas rectas delgadas. Como resultado de las búsquedas, me encontré con el programa de OCR Tesseract, guardé varios archivos con captchas e intenté reconocerlos. Una solución ingenua dio alrededor del 10% de resultados correctos, con bastante rapidez fue posible establecer una lista de caracteres permitidos; esto aumentó el porcentaje de aciertos a 20. Ya es posible trabajar con esto, escribió en Pythonun programa que envía captchas para su reconocimiento y devuelve el resultado al programa de descarga. En el camino, comencé a experimentar con el procesamiento de imágenes gráficas para mejorar la precisión del reconocimiento. Al principio traté de convertirlos en una imagen en blanco y negro, pero debido a la baja resolución y al degradado de color, los bordes del símbolo resultaron recortados. Me detuve en reducir el croma descartando los 6 bits de color menos significativos. También se me ocurrió la idea de procesar la imagen personaje a personaje, dividiendo la imagen en partes y haciendo varios intentos en diferentes ángulos de rotación. La rotación de -30 a 30 con un paso de 5 grados con la selección del resultado más común dio una precisión de 30-40%, pero el tiempo para un captcha aumentó a 12 segundos.





Tesseract . , - . OCR .





, , 3 . , . - , . , , . , 40-50%. .





- OpenCV NumPy . , , . 70-80%, 85 . - , . .





, MNIST . ( 2500), 2828 , 25% - 9000 . , Keras Tensorflow, 100% 75% . - 1,8 . , NumPy, . "Python Machine Learning" , .





. , , . , . , - . , , . , , . 90%.





, 6000 . , 2 , . - , - - "How to implement an OCR model using CNNs, RNNs and CTC loss". Keras.





, "" , 2%. "", , 20 . - , ( ), . , , - 15000 . - - , 2 . 1 250 . Keras Tensorflow . 3 2 , . - Flask, .





, . , .





:









  1. - - ,





  2. ,





  3. - -





  4. " , . , , , " ()








All Articles