Hier auf Habré gibt es oft Artikel über die Erkennung von Captcha. Ich habe sie immer mit großem Interesse gelesen, und heute war ich an der Reihe zu schreiben. Der Weg von einer naiven Implementierung mit Tesseract zu einem Webdienst mit einem komplexen neuronalen Netzwerk dauerte ungefähr ein Jahr. Die Anzahl der Erkennungsfehler wurde von 90 auf weniger als 1% reduziert.
Sobald ein ziemlich bekannter Datei-Hosting-Dienst erneut etwas am Algorithmus geändert hatte und vor dem Herunterladen ein Captcha-Eingabefenster im Download-Programm angezeigt wurde. Es war ärgerlich und die alten Problemumgehungen schienen nicht mehr zu funktionieren. Ich begann darüber nachzudenken, wie ich das Problem lösen könnte. Mit dem an das Programm angeschlossenen Plug-In stellte sich heraus, dass alles einfach war. Es liegt an der Erkennung des Captchas selbst. Es bestand aus 4 farbigen Symbolen (Buchstaben, Zahlen) unterschiedlicher Größe, die auf einem farbigen Hintergrund mit dünnen geraden Linien um bis zu 30 Grad in beide Richtungen gedreht wurden. Als Ergebnis der Suche stieß ich auf das OCR-Programm Tesseract, speicherte mehrere Dateien mit Captchas und versuchte, sie zu erkennen. Eine naive Lösung lieferte ungefähr 10% der korrekten Ergebnisse, ziemlich schnell wurde es möglich, eine Liste zulässiger Zeichen zu erstellen - dies erhöhte den Prozentsatz der Treffer auf 20. Es ist bereits möglich, damit zu arbeiten - schrieb in PythonEin Programm , das Captchas zur Erkennung sendet und das Ergebnis an das Download-Programm zurückgibt. Unterwegs begann ich mit der grafischen Bildverarbeitung zu experimentieren, um die Erkennungsgenauigkeit zu verbessern. Zuerst habe ich versucht, sie in Schwarzweiß umzuwandeln, aber aufgrund der geringen Auflösung und eines gewissen Farbverlaufs erwiesen sich die Kanten des Symbols als abgeschnitten. Ich hörte auf, die Farbintensität zu verringern, indem ich die 6 niedrigstwertigen Farbbits verwarf. Ich hatte auch die Idee, das Bild Zeichen für Zeichen zu verarbeiten, das Bild in Teile zu zerlegen und mehrere Versuche mit unterschiedlichen Drehwinkeln zu unternehmen. Eine Drehung von -30 auf 30 mit einem Schritt von 5 Grad mit der Auswahl des häufigsten Ergebnisses ergab eine Genauigkeit von 30-40%, aber die Zeit für ein Captcha erhöhte sich auf 12 Sekunden.
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, .
, . , .
:
- - ,
,
- -
" , . , , , " ()