Contagem de abelhas na rede neural do Raspberry Pi

17 de maio de 2018

Imediatamente após a instalação da colméia, pensei: "Gostaria de saber como calcular o número de abelhas chegando e saindo?"

Um pequeno estudo mostrou: até agora ninguém parece ter apresentado um bom sistema não invasivo para resolver esse problema. Mas provavelmente seria útil ter essas informações para verificar a saúde da colméia.

Primeiro, você precisa coletar amostras de dados. Raspberry Pi, câmera Pi padrão e painel solar: este equipamento simples é suficiente para gravar um quadro a cada 10 segundos e salvar mais de 5000 imagens por dia (das 6:00 às 21:00).



Abaixo está um exemplo de imagem ... Quantas abelhas você pode contar?



Qual é exatamente a pergunta?


Em segundo lugar, é necessário formular o problema do que exatamente a rede neural deve fazer. Se a tarefa é “contar abelhas na imagem”, você pode tentar obter números específicos, mas essa não parece ser a opção mais fácil, e rastrear abelhas individualmente entre os quadros não dá prazer. Em vez disso, decidi me concentrar em localizar cada abelha na imagem.

Uma verificação rápida de um detector quadro a quadro padrão não produziu nenhum resultado específico. Isso não é surpreendente, especialmente considerando a densidade de abelhas ao redor da entrada da colméia (dica: transferir o treinamento nem sempre funciona), mas isso é normal. Portanto, tenho uma imagem muito pequena, apenas uma classe para reconhecer objetos e não há problemas especiais com a caixa delimitadora. Apenas decida se há uma abelha ou não. Qual solução será mais simples?

v1: rede totalmente convolucional "comer abelha / não" em um fragmento


O primeiro experimento rápido foi o detector "a abelha na imagem é / não é". Ou seja, qual é a probabilidade de haver pelo menos uma abelha nesse fragmento da imagem. Fazer isso na forma de uma rede completamente convolucional em fragmentos muito pequenos da imagem significa que você pode processar facilmente os dados em resolução total. A abordagem parecia funcionar, mas falhou na área de entrada da colméia com uma densidade muito alta de abelhas.

v2: imagem RGB → bitmap em preto e branco


Eu rapidamente percebi que o problema pode ser reduzido ao problema de transformação da imagem. Na entrada, o sinal da câmera é RGB e na saída é uma imagem de um único canal onde o pixel “branco” indica o centro da abelha.


Entrada RGB (fragmento) e saída de canal único (fragmento)

Marcação


O terceiro passo é rotular, ou seja, a atribuição de designações. Não é muito difícil implantar um pequeno aplicativo TkInter para selecionar / desmarcar abelhas na imagem e salvar os resultados no banco de dados SQLite. Gastei muito tempo para configurar corretamente esta ferramenta: quem executou manualmente uma quantidade significativa de marcação me entenderá: /

Mais tarde veremos, felizmente, que com um grande número de amostras, você pode obter um bom resultado por métodos semi-automáticos.

Modelo


A arquitetura de rede é bastante padrão na rede u-net.

  • rede totalmente convolucional treinada em fragmentos com meia resolução, mas funciona em imagens com resolução total;
  • codificação é uma sequência de quatro convoluções 3 × 3 em incrementos de 2
  • decodificação - uma sequência de mudanças de tamanho nos vizinhos mais próximos + dobrando 3 × 3 em incrementos de 1 + pulando a conexão dos codificadores;
  • a camada final de convolução 1 × 1 com a etapa 1 com a ativação da função sigmóide (ou seja, a escolha binária "bee é / não é" para cada pixel).

Após algumas experiências empíricas, decidi voltar à decodificação com meia resolução. Foi o suficiente.

Eu decodifiquei redimensionando para os vizinhos mais próximos, em vez de deconvolver mais por hábito.

A rede foi treinada pelo método Adam e era muito pequena para aplicar a normalização em lote . O design acabou surpreendentemente simples, bastava um pequeno número de filtros.



Eu apliquei o método padrão de aumento de dados, rotação aleatória e distorção de cores. Treinar em fragmentos significa que temos essencialmente uma variante de fatiar aleatoriamente a imagem. Não girei a imagem porque a câmera sempre fica em um lado da colméia.

Há algumas nuances nas previsões de saída pós-processamento. Com resultados probabilísticos, obtemos uma nuvem borrada onde pode haver abelhas. Para convertê-lo em uma imagem clara de um pixel por abelha, adicionei um valor limite, levando em consideração componentes relacionados e detectando centróides usando o módulo de medição skimage . Tudo isso teve que ser instalado manualmente e configurado exclusivamente pelo olho, embora teoricamente possa ser adicionado ao final da pilha como um elemento de aprendizado. Talvez faça sentido fazê-lo no futuro ... :)


Centroids de entrada, saída bruta e cluster

Generalização de alguns dias


Em um dia


Inicialmente, os experimentos foram conduzidos com imagens em um curto período de um dia. Acabou sendo fácil obter um bom modelo desses dados com um pequeno número de imagens marcadas (cerca de 30).


Três amostras recebidas no primeiro dia

Por muitos dias


As coisas ficaram mais complicadas quando comecei a considerar períodos mais longos de vários dias. Uma das principais diferenças é a diferença de iluminação (hora do dia e clima diferente). Outro motivo é que eu instalei a câmera manualmente todos os dias, apenas colando-a com velcro. A terceira e mais inesperada diferença foi que, com o crescimento da grama, os botões de dente de leão parecem abelhas (ou seja, na primeira rodada, o modelo treinado não viu os botões, e então eles apareceram e forneceram um fluxo contínuo de falsos positivos).

A maioria dos problemas foi resolvida pelo aumento de dados e nenhum problema se tornou crítico. Em geral, os dados não variam muito. Isso é ótimo, porque permite que você se limite a uma rede neural simples e a um esquema de treinamento.


Amostras obtidas em três dias

Exemplo de previsão


A imagem mostra um exemplo de previsão. É interessante notar que existem muito mais abelhas do que em qualquer imagem que eu rotulei manualmente. Esta é uma ótima confirmação de que uma abordagem totalmente convolucional com o aprendizado de pequenos fragmentos realmente funciona.



A rede funciona bem em uma ampla variedade de opções. Suponho que um plano de fundo uniforme ajude aqui, e iniciar a rede em uma seção arbitrária não dará um resultado tão bom.


Da esquerda para a direita: alta densidade ao redor da entrada; abelhas de diferentes tamanhos; abelhas em alta velocidade!

Truques de rotulagem


Treinamento semi-controlado


A possibilidade de obter um grande número de imagens sugere imediatamente a idéia de usar o treinamento semi-controlado.

Uma abordagem muito simples:

  1. Fotografando 10.000 imagens.
  2. Rotular 100 imagens e modelo de treinamento_1.
  3. Usando model_1 para marcar as 9900 imagens restantes.
  4. model_2 treinamento_2 nas 10.000 imagens "rotuladas".

Como resultado, o model_2 mostra um resultado melhor que o model_1 .

Aqui está um exemplo. Observe que o model_1 mostra alguns falsos positivos (meio esquerdo e grama) e respostas negativas falsas (abelhas ao redor da entrada da colméia).


Modelo esquerdo_1, modelo direito_2

Marcando corrigindo um modelo incorreto


Esses dados também são um ótimo exemplo de como corrigir um modelo ruim é mais rápido do que marcar do zero ...

  1. Marcamos 10 imagens e treinamos o modelo.
  2. Usamos o modelo para marcar as próximas 100 imagens.
  3. Usamos a ferramenta de marcação para corrigir as marcas nessas 100 imagens.
  4. Eduque novamente o modelo em 110 fotos.
  5. Repetimos ...

Esse é um padrão de aprendizado muito comum e às vezes obriga a revisar um pouco sua ferramenta de rotulagem.

Contando


A possibilidade de detectar abelhas significa que podemos contá-las! E, por diversão, desenhe gráficos divertidos que mostrem o número de abelhas durante o dia. Eu amo a maneira como eles trabalham o dia todo e chego em casa por volta das 16h. :)



Saída Raspberry Pi


O lançamento do modelo no Pi foi uma parte importante deste projeto.

Diretamente no ferro Pi


Foi originalmente planejado congelar o gráfico TensorFlow e simplesmente executá-lo diretamente no Pi. Isso funciona sem problemas, mas apenas o Pi obtém apenas 1 imagem por segundo. : /

Executando no módulo de computação Movidius


Fiquei muito interessado na oportunidade de lançar um modelo em um Pi usando o Movidus Neural Compute Stick . Este é um gadget incrível.

Infelizmente, nada aconteceu: /. A API para converter um gráfico TensorFlow em seu formato de modelo interno não suporta meu método de decodificação. Portanto, era necessário aumentar o tamanho (upsizing), usando a desconvolução em vez de redimensionar nos vizinhos mais próximos. Não há problemas além do fato de que nada aconteceu. Existem muitas pequenas dificuldades, devido às quais os erros se multiplicaram . Quando eles são corrigidos, você pode retornar a este tópico ...

Modelo v3: imagem RGB → contagem de abelhas
Isso me levou à terceira versão do modelo: podemos ir diretamente da entrada RGB para a contagem de abelhas? Dessa forma, evitaremos problemas com operações não suportadas no Movidus Neural Compute Stick, embora seja improvável que o resultado seja tão bom quanto no modelo centróide v2.

No começo, tive medo de tentar esse método: pensei que exigiria muito mais rotulagem (não é mais um sistema baseado em fragmentos). Mas! Tendo um modelo que se sai muito bem com a pesquisa de abelhas e muitos dados não marcados, é possível gerar um bom conjunto de dados sintéticos aplicando o modelo v2 e simplesmente contando o número de detecções.

Esse modelo é bastante fácil de aprender e fornece resultados significativos ... (embora ainda não seja tão bom quanto um simples cálculo dos centróides detectados pelo modelo v2).

Número real e previsto de abelhas em algumas amostras de teste
O real40.191615131211108764
preditivo v2 (centróide)39.19161313141188764
previsão v3 (cálculo simples)33.115,312,312,513,310,49,38,76.3.7.15,94.2

... infelizmente, o modelo ainda não funciona no Neural Compute Stick (ou seja, funciona, mas fornece apenas resultados aleatórios). Fiz mais alguns relatórios de erros e novamente adiei o gadget para voltar mais tarde ... algum dia ...

O que vem a seguir?


Como sempre, um monte de pequenas coisas permaneceu ...

  • Lançamento no Neural Compute Stick (NCS); Agora estamos aguardando algum trabalho da parte deles ...
  • Port tudo para a câmera JeVois embutida . Eu brinquei com ela um pouco, mas antes de tudo eu queria lançar um modelo no NCS. Eu quero rastrear abelhas a 120 FPS !!!
  • Acompanhe as abelhas entre vários quadros / câmeras para visualizar o fluxo óptico.
  • Explore com mais detalhes os benefícios de uma abordagem semi-controlada e treine um modelo maior para rotular dados para um modelo menor.
  • Explore os recursos do NCS; o que fazer com a definição de hiperparâmetros?
  • Continue desenvolvendo uma versão pequena do FarmBot para realizar alguns experimentos genéticos com mudas de CNC (ou seja, algo completamente diferente).

Código


Todo o código é publicado no Github .

Source: https://habr.com/ru/post/pt413799/


All Articles