Ferramentas
Leitor de CAPTCHA para coleta de dado público
Os portais públicos de dado ambiental exigem resolver um captcha a cada arquivo baixado. Treinei o modelo que lê esse captcha e tirou a pessoa do meio.

82%
dos captchas aceitos de primeira pelo próprio servidor, com maiúscula e minúscula certas
- Condição
- 41 de 50 captchas · conjunto de 4 modelos · aceite confirmado pelo servidor, não por gabarito meu · com n=50 o intervalo de 95% vai de 69% a 90%, então trate como "por volta de 80", não como 82 cravado
- Papel
- Autor do modelo, dentro do repositório da empresa
- Contexto
- Datlaz — prestação de serviço
- Período
- 2026
- Situação
- Em produção desde julho de 2026
O problema
A Datlaz monta camadas geoespaciais a partir de dados públicos brasileiros, e boa parte desses portais cobra um captcha de texto a cada arquivo baixado. São dezenas de milhares de arquivos. O pipeline que existia usava um OCR genérico com até cinquenta tentativas por download — força bruta, e cada tentativa é uma requisição no servidor de quem está do outro lado.
A parte que decidiu o resultado
O servidor responde se a resposta está certa. Isso é um rotulador de graça: em vez de rotular imagem à mão, deixei o coletor montar o próprio conjunto de treino. Saíram 1.154 exemplos confirmados em cinquenta minutos, com cerca de um segundo entre requisições e nenhum arquivo baixado durante a coleta — o gargalo era a educação, não a velocidade.
A segunda descoberta mudou a arquitetura. Desconfiei que o servidor diferenciava maiúscula de minúscula e testei: submeti tudo minúsculo, depois tudo maiúsculo: cerca de 3% de aceite em cada, 6% somando os dois — exatamente o que o acaso prevê para cinco caracteres, já que 2⁻⁵ dá 3,1% por tentativa. Ou seja, um OCR que ignora caixa tem teto de uns 7% ali, por melhor que leia as letras.
Então o modelo tem duas cabeças: uma decide qual é a letra, outra decide se ela é maiúscula. Separar as duas perguntas levou o acerto com caixa correta de 12% para 44% num mesmo conjunto de teste; o resto veio de mais dados reais e do conjunto de quatro modelos votando.
O resultado
82% aceitos de primeira, em 50 captchas, contra o servidor real. Como o download pode tentar de novo, na prática o arquivo sempre desce: a conta dá cerca de 1,2 tentativas por captcha, contra as até cinquenta de antes.
São 26 MB de modelo e uns 10 milissegundos por captcha em um núcleo de CPU, sem GPU em produção. O modelo roda dentro da infraestrutura da empresa, em ONNX — nenhuma chamada a serviço de terceiro, nenhum serviço pago de resolução. São duas consequências diretas: o custo por captcha é zero depois do treino, e nenhuma imagem sai da rede de quem opera o sistema.
O segundo, que não precisou de rede neural nenhuma
Outro portal, outro captcha, mesma necessidade. Antes de treinar qualquer coisa eu olhei a imagem: fonte única, caracteres em células de largura fixa, sem distorção e sem ruído. Não precisava de rede neural — bastava comparar mapas de bits e escolher o mais próximo. 26 KB de gabarito, 92% de acerto em 200 tentativas, cerca de 1 milissegundo por captcha.
Vale registrar a armadilha em que eu quase caí ali. No conjunto auto-rotulado, a validação cruzada marcava 99%. É mentira: aquele conjunto só contém captchas que algum modelo já tinha acertado, então ele mede o fácil. O número que vale é o 92% medido contra o servidor, com os difíceis dentro.
Os limites
O repositório é da empresa e é privado. Eu escrevi o resolvedor de captcha e corrigi dois defeitos de coleta no caminho — não sou autor do coletor, que já existia. Nos diretórios do resolvedor, quatro dos cinco commits são meus.
E não publico endereço nem nome de parâmetro dos portais. O método está descrito aqui; o mapa para abusar dele, não.