CAPTCHA, Sonderfall: Wir unterbrechen ein neuronales Netzwerk mit dreißig Codezeilen

   Ich kann mich nicht erinnern, wie ich auf den Artikel habr.com/en/post/464337 gestoßen bin , aber er ist in mein Gehirn gesunken und hat sich erst am letzten Tag ausgeruht . Mehrmals habe ich versucht zu verstehen, was passiert ist, ein paar Mal habe ich versucht, es zum Laufen zu bringen, aber ohne Erfolg: Ich verstehe nichts in neuronalen Netzen und programmiere sogar wie ein echter Programmierer.
fröhliches captcha


   Schließlich habe ich vor ein paar Tagen den Start der Python überwältigt und entschieden, warum nicht und so weiter. Nachdem ich alles vergessen hatte, was ich in dem erwähnten Artikel gelesen hatte, ging ich meinen eigenen Weg.
   Ich erinnerte mich an die unzähligen aufgelösten Captchas und schlug vor, sie durch einen banalen Vergleich mit der Maske zu lösen, der später bestätigt wurde.
   Zuerst manuell zusammengesetztes Test-Captcha (83 Stück) und gab ihnen offensichtliche Namen. Das Skript verwandelte sie in Bitmaps.

   Die Zahlen in der Captcha haben zwei Höhen mit einem Unterschied von 1 Pixel und drei bis vier Flächen in der Breite. Die Grundlinie aller Zeichen in allen Captcha ist dieselbe. Wie sich herausstellte, hat all diese Vielfalt eine bestimmte gemeinsame Maske, mit der eine Figur eindeutig identifiziert wird. Ich habe mehrere (zuerst - 5, dann weitere 1-2 hinzugefügt; mit "4" dauerte es länger als der Rest) derselben Zahlen aus verschiedenen Captchas. In paint.net habe ich sie übereinander gelegt und eine Maske erhalten, die allen Gesichtern jeder Ziffer gemeinsam ist.

   Ich habe das einzige Problem später bereits während der Massenverarbeitung entdeckt, es aber erfolgreich umgangen
mit einer Krücke
   , — «1», «2» .. «9». , , «4», «4», «1». , -, «123456789» «423156789» -, «4» , «1».

   Zusätzlich zu diesem kleinen Missverständnis stört das Rauschen überhaupt nicht. Das Ergebnis dieser Phase war ein Satz von 9 Masken. Zwei verschachtelte Schleifen und Voila! - Alle meine 83 Captchas werden mit einem Knall erkannt!

   

   Dann stellte sich die Frage: Woher bekommt man einen großen Satz Captcha zur Überprüfung? Und ich habe "29.000 Captcha" aus dem genannten Artikel heruntergeladen.
Dies stellte sich jedoch als Zeitverschwendung heraus.
   - (, -, .. ), : : 6503 , 5420 , 760 .. – .. 14882, , , .
-, – -, – . PNG, – JPG, , . , – «”” ».

   Also musste ich Google und mein eigenes perfektes Captcha selbst aufdecken: 3224 Dateien wurden pro Nacht gesammelt, darunter 49 vollständig leere, wie sich später herausstellte. Danke Ganesha für den Code .

   Die tatsächliche Erkennung von Captcha passt in 26 Zeilen langweiligen Python-Codes. Von externen Modulen wird nur PIL benötigt. Die Geschwindigkeit beträgt ungefähr 1000 Captcha pro Minute (eintausend Captcha pro Minute) auf dem alten Core 2 „Four Cores Four Gigs“. Auf einem anständigeren Acht-Stream ist i5 spürbar schneller, obwohl die Sache natürlich nicht in den Threads liegt. Erkennung von 100% oder sehr nahe daran: Die Stichprobe ergab keine Fehler.

   Natürlich ist all dies im Sinne von neuronalen Netzen und anderen Blockchains nicht interessant, aber es hat einen ganz bestimmten Vorteil gegenüber der zuvor vorgeschlagenen Option: Geschwindigkeit und Genauigkeit. Es ist auch wahr, dass jede Änderung der Parameter des Captcha-Headsets oder der Schriftgröße, der Art des Rauschens usw. - wird zur vollständigen Unwirksamkeit meiner Entscheidung führen.

Laden Sie das Archiv mit Captcha von Yandex.Disk (14 MB) herunter.

Quelle
from PIL import Image, ImageTk

def recognize(filepath):
  Zlist = [] # [(x1, z1), (x2, z2), (x3, z3), etc.] - position and digit
  captcha = ""
  originalimage = Image.open(filepath).convert('L').point(lambda x : 255 if x > 20 else 0, mode='1').convert('1').convert('RGBA')
  if originalimage.getextrema() == ((0, 0), (0, 0), (0, 0), (255, 255)):
    return("empty image")
  for z in [4, 2, 3, 1, 5, 6, 7, 8, 9]: # reorder to exclude false 1 on 4
    mask = Image.open('mask' + str(z) + '.png').convert('RGBA')
    previ = 0
    for i in range(15, 120): # no digit in left part
      resultimage = Image.alpha_composite(originalimage.crop((i, 0, i + 30, 0 + 50)), mask)
      if resultimage.getextrema() == ((0, 0), (0, 0), (0, 0), (255, 255)):
        if z == 4: # delete 4 to exclude false 1 on 4
          maskx = Image.open('mask4x.png').convert('RGBA') 
          originalimage.paste(Image.alpha_composite(originalimage.crop((i, 0, i + 30, 0 + 50)), maskx), (i, 0))
        if previ == 0 or i > previ + 15: #no digit closer then 15 px
          Zlist.append((i, z))
          if len(Zlist) == 5:
              Zlist.sort()
              for z in Zlist:
                captcha = captcha + str(z[1])
              return(captcha)
          previ = i
          i = i + 15 #skip a little
  Zlist.sort()
  return(str(Zlist)) #if less then 5 digits recognized
	
def main():
  captcha = recognize(entry.path)
#----------------------------------------------#
#          #
#----------------------------------------------#

main()




Aktualisierung ab dem 13. Februar 2020.
   Worum ging es? Nicht für die sportliche Erkennung gespeicherter Bilder? Nein, das alles war rein pragmatisch.
   Bereit für die Arbeit. - Lokaler http-Erkennungsserver plus Erweiterung für Chrome.
   Bisher ist das einzige, was es kann (ich hoffe das kann), das Captcha automatisch an der richtigen Stelle einzufügen. Die Pläne:
  - Reinigen Sie die Site-Oberfläche und lassen Sie das erforderliche Minimum übrig.
  - Automatisieren Sie die Captcha-Aktualisierung beim Anzeigen von Informationen als Ein Captcha ermöglicht das Öffnen von nur 4 Objekten.
  - Laden Sie alle vorbereiteten Anweisungen auf einmal und nicht einzeln herunter.

Update ab 5. März 2020.
   Bereit für die Arbeit.- Lokaler http-Erkennungsserver plus Erweiterung für Chrome.
   Die Erweiterung für Chrome wurde aktualisiert. Jetzt kann es zusätzlich zur automatischen Substitution von Captcha
 1. beim Öffnen von Seiten mit Informationen zu Immobilienobjekten Informationen zu Rechten erweitern;
 2. Sammeln Sie Informationen von diesen Seiten zur weiteren Verarbeitung.
   Screenshot im Kommentar habr.com/post/488018/#comment_21360646

Update vom 17. April 2020 .
   Bot für die Bestellung von Anweisungen aus der Liste - aufgrund der Beschränkung der Häufigkeit der Bestellung von Anweisungen - 1 Anweisung in 5 Minuten. Screenshot im Kommentar

All Articles