Olá, guardas. A publicação de hoje será sobre como não se perder na natureza, com a variedade de opções para usar o TensorFlow para aprendizado de máquina e atingir seu objetivo. O artigo foi desenvolvido para que o leitor conheça os princípios básicos do aprendizado de máquina, mas ainda não tentou fazê-lo com suas próprias mãos. Como resultado, obtemos uma demonstração funcional no Android, que reconhece algo com precisão bastante alta. Mas as primeiras coisas primeiro.

Tendo analisado os materiais mais recentes, decidiu-se contratar o Tensorflow , que agora está ganhando impulso, e artigos em inglês e russo parecem ser suficientes para não se aprofundar nisso e conseguir descobrir o que é o quê.
Passando duas semanas, estudando artigos e inúmeras ex-amostras no escritório. site, percebi que não entendia nada. Muitas informações e opções sobre como o Tensorflow pode ser usado. Minha cabeça já está inchada com o quanto eles oferecem soluções diferentes e o que fazer com elas, conforme aplicado à minha tarefa.

Decidi tentar de tudo, desde as opções mais simples e prontas (nas quais era necessário registrar uma dependência no gradle e adicionar algumas linhas de código) até as mais complexas (nas quais eu teria que criar e treinar modelos de gráfico e aprender a usá-los em um dispositivo móvel aplicação).
No final, tive que usar uma versão complicada, que será discutida em mais detalhes abaixo. Enquanto isso, compilei para você uma lista de opções mais simples que são igualmente eficazes, apenas cada uma se adequa ao seu objetivo.

A solução mais fácil de usar - algumas linhas de código que você pode usar:
- Reconhecimento de texto (texto, caracteres latinos)
- Detecção de rosto (rostos, emoções)
- Digitalização de código de barras (código de barras, código QR)
- Rotulagem de imagens (um número limitado de tipos de objetos na imagem)
- Reconhecimento de pontos de referência (atrações)
É um pouco mais complicado. Com esta solução, você também pode usar seu próprio modelo TensorFlow Lite, mas a conversão para esse formato causou dificuldades, portanto esse item não foi tentado.
Conforme os criadores dessa prole escrevem, a maioria das tarefas pode ser resolvida usando esses desenvolvimentos. Mas se isso não se aplicar à sua tarefa, você precisará usar modelos personalizados.

Uma ferramenta muito conveniente para criar e treinar seus modelos personalizados usando imagens.
Dos profissionais - há uma versão gratuita que permite manter um projeto.
Dos contras - a versão gratuita limita o número de imagens "recebidas" a 3.000. Para tentar criar uma rede medíocre de precisão - basta. Para tarefas mais precisas, você precisa de mais.
Tudo o que é necessário para o usuário é adicionar imagens com uma marca (por exemplo - imagem1 é "guaxinim", imagem2 é "sol"), treinar e exportar o gráfico para uso futuro.

A Microsoft também oferece sua própria amostra , com a qual você pode experimentar o gráfico recebido.
Para aqueles que já estão "no assunto" - o gráfico já é gerado no estado Congelado, ou seja, você não precisa fazer / converter nada com isso.
Esta solução é boa quando você tem uma amostra grande e (atenção) MUITAS aulas diferentes em treinamento. Porque caso contrário, haverá muitas definições falsas na prática. Por exemplo, você treinou em guaxinins e sóis e, se houver uma pessoa na entrada, ela poderá com igual probabilidade ser definida por um sistema como um ou outro. Embora de fato - nem um nem o outro.
3. Criando um Modelo Manualmente

Quando você mesmo precisa ajustar o modelo para reconhecimento de imagem, manipulações mais complexas com a seleção da imagem de entrada entram em cena.
Por exemplo, não queremos ter restrições no volume da amostra de entrada (como no parágrafo anterior), ou queremos treinar o modelo com mais precisão, definindo o número de época e outros parâmetros de treinamento.
Nesta abordagem, existem vários exemplos do Tensorflow que descrevem o procedimento e o resultado final.
Aqui estão alguns exemplos:
Ele fornece um exemplo de como criar um classificador de tipos de cores com base no banco de dados aberto de imagens ImageNet - prepare imagens e treine o modelo. Também é feita uma pequena menção de como você pode trabalhar com uma ferramenta bastante interessante - TensorBoard. Das suas funções mais simples - demonstra claramente a estrutura do seu modelo acabado, bem como o processo de aprendizado de várias maneiras.
Kodlab Tensorflow for Poets 2 - trabalho contínuo com o classificador de cores. Ele mostra como se você possui os arquivos gráficos e seus rótulos (que foram obtidos no codelab anterior), é possível executar o aplicativo no android. Um dos pontos do codelab é a conversão do formato "usual" de gráfico ".pb" para o formato Tensorflow Lite (que envolve algumas otimizações de arquivo para reduzir o tamanho final do arquivo gráfico, porque os dispositivos móveis exigem isso).
Reconhecimento de escrita MNIST .

O nabo contém o modelo original (que já foi preparado para esta tarefa), instruções sobre como treiná-lo, convertê-lo e como executar um projeto para Android no final para verificar como tudo funciona
Com base nesses exemplos, você pode descobrir como trabalhar com modelos personalizados no Tensorflow e tentar criar o seu próprio produto ou usar um dos modelos pré-treinados que são montados no github:
Modelos de Tensorflow
Falando em modelos "pré-treinados". Nuances interessantes ao usar aqueles:
- Sua estrutura já está preparada para uma tarefa específica.
- Eles já são treinados em grandes amostras.
Portanto, se sua amostra estiver insuficientemente preenchida, você poderá usar um modelo pré-treinado que tenha o escopo próximo da sua tarefa. Usando esse modelo, adicionando suas próprias regras de treinamento, você obterá um resultado melhor do que tentaria treiná-lo do zero.
4. API de detecção de objetos + criação de modelo manual
No entanto, todos os parágrafos anteriores não deram o resultado desejado. Desde o início, foi difícil entender o que precisa ser feito e com que abordagem. Em seguida, foi encontrado um artigo interessante sobre a API de detecção de objetos , que mostra como encontrar várias categorias em uma imagem, além de várias instâncias da mesma categoria. No processo de elaboração desse exemplo, os artigos de origem e os tutoriais em vídeo sobre o reconhecimento de objetos personalizados se mostraram mais convenientes (os links estarão no final).
Mas o trabalho não poderia ter sido concluído sem um artigo sobre reconhecimento de Pikachu - porque uma nuance muito importante foi apontada lá, que por algum motivo não é mencionada em nenhum lugar de um guia ou exemplo. E sem ele, todo o trabalho realizado seria em vão.
Então, agora, finalmente, sobre o que ainda precisava ser feito e o que aconteceu na saída.
- Primeiro, a farinha da instalação do Tensorflow. Quem não pode instalá-lo ou usar os scripts padrão para criar, treinar um modelo - basta ter paciência e pesquisar no Google. Quase todos os problemas já foram escritos em questões no githib ou no stackoverflow.
De acordo com as instruções para o reconhecimento de objetos, precisamos preparar uma amostra de entrada antes de treinar o modelo. Estes artigos descrevem em detalhes como fazer isso usando uma ferramenta conveniente - labelImg. A única dificuldade aqui é fazer um trabalho muito longo e meticuloso para destacar os limites dos objetos de que precisamos. Nesse caso, carimba nas imagens dos documentos.

A próxima etapa, usando scripts prontos, exportamos os dados da etapa 2 primeiro para arquivos csv, depois para TFRecords - o formato de dados de entrada Tensorflow. Nenhuma dificuldade deve surgir aqui.
A escolha de um modelo pré-treinado, com base no qual pré-treinamos o gráfico, bem como o próprio treinamento. É aqui que o maior número de erros desconhecidos pode ocorrer, cuja causa é desinstalar (ou instalar incorretamente) os pacotes necessários para o trabalho. Mas você terá sucesso, não se desespere, o resultado vale a pena.

Exporte o arquivo recebido após o treinamento para o formato 'pb'. Basta selecionar o último arquivo 'ckpt' e exportá-lo.
Executando um exemplo de trabalho no Android.
Fazendo download da amostra oficial de reconhecimento de objeto no Tensorflow github -
TF Detect . Insira seu modelo e arquivo com etiquetas lá. Mas Nada vai funcionar.

É aqui que a maior mordaça em todo o trabalho aconteceu, por incrível que pareça - bem, as amostras do Tensorflow não queriam trabalhar de forma alguma. Tudo caiu. Somente o poderoso Pikachu com seu artigo conseguiu ajudar a trazer tudo para o trabalho.
A primeira linha no arquivo labels.txt deve ser a inscrição "???", porque por padrão, na API de detecção de objetos, os números de identificação dos objetos não começam com 0 como de costume, mas com 1. Devido ao fato de a classe nula ser reservada, perguntas mágicas devem ser indicadas. I.e. seu arquivo de tag será mais ou menos assim:
??? stamp
E então - execute a amostra e veja o reconhecimento dos objetos e o nível de confiança com que foi recebido.



Assim, o resultado é uma aplicação simples que, quando você passa o mouse sobre a câmera, reconhece os limites do carimbo no documento e os indica juntamente com a precisão do reconhecimento.
E se excluirmos o tempo gasto procurando a abordagem correta e tentando lançá-la, o trabalho acabou sendo bastante rápido e realmente não complicado. Você só precisa conhecer as nuances antes de começar o trabalho.
Já como uma seção adicional (aqui você já pode fechar o artigo se estiver cansado das informações), gostaria de escrever algumas dicas que ajudaram a trabalhar com tudo isso.
frequentemente, os scripts tensorflow não funcionavam porque eram executados nos diretórios errados. Além disso, era diferente em PCs diferentes: alguém precisava executar a partir do tensroflowmodels/models/research
para o trabalho e alguém tensroflowmodels/models/research/object-detection
nível mais profundo do tensroflowmodels/models/research/object-detection
lembre-se de que para cada terminal aberto você precisa exportar o caminho novamente usando o comando
export PYTHONPATH=/ /tensroflowmodels/models/research/slim:$PYTHONPATH
se você não estiver usando seu próprio gráfico e quiser descobrir informações sobre ele (por exemplo, " input_node_name
", necessário posteriormente), execute dois comandos na pasta raiz:
bazel build tensorflow/tools/graph_transforms:summarize_graph bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph="/ /frozen_inference_graph.pb"
onde " / /frozen_inference_graph.pb
" é o caminho para o gráfico que você deseja conhecer
Para visualizar informações sobre o gráfico, você pode usar o Tensorboard.
python import_pb_to_tensorboard.py --model_dir=output/frozen_inference_graph.pb --log_dir=training
onde você precisa especificar o caminho para o gráfico ( model_dir
) e o caminho para os arquivos que foram recebidos durante o treinamento ( log_dir
). Em seguida, basta abrir o host local no navegador e observar o que lhe interessa.
E a última parte - no trabalho com scripts python nas instruções da API de detecção de objetos - foi preparada uma pequena folha de dicas abaixo com comandos e dicas.
Folha de dicasExportar de labelimg para csv (do diretório object_detection)
python xml_to_csv.py
Além disso, todas as etapas listadas abaixo devem ser executadas na mesma pasta Tensorflow (" tensroflowmodels/models/research/object-detection
" ou um nível acima - dependendo de como você for) - isso é tudo imagens da seleção de entrada, TFRecords e outros arquivos devem ser copiados dentro deste diretório antes de iniciar o trabalho.
Exportar de csv para tfrecord
python generate_tfrecord.py --csv_input=data/train_labels.csv --output_path=data/train.record python generate_tfrecord.py --csv_input=data/test_labels.csv --output_path=data/test.record
* Não esqueça de alterar as linhas 'train' e 'test' nos caminhos do próprio arquivo (generate_tfrecord.py), bem como
o nome das classes reconhecidas na função class_text_to_int
(que deve ser duplicada no arquivo pbtxt
que você criará antes de treinar o gráfico).
Treinamento
python legacy/train.py —logtostderr --train_dir=training/ --pipeline_config_path=training/ssd_mobilenet_v1_coco.config
** Antes do treinamento, não se esqueça de verificar o arquivo " training/object-detection.pbtxt
training/ssd_mobilenet_v1_coco.config
" - deve haver todas as classes reconhecidas e o arquivo " training/ssd_mobilenet_v1_coco.config
" - é necessário alterar o parâmetro " num_classes
" para o número de suas classes.
Exportar modelo para pb
python export_inference_graph.py \ --input_type=image_tensor \ --pipeline_config_path=training/pipeline.config \ --trained_checkpoint_prefix=training/model.ckpt-110 \ --output_directory=output
Obrigado pelo seu interesse neste tópico!
Referências
- Artigo original sobre reconhecimento de objetos
- Um ciclo de vídeo para o artigo sobre o reconhecimento de objetos em inglês
- O conjunto de scripts que foram usados no artigo original