Et encore une fois sur le captcha

Ici sur Habré, il y a souvent des articles sur la reconnaissance du captcha. Je les ai toujours lus avec beaucoup d'intérêt, et aujourd'hui c'était à mon tour d'écrire. Le chemin d'une implémentation naïve avec Tesseract vers un service web avec un réseau neuronal complexe m'a pris environ un an. Le nombre d'erreurs de reconnaissance est passé de 90 à moins de 1%.





Une fois qu'un service d'hébergement de fichiers assez connu a de nouveau changé quelque chose dans l'algorithme, et avant le téléchargement, une fenêtre de saisie captcha a commencé à apparaître dans le programme de téléchargement. C'était ennuyeux et les anciennes solutions de contournement ne semblaient plus fonctionner. J'ai commencé à réfléchir à la manière de résoudre le problème. Avec le plug-in connecté au programme, tout s'est avéré simple, c'est à la reconnaissance du captcha lui-même. Il se composait de 4 symboles colorés (lettres, chiffres) de tailles différentes tournés jusqu'à 30 degrés dans les deux sens sur un fond coloré avec de fines lignes droites. À la suite de recherches, je suis tombé sur le programme OCR Tesseract, j'ai enregistré plusieurs fichiers avec des captchas et j'ai essayé de les reconnaître. Une solution naïve a donné environ 10% de résultats corrects, assez rapidement il est devenu possible de définir une liste de caractères autorisés - cela a augmenté le pourcentage de hits à 20. Il est déjà possible de travailler avec cela - écrit en Pythonun programme qui envoie des captchas pour la reconnaissance et renvoie le résultat au programme de téléchargement. En cours de route, j'ai commencé à expérimenter le traitement graphique des images afin d'améliorer la précision de la reconnaissance. Au début, j'ai essayé de les convertir en noir et blanc, mais en raison de la faible résolution et d'un certain dégradé de couleur, les bords du symbole se sont avérés être coupés. J'ai arrêté de réduire la chrominance en supprimant les 6 bits de couleur les moins significatifs. J'ai également eu l'idée de traiter l'image caractère par personnage, de la décomposer en plusieurs parties et de faire plusieurs tentatives sous différents angles de rotation. Une rotation de -30 à 30 avec un pas de 5 degrés avec la sélection du résultat le plus courant a donné une précision de 30 à 40%, mais le temps d'un captcha est passé à 12 secondes.





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