CAPTCHA, cas particulier: on casse un réseau neuronal avec trente lignes de code

   Je ne me souviens pas comment je suis tombĂ© sur l'article habr.com/en/post/464337 , mais il s'est enfoncĂ© dans mon cerveau et n'a pas donnĂ© de repos avant le dernier jour. Plusieurs fois, j'ai essayĂ© de comprendre ce qui se passait, plusieurs fois j'ai essayĂ© de le faire fonctionner, mais en vain: je ne comprends absolument rien dans les rĂ©seaux de neurones et je programme mĂŞme comme un vrai programmeur.
captcha heureux


   Enfin, il y a quelques jours, j'ai maĂ®trisĂ© le lancement du python et dĂ©cidĂ©, pourquoi pas et ainsi de suite. Après avoir oubliĂ© tout ce que j'ai lu dans l'article mentionnĂ©, je suis allĂ© Ă  ma façon.
   En me souvenant de la myriade de captchas rĂ©solus, j'ai suggĂ©rĂ© que vous puissiez les rĂ©soudre par une comparaison banale avec le masque, ce qui a Ă©tĂ© confirmĂ© plus tard.
   D'abord, captcha de test assemblĂ© manuellement (83 pièces) et leur a donnĂ© des noms Ă©vidents. Le script les a transformĂ©s en bitmaps.

   Les nombres dans le captcha sont de deux tailles en hauteur avec une diffĂ©rence de 1 pixel et de trois Ă  quatre faces en largeur. La ligne de base de tous les caractères dans tous les captcha est la mĂŞme. Il s'est avĂ©rĂ© que toute cette diversitĂ© a un certain masque commun, une comparaison avec laquelle identifie de manière unique une figure. J'ai dĂ©coupĂ© plusieurs (au dĂ©but - 5, puis ajoutĂ© un autre 1-2; avec "4", cela a pris plus de temps que le reste) des mĂŞmes numĂ©ros de diffĂ©rents captchas. Dans paint.net, je les ai mis les uns sur les autres et j'ai obtenu un masque commun Ă  tous les visages de chaque chiffre.

   J'ai dĂ©couvert le seul problème plus tard, dĂ©jĂ  lors du traitement de masse, mais j'ai rĂ©ussi Ă  le contourner
avec une béquille
   , — «1», «2» .. «9». , , «4», «4», «1». , -, «123456789» «423156789» -, «4» , «1».

   En plus de ce petit malentendu, le bruit n'interfère pas du tout. Le rĂ©sultat de cette Ă©tape a Ă©tĂ© un ensemble de 9 masques. Deux boucles imbriquĂ©es et le tour est jouĂ©! - tous mes 83 captchas sont reconnus avec Ă©clat!

   

   Puis la question s'est posĂ©e: oĂą trouver un grand ensemble de captcha pour vĂ©rification. Et j'ai tĂ©lĂ©chargĂ© "29 000 captcha" de l'article mentionnĂ©.
Cependant, cela s'est avéré être une perte de temps.
   - (, -, .. ), : : 6503 , 5420 , 760 .. – .. 14882, , , .
-, – -, – . PNG, – JPG, , . , – «”” ».

   J'ai donc dĂ» dĂ©couvrir Google et extraire le captcha parfait par moi-mĂŞme: 3224 fichiers ont Ă©tĂ© accumulĂ©s par nuit, dont 49 complètement vides, comme il s'est avĂ©rĂ© plus tard. Merci Ganesha pour le code .

   En fait, la reconnaissance du captcha tient dans 26 lignes de code Python ennuyeux. Ă€ partir des modules externes, seul PIL est nĂ©cessaire. La vitesse est d'environ 1000 captcha par minute (mille captcha par minute) sur l'ancien Core 2 «quatre cĹ“urs quatre concerts». Sur un huit-flux plus dĂ©cent, i5 est nettement plus rapide, bien que la question, bien sĂ»r, ne soit pas dans les discussions. Reconnaissance de 100% ou très proche de cela: la vĂ©rification ponctuelle n'a rĂ©vĂ©lĂ© aucune erreur.

   Bien sĂ»r, tout cela n'est pas intĂ©ressant au sens des rĂ©seaux de neurones et autres blockchains, mais il a un avantage très net sur l'option proposĂ©e prĂ©cĂ©demment: vitesse et prĂ©cision. Il est Ă©galement vrai que tout changement dans les paramètres du captcha - taille du casque ou de la police, type de bruit, etc. - conduira Ă  l'inopĂ©rabilitĂ© totale de ma dĂ©cision.

Téléchargez l'archive avec captcha à partir de Yandex.Disk (14 Mo).

La source
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()




Mise à jour au 13 février 2020.
   De quoi s'agissait-il? Pas pour la reconnaissance sportive des images enregistrĂ©es? Non, tout cela Ă©tait purement pragmatique.
   Solution prĂŞte pour le travail. - Serveur de reconnaissance http local plus extension pour Chrome.
   Jusqu'Ă  prĂ©sent, la seule chose qu'il peut (j'espère que c'est possible) est d'insĂ©rer automatiquement le captcha au bon endroit. Les plans:
  - nettoyer l'interface du site, en laissant le minimum nĂ©cessaire;
  - automatiser la mise Ă  jour du captcha lors de la visualisation des informations, un captcha permet d'ouvrir seulement 4 objets.
  - TĂ©lĂ©chargez toutes les dĂ©clarations prĂ©parĂ©es Ă  la fois, et pas une Ă  la fois.

Mise Ă  jour au 5 mars 2020.
   Solution prĂŞte pour le travail.- Serveur de reconnaissance http local plus extension pour Chrome.
   Mise Ă  jour de l'extension pour Chrome. Maintenant, il peut, en plus de l'auto-substitution captcha,
 1. lors de l'ouverture de pages contenant des informations sur des objets immobiliers, dĂ©velopper des informations sur les droits;
 2. Collectez les informations de ces pages pour un traitement ultĂ©rieur.
   Capture d'Ă©cran dans le commentaire habr.com/post/488018/#comment_21360646

Mise Ă  jour au 17 avril 2020 .
   Bot pour commander des relevĂ©s de la liste - en raison de la restriction de la frĂ©quence de commande des relevĂ©s - 1 relevĂ© en 5 minutes. Capture d'Ă©cran en commentaire

All Articles