CAPTCHA, caso especial: quebramos uma rede neural com trinta linhas de código

   Não me lembro de como me deparei com o artigo habr.com/ru/post/464337 , mas ele afundou em meu cérebro e não deu descanso até o último dia. Várias vezes tentei entender o que estava acontecendo, algumas vezes tentei fazê-lo funcionar, mas sem sucesso: não entendo completamente nada em redes neurais e até programa como um programador de verdade.
feliz captcha


   Finalmente, há alguns dias, eu venci o lançamento do python e decidi por que não e assim por diante. Tendo esquecido tudo o que li no artigo mencionado, segui meu próprio caminho.
   Lembrando a miríade de captchas resolvidos, sugeri que você pudesse resolvê-los por comparação banal com a máscara, que foi confirmada mais tarde.
   Primeiro, montei o captcha de teste manualmente (83 peças) e deu nomes óbvios. O script os transformou em bitmaps.

   Os números no captcha têm dois tamanhos de altura, com uma diferença de 1 pixel e três a quatro faces em largura. A linha de base de todos os caracteres em todos os captcha é a mesma. Toda essa diversidade, como se viu, tem uma certa máscara comum, uma comparação com a qual identifica exclusivamente uma figura. Recortei vários (no começo - 5, depois adicionei outro 1-2; do "4" demorou mais que o resto) dos mesmos números de diferentes captchas. No paint.net, eu os coloquei um em cima do outro e consegui uma máscara comum a todas as faces de cada dígito.

   Descobri o único problema mais tarde, já durante o processamento em massa, mas o contornei com sucesso
com uma muleta
   , — «1», «2» .. «9». , , «4», «4», «1». , -, «123456789» «423156789» -, «4» , «1».

   Além desse pequeno mal-entendido, o ruído não interfere em nada. O resultado dessa etapa foi um conjunto de 9 máscaras. Dois loops aninhados e pronto! - todos os meus 83 captchas são reconhecidos com um estrondo!

   

   Surgiu então a pergunta: onde obter um grande conjunto de captcha para verificação. E baixei "29.000 captcha" do artigo mencionado.
No entanto, isso acabou sendo uma perda de tempo.
   - (, -, .. ), : : 6503 , 5420 , 760 .. – .. 14882, , , .
-, – -, – . PNG, – JPG, , . , – «”” ».

   Por isso, tive que descobrir o Google e extrair o captcha perfeito sozinho: 3224 arquivos foram acumulados por noite, incluindo 49 completamente vazios, como se viu mais tarde. Obrigado Ganesha pelo código .

   Na verdade, o reconhecimento de captcha se encaixa em 26 linhas de código python chato. Nos módulos externos, apenas o PIL é necessário. A velocidade é de cerca de 1000 captcha por minuto (mil captcha por minuto) no antigo Core 2, “quatro núcleos, quatro shows”. Em um oito-stream mais decente, o i5 é visivelmente mais rápido, embora o problema, é claro, não esteja nos tópicos. Reconhecimento de 100% ou muito próximo disso: a verificação no local não mostrou erros.

   Obviamente, tudo isso não é interessante no sentido de redes neurais e outras cadeias de blocos, mas tem uma vantagem muito clara sobre a opção proposta anteriormente: velocidade e precisão. Também é verdade que qualquer alteração nos parâmetros do captcha - tamanho do fone de ouvido ou da fonte, tipo de ruído etc. - levará à completa inoperabilidade da minha decisão.

Faça o download do archive com captcha no Yandex.Disk (14MB).

Fonte
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()




Atualização a partir de 13 de fevereiro de 2020.
   O que foi isto tudo? Não por uma questão de reconhecimento esportivo de imagens salvas? Não, tudo isso foi puramente para fins pragmáticos.
   Solução pronta para o trabalho. - Servidor de reconhecimento http local, mais extensão para o Chrome.
   Até agora, a única coisa que ele pode (espero que possa) é inserir automaticamente o captcha no lugar certo. Os planos:
  - limpe a interface do site, deixando o mínimo necessário;
  - automatize a atualização captcha ao visualizar informações, como um captcha permite abrir apenas 4 objetos.
  - Baixe todas as instruções preparadas de uma só vez, e não uma de cada vez.

Atualização em 5 de março de 2020.
   Solução pronta para o trabalho.- Servidor de reconhecimento http local, mais extensão para o Chrome.
   Atualizou a extensão para o Chrome. Agora, além de captcha a substituição automática de captcha,
 1. ao abrir páginas com informações sobre objetos imobiliários, expandir informações sobre direitos;
 2. Colete informações dessas páginas para processamento adicional.
   Captura de tela no comentário habr.com/post/488018/#comment_21360646

Atualize em 17 de abril de 2020 .
   Bot para instruções de pedidos da lista - devido à restrição na frequência de instruções de pedidos - 1 instrução em 5 minutos. Captura de tela no comentário

All Articles