use CNN recognize captcha by tensorflow.
Este projeto usa tensorflow para implementar uma rede neural convolucional para códigos de verificação de imagem de caracteres para reconhecimento de código de verificação.
O projeto engloba os módulos mais gerais de ** verificação, treinamento, verificação, reconhecimento e API **, o que reduz muito o tempo e o esforço gastos na identificação de códigos de verificação de caracteres.
Primeira ediçãoReadme.md
Adicione algumas instruções sobre o reconhecimento do código de verificação
Otimize as regras para verificar as imagens do conjunto de dados
Adicionartrain_model_v2.py
Arquivo, saída da precisão do conjunto de treinamento e conjunto de validação ao mesmo tempo durante o treinamento
Recentemente, aumente o suporte de implantação de modelo e conserte váriosbug
Otimize a velocidade de reconhecimento do modelo, suporte o teste de estresse da API e as estatísticas demoradas
- Adicionado um novo método de cálculo de taxa de precisão
- TAG: v1.0
- Mantenha apenas um
train_model.py
Arquivo - Otimize a estrutura do código
- Extraia a configuração geral para
sample_config.json
和captcha_config.json
- Corrija alguns problemas levantados por todos na questão
- Melhore o documento leia-me, o documento não é longo, certifique-se de o ler ~
- Use o diretório cnnlib para armazenar o código da estrutura da rede neural 3.Fizemos uma versão das estatísticas de dados de treinamento, você pode consultar nossos tempos de treinamento, duração e precisão
- TAG: v2.0
- 1.1 Sobre o reconhecimento do código de verificação
- 1.2Estrutura de Diretório
- 1.3 confiar
- 1.4 Estrutura do modelo
- 2.1 conjunto de dados
- 2.2 Arquivo de configuração
- 2.3Valide e divida o conjunto de dados
- 2.4Modelo de treinamento
- 2.5 Verificação de lote
- 2.6 comeceWebServer
- 2.7 Identificação da interface de chamada
- 2.8 implantar
- 2.9Implante vários modelos
- 2.10 Reconhecimento online
4 Instruções de desenvolvimento
O reconhecimento do código de verificação é principalmente um problema encontrado pelos rastreadores e também pode ser usado como um caso introdutório para o reconhecimento de imagem. Atualmente, os seguintes métodos são geralmente usados:
Nome do método | Pontos relacionados |
---|---|
tesseract | Adequado apenas para reconhecer imagens sem interferência e distorção,Muito problemático para treinar |
Outras bibliotecas de reconhecimento de código aberto | Não é geral o suficiente,Taxa de reconhecimento desconhecida |
PagoOCR API | A situação de alta demanda é muito cara |
Processamento de imagem + algoritmo de classificação de aprendizado de máquina | Envolvendo uma variedade de tecnologias, altos custos de aprendizagem,E não universal |
Rede Neural Convolucional | Um certo custo de aprendizagem, o algoritmo é adequado para vários tipos de códigos de verificação |
Aqui, falamos sobre o uso de ** algoritmos de processamento de imagem e aprendizado de máquina ** tradicionais, envolvendo uma variedade de tecnologias:
- Processamento de imagem
- Pré-processamento (escala de cinza, binarização)
- Segmentação de imagem
- Recorte (remover borda)
- Filtragem de imagem, redução de ruído
- Vá para o fundo
- Separação de cores
- Rodar
- Aprendizado de máquina rotativo
- KNN
- SVM
O uso desse tipo de método tem requisitos mais elevados para os usuários e, como existem muitos tipos de mudanças na imagem, o método de processamento não é universal o suficiente e, muitas vezes, leva muito tempo para ajustar as etapas de processamento e algoritmos relacionados. Usando a ** Rede Neural Convolucional **, você pode realizar o reconhecimento ponta a ponta da maioria dos códigos de verificação de caracteres estáticos com um pré-processamento simples, que é muito eficaz e tem alta versatilidade.
A atual biblioteca de geração de ** código de verificação ** comum está listada aqui:
referência:JavaVerificar grupo de família
Língua | Nome da biblioteca de código de verificação | 链接 | Amostra |
---|---|---|---|
Java | JCaptcha | Exemplo | |
Java | JCaptcha4Struts2 | ||
Java | SimpleCaptcha | exemplo | |
Java | kaptcha | exemplo | |
Java | patchca | ! Efeito 1 | |
Java | imageRandom | ||
Java | iCaptcha | ! Efeito 1 | |
Java | SkewPassImage | ! Efeito 1 | |
Java | Cage | ! [Efeito 1]](./readme_image/Cage1.jpg) | |
Python | captcha | exemplo | |
Python | pycapt | exemplo | |
PHP | Gregwar/Captcha | exemplo | |
PHP | mewebstudio/captcha | exemplo |
Número de série | nome do arquivo | Descrição |
---|---|---|
1 | conf/ |
Descrição do diretório do arquivo de configuração |
2 | sample/ |
Catálogo de conjuntos de dados |
3 | model/ |
Diretório do arquivo de modelo |
4 | cnnlib/ |
Diretório de código relacionado ao pacote CNN |
Número de série | nome do arquivo | Descrição |
---|---|---|
1 | verify_and_split_data.py | Conjunto de dados de validação, Divida os dados em conjunto de treinamento e conjunto de teste |
2 | network.py | cnnClasse base de rede |
3 | train_model.py | Modelo de treinamento |
4 | test_batch.py | Verificação de lote |
5 | gen_image/gen_sample_by_captcha.py | Script para gerar código de verificação |
6 | gen_image/collect_labels.py | Usado para etiquetas de código de verificação estatística (geralmente usado para códigos de verificação chineses) |
Número de série | nome do arquivo | Descrição |
---|---|---|
1 | webserver_captcha_image.py | Obtenha a interface do código de verificação |
2 | webserver_recognize_api.py | Fornece interface de código de verificação de identificação online |
3 | recognize_online.py | Exemplos de uso de reconhecimento de interface |
4 | recognize_local.py | Exemplo de teste de imagens locais |
5 | recognize_time_test.py | A identificação do teste de estresse é demorada e a resposta da solicitação consome muito tempo |
pip install -r requirements.txt
Nota:Se você precisar usar GPU para treinamento,Por favor, coloque no arquivotenforflowmudar paratensorflow-gpu
Número de série | Nível do número de série |
---|---|
digitar | input |
1 | Camada convolucional + Camada de pooling + Camada de redução da resolução + ReLU |
2 | Camada convolucional + Camada de pooling + Camada de redução da resolução + ReLU |
3 | Camada convolucional + Camada de pooling + Camada de redução da resolução + ReLU |
4 | Totalmente conectado + Camada de redução da resolução + Relu |
5 | Totalmente conectado + softmax |
Resultado | output |
O conjunto de dados original pode ser armazenado em./sample/origin
Diretório.
A fim de facilitar o processamento, a imagem é melhor para2e8j_17322d3d4226f0b5c5a71d797d2ba7f7.jpg
Nomenclatura do formato (label_serial number. Sufixo).
Se você não tem um conjunto de treinamento, você pode usargen_sample_by_captcha.py
O arquivo gera o arquivo do conjunto de treinamento.
Você precisa modificar a configuração relevante antes de gerarconf/captcha_config.json
(Caminho, sufixo do arquivo, conjunto de caracteres, etc.).
{
"root_dir": "sample/origin/", # Caminho para salvar o código de verificação
"image_suffix": "png", # Sufixo da imagem do código de verificação
"characters": "0123456789", # Caracteres opcionais para gerar código de verificação
"count": 1000, # O número de fotos que geraram o código de verificação
"char_count": 4, # O número de fotos que geraram o código de verificação
"width": 100, # Largura da imagem
"height": 60 # Altura da imagem
}
Antes de criar um novo projeto, você precisa ** modificar os arquivos de configuração relacionados ** por conta própria.conf/sample_config.json
.
{
"origin_image_dir": "sample/origin/", # Arquivo original
"new_image_dir": "sample/new_train/", # Novo exemplo de treinamento
"train_image_dir": "sample/train/", # Conjunto de treinamento
"test_image_dir": "sample/test/", # Conjunto de teste
"api_image_dir": "sample/api/", # apiCaminho de armazenamento das fotos recebidas
"online_image_dir": "sample/online/", # O caminho de armazenamento da imagem obtida do URL do código de verificação
"local_image_dir": "sample/local/", # Caminho para salvar as fotos localmente
"model_save_dir": "model/", # O caminho de armazenamento da imagem obtida do URL do código de verificação
"image_width": 100, # Largura da imagem
"image_height": 60, # Altura da imagem
"max_captcha": 4, # Número de caracteres no código de verificação
"image_suffix": "png", # Sufixo do arquivo de imagem
"char_set": "0123456789abcdefghijklmnopqrstuvwxyz", # Categoria de resultado de reconhecimento de código de verificação
"use_labels_json_file": false, # Se deve habilitar a leitura do conteúdo de `labels.json`
"remote_url": "http://127.0.0.1:6100/captcha/", # Código de verificação para obter o endereço remotamente
"cycle_stop": 3000, # O treinamento após o início da tarefa para após o número especificado de vezes
"acc_stop": 0.99, # Pare após o treinamento com a precisão especificada
"cycle_save": 500, # Salve o modelo regularmente após o treinamento por um determinado número de vezes
"enable_gpu": 0, # Se deve habilitar o treinamento GUP
"train_batch_size": 128, # O número de fotos usadas a cada vez durante o treinamento. Se a memória da CPU ou GPU for muito pequena, este parâmetro pode ser reduzido
"test_batch_size": 100 # O número de fotos a serem verificadas durante cada lote de testes não deve exceder o número total de conjuntos de códigos de verificação
}
Em relação à categoria de resultado de reconhecimento do código de verificação
, presumindo que sua amostra seja um código de verificação chinês, você pode usartools/collect_labels.py
O script executa estatísticas de rótulo.
Irá gerar arquivosgen_image/labels.json
Armazene todas as tags, definidas no arquivo de configuraçãouse_labels_json_file = True
Leitura abertalabels.json
Conteúdo como`Categoria de resultado ».
Esta função irá verificar o tamanho do conjunto de imagens original e se a imagem de teste pode ser aberta, e dividir o conjunto de treinamento e conjunto de teste em uma proporção de 19: 1. Portanto, você precisa criar e especificar três pastas: origem, treinamento e teste para armazenar os arquivos relacionados.
Você também pode modificá-lo para um diretório diferente, mas é melhor modificá-lo para um caminho absoluto. Depois que a pasta for criada, execute o seguinte comando:
python3 verify_and_split_data.py
Geralmente, haverá um prompt semelhante ao seguinte
>>> Comece a verificar o catálogo:[sample/origin/]
Comece a verificar a coleção de fotos original
O conjunto original de imagens compartilhadas: 1001Zhang
====A seguinte 1 imagem é anormal====
[Foto 0] [.DStore] [Sufixo de arquivo incorreto]
========end
Comece a separar o conjunto de imagens original: conjunto de teste (5%) e conjunto de treinamento (95%)
Um total de 1000 imagens são alocadas para o conjunto de treinamento e conjunto de teste, uma das quais é uma anomalia e permanece no diretório original
O número de conjuntos de teste é: 50
O número de conjuntos de treinamento é: 950
>>> Comece a verificar o diretório:[sample/new_train/]
Comece a verificar o diretório:sample/new_train/,Prestes a criar
Comece a verificar a coleção de fotos original
O conjunto original de imagens compartilhadas: 0 folhas
====As seguintes 0 imagens são anormais====
Nenhuma anormalidade encontrada (0 fotos no total)
========end
Comece a separar o conjunto de imagens original: conjunto de teste (5%) e conjunto de treinamento (95%)
Um total de 0 imagens são alocadas para o conjunto de treinamento e conjunto de teste, das quais 0 imagens são deixadas no diretório original como anomalias
O número de conjuntos de teste é: 0
O número de conjuntos de treinamento é: 0
O programa irá verificar e dividir ao mesmo tempoorigin_image_dir
comnew_image_dir
As fotos nos dois catálogos; haverá mais amostras no futuro, você pode colocar as amostras emnew_image_dir
Execute novamente no diretórioverify_and_split_data
.
O programa deixará arquivos inválidos na pasta original.
Além disso, quando você tem novas amostras que precisam ser treinadas juntas, você pode colocarsample/new
Diretório, execute novamentepython3 verify_and_split_data.py
É isso.
Deve-se notar que se houver novas tags na nova amostra, você precisa adicionar as novas tags achar_set
É isso. Configurando oulabels.json
Arquivo.
Depois de criar o conjunto de treinamento e o conjunto de teste, você pode começar a treinar o modelo.
Durante o treinamento, um registro será gerado, que mostra o número atual de rodadas de treinamento, precisão e perda.
** A taxa de precisão neste momento é a taxa de precisão da imagem do conjunto de treinamento, que representa a situação de reconhecimento de imagem do conjunto de treinamento **
Por exemplo:
10º treinamento >>>
[Conjunto de treinamento] A taxa de precisão do caractere é 0,03000 A taxa de precisão da imagem é 0,00000 >>> loss 0.1698757857
[Conjunto de validação] A taxa de precisão do caractere é 0,04000 A taxa de precisão da imagem é 0,00000 >>> loss 0.1698757857
Explicação da precisão do caractere e precisão da imagem:
Premissa: Existem 100 imagens, cada imagem tem quatro caracteres, um total de 400 caracteres. Aqui, dividimos a tarefa em 400 caracteres que precisam ser reconhecidos
Precisão do caractere: a porcentagem de caracteres corretos entre os 400 caracteres reconhecidos.
Precisão da imagem: entre 100 imagens, a proporção de imagens com 4 caracteres totalmente reconhecida com precisão.
Não vou introduzir especificamente questões relacionadas à instalação do tensorflow aqui, e vou direto ao tópico. Depois de garantir que os parâmetros relacionados à imagem e as configurações do diretório estão corretos, execute o seguinte comando para iniciar o treinamento:
python3 train_model.py
Também pode ser baseado emtrain_model.py
demain
O código na função chama a classe para iniciar o treinamento ou realizar uma demonstração de reconhecimento simples.
Uma vez que o conjunto de treinamento muitas vezes não contém todos os recursos de amostra, haverá casos em que a precisão do conjunto de treinamento é 100% e a precisão do conjunto de teste é inferior a 100%. Neste momento, uma solução para melhorar a precisão é aumentar as amostras negativas após a rotulagem correta.
Use as imagens do conjunto de teste para verificar e gerar a taxa de precisão.
python3 test_batch.py
O mesmo pode ser baseado emmain
O código na função chama a classe para iniciar a verificação.
O projeto encapsulou a classe para carregar o modelo e reconhecer a imagem, iniciarweb server
Depois de chamar a interface, o serviço de reconhecimento pode ser usado.
comeceweb server
python3 webserver_recognize_api.py
O url da interface éhttp://127.0.0.1:6000/b
usar requestsInterface de chamada:
url = "http://127.0.0.1:6000/b"
files = {'image_file': (image_file_name, open('captcha.jpg', 'rb'), 'application')}
r = requests.post(url=url, files=files)
O resultado retornado é umjson:
{
'time': '1542017705.9152594',
'value': 'jsp1',
}
Arquivorecognize_local.py
Este é um exemplo de uso da interface para identificar a área local. Se este exemplo for executado com sucesso, então o processo de identificação do código de verificação está basicamente concluído.
O código de verificação de identificação online é uma cena comum no display, arquivorecognize_online.py
É um exemplo de uso da interface para identificação online, consulte:`## 2.11 Reconhecimento online.
Ao implantar, coloquewebserver_recognize_api.py
Modifique a última linha do arquivo para ler da seguinte forma:
app.run(host='0.0.0.0',port=5000,debug=False)
Em seguida, abra a autoridade de acesso à porta, você pode acessar através da rede externa.
Além disso, para habilitar solicitações de processamento de vários processos, você pode usar a combinação uwsgi + nginx para implantação.
Esta parte pode se referir a:FlaskOpções de implantação
Implante vários modelos:
nowebserver_recognize_api.py
Resumo do arquivo, crie um novo objeto Reconhecedor;
E consulte o originalup_image
Lógica de roteamento e identificação escrita pela função.
Q = Recognizer(image_height, image_width, max_captcha, char_set, model_save_dir)
Preste atenção para modificar esta linha:
value = Q.rec_image(img)
O código de verificação de identificação online é um cenário comum no display, ou seja, o código de verificação do alvo é obtido em tempo real para chamar a interface de identificação. Para a integridade do teste, uma interface de aquisição de código de verificação é construída aqui, que é iniciada executando o seguinte comando:
python webserver_captcha_image.py
Depois de começar, visitando este endereço:http://127.0.0.1:6100/captcha/
Você pode receber o arquivo de fluxo binário da imagem do código de verificação.
Tarefas específicas de identificação onlinedemoVer:recognize_online.py
。
Muitos alunos fizeram perguntas semelhantes: "Quanto tempo leva para treinar?", "Quanta precisão pode ser alcançada?", "Por que minha precisão é sempre 0?" Nesta seção, a configuração padrão (2019.06.02) é usada para fazer estatísticas sobre os dados durante o processo de treinamento e para mostrar a todos. As condições de teste são as seguintes: -Código de verificação: Este projeto vem com um programa para gerar um código de verificação, números + Inglês minúsculo -Quantidade: 20.000 folhas -Motor de computação: GPU
- Modelo GPU: notebook, placa gráfica GTX 950X 2G
após o teste: 5000 vezes, 25 minutos, a precisão dos caracteres no conjunto de treinamento é de 84% e a precisão das imagens é de 51%; 9190 vezes, 46 minutos, ** conjunto de treinamento ** a taxa de precisão do caractere é 100%, a taxa de precisão da imagem é 100%; 12.000, 60 minutos, a precisão do ** conjunto de teste ** basicamente não pode ser executada.
usartest_batch.py
Teste, o log é o seguinte:
Leva 6,513171672821045 segundos para identificar 100 amostras, com uma taxa de precisão de 37,0%
Com uma precisão de 37%, pode-se dizer que é o primeiro passo para uma identificação bem-sucedida.
O gráfico é o seguinte:
Conjunto de treinamento-
Fornece um script de teste de estresse simples para estatísticasapiReconhecer e solicitar dados demorados durante o processo em execução, mas o gráfico precisa ser extraído do Excel.
abrir um arquivorecognize_time_test.py
,modificarmain
Função sobtest_file
Caminho, aqui irá reutilizar uma imagem para acessar a interface.
Os dados finais serão armazenados emtest.csvArquivo.
Use o seguinte comando para executar:
python3 recognize_time_test.py
----O resultado é o seguinte
2938,5150,13:30:25,Consome muito tempo:29ms,Identificar:15ms,solicitação:14ms
2939,5150,13:30:25,Consome muito tempo:41ms,Identificar:21ms,solicitação:20ms
2940,5150,13:30:25,Consome muito tempo:47ms,Identificar:16ms,solicitação:31ms
Após 20.000 testes em um modelo, um conjunto de dadostest.csv。
Portest.csvApós a análise usando o gráfico de caixa, você pode ver:
! [Resultado do teste de estresse](readme_image/ Resultados do teste de estresse.png)
-O tempo total gasto para uma única solicitação de API (média): 27 ms
-Tempo de reconhecimento único (média): 12ms
-Muito demorado por solicitação (média): 15ms
Entre eles estão: tempo total para solicitar API = demorado para identificar + tempo para solicitar
- 20190209
- AtualmentetensorboardO suporte da tela não é muito bom.
- 20190601
- Estive ocupado recentemente,issueÉ um pouco lento,Por favor me perdoe
- devNo meio do desenvolvimento do branch, não há tempo para obtê-lo,Demorei uma tarde para atualizar sobre o Dia das Crianças hoje:)
- 感谢看到这里的你,谢谢你的支持
- usarpycharmIniciar recognize_api.pyErro de arquivo
2018-12-01 00:35:15.106333: W T:\src\github\tensorflow\tensorflow\core\framework\op_kernel.cc:1273] OP_REQUIRES failed at save_restore_tensor.cc:170 : Invalid argument: Unsuccessful TensorSliceReader constructor: Failed to get matching files on ./model/: Not found: FindFirstFile failed for: ./model : ϵͳ�Ҳ���ָ����·����
; No such process
......
tensorflow.python.framework.errors_impl.InvalidArgumentError: Unsuccessful TensorSliceReader constructor: Failed to get matching files on ./model/: Not found: FindFirstFile failed for: ./model : ϵͳ\udcd5Ҳ\udcbb\udcb5\udcbdָ\udcb6\udca8\udcb5\udcc4·\udcbe\udcb6\udca1\udca3
; No such process
[[Node: save/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save/Const_0_0, save/RestoreV2/tensor_names, save/RestoreV2/shape_and_slices)]]
A área de trabalho é definida por pycharm por padrão, o que leva a um erro na leitura da pasta de modelo do caminho relativo. Solução: edite a configuração de execução e defina o espaço de trabalho como o diretório do projeto. ![bug_apifalha ao ativar](readme_image/bug_apifalhou ao ativar.png)
-
FileNotFoundError: [Errno 2] No such file or directory: 'xxxxxx'
Se houver uma pasta que não existe no diretório, basta criar uma pasta no diretório especificado. -
apiQuanto mais memória o programa ocupa enquanto está em execução Dados de verificação de resultados:链接
Ao iterar o loop, você não pode mais incluir nenhuma expressão de cálculo de tensor, caso contrário, a memória irá estourar. Depois que a expressão de cálculo do tensor é colocada na execução de inicialização do init, a velocidade de reconhecimento é muito melhorada. -
Erro ao carregar vários modelos O motivo é doisRecognizerTodos os objetos usam o padrãoGraph。 A solução é não usar o padrão ao criar o objetoGraph,Novograph,Então cadaRecognizerTodos usam diferentesgraph,Não haverá conflitos.
-
FlaskPrograma para produção Você pode consultar os documentos oficiais:FlaskConfiguração de produção
-
OOM happens
Hint: If you want to see a list of allocated tensors when OOM happens,
add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
Desligue outras tarefas que ocupam GPU ou CPU tanto quanto possível, ou reduzasample_config.json
meiotrain_batch_size
parâmetro.