Selos contra a rede neural. Ou selecione e execute uma rede neural para reconhecer objetos no Raspberry Zero

Bom dia a todos.

A pequena framboesa é uma grande coisa. Eu usei o Raspberry Zero W em alguns projetos nos últimos seis meses. Subornado pela simplicidade de prototipar e rolar várias idéias. E agora, aqui está uma pergunta opcional: esse dispositivo gerará uma grade convolucional de pleno direito? [Spoiler - pull, mas existem nuances engraçadas]. Quem se importa com o tópico - bem-vindo ao gato. Cuidado, haverá muitos gatos!

imagem


Por que a rede neural de framboesa?


De alguma forma, coletei uma simples captura de vídeo no Raspbery Zero W para observar a vida noturna de animais (principalmente gatos) no país. O código era simples e funcionou muito bem. Para a detecção de foto-vídeo, uma câmera com iluminação infravermelha foi usada como esta "Câmera Raspberry Pi Night Version" .

imagem

A essência do código é obter dois quadros consecutivos, comparar pixel por pixel e, se o número de pixels alterados for maior que um determinado valor limite, comece a gravar um vídeo de 10 segundos. Não fornecerei o texto do código neste post; se alguém estiver interessado, escreva nos comentários, posso colocá-lo a seguir. A principal característica é comparar os dois quadros em 0,2 segundos, pelo menos para capturar eventos rápidos. Bem, compare rapidamente esses quadros, é claro.

Então surgiu a idéia de fixar uma rede neural simples no algoritmo, para que fosse possível determinar o objeto no quadro capturado e iniciar a gravação de vídeo somente se a classe do objeto fosse determinada com segurança. Isso potencialmente elimina falsos positivos da armadilha de vídeo. Isso acontece com objetos em movimento (por exemplo, grama ou galhos) ou com uma iluminação nítida da cena da câmera (a luz na janela acende ou a lâmpada se apaga, por exemplo).

Que grade colocar na framboesa?


Felizmente, sob o Python pré-instalado (no meu caso, é o 3.5.3) e o OpenCV amplamente disponível (eu uso o 3.4.3), você pode colocar praticamente qualquer grade. Infelizmente, devido aos recursos limitados de computação do dispositivo, a lista de opções é pequena. De fato, você pode escolher apenas entre as opções "light":

1. SqueezeNet (código de amostra aqui ).
2. YOLO Tiny ( aqui ).
3. MobileNet-SSD ( aqui ).
4. MobileNet_v1_224 (há um vídeo fantástico da operação do detector de objetos nesta grade ).

Em todos esses casos, suborna a oportunidade de usar um modelo pré-treinado em conjuntos de dados sólidos, aliviando-se de todos os tormentos e preocupações de um conjunto de dados independente e subsequente treinamento de uma rede neural sobre eles.

O requerente nº 1 foi inspirado pela alta precisão de reconhecimento alegada com tamanhos modestos de fatores de ponderação. Além disso, uma breve pesquisa na Internet levou ao excelente blog Adrian Rosebrock , que comentou o código em detalhes e descreveu várias opções para implementar o aprendizado profundo em Raspberry.

O código daqui foi usado para testar os recursos do SqueezeNet. O autor envia o peso e a representação textual do modelo para o e-mail após o preenchimento do formulário no site. A propósito, se você não possui o OpenCV instalado, pode encontrar o algoritmo de ações em seu blog. Além disso, existem exemplos de "overclocking" do código para acelerar o tempo de trabalho dos modelos e muito mais. Respeite Adrian, um recurso muito legal.

Bem, vamos executar o código e obter um resultado impressionante na primeira foto!

imagem

O gato da imagem é definido como persa com uma probabilidade de 99%. Na verdade, ele não é persa, mas britânico de cabelos compridos ou highlander. Mas para um modelo com um intervalo de 1000 classes, você pode dizer, atingiu o alvo. Por conveniência, coloquei os principais resultados da rede neural diretamente na foto. Essas são as 5 classes mais prováveis, a primeira é a mais provável, a segunda é a próxima mais significativa e assim por diante.

A propósito, o modelo conta as classes de objetos no meu Zero por 6,5 segundos. Se você acredita nos dados de Adrian, o cálculo do Raspberry Pi B + nas fotos dadas em seu post (foto do cabeleireiro, cobra e água-viva) levará cerca de 0,92 segundos. Acredito de bom grado que a versão completa do Raspberry possui 4 núcleos no processador, afinal. Eu acredito que todo mundo sabe que Zero tem apenas um (((

Parece que você terá que esquecer a definição da classe de objetos em tempo real no Zero. A propósito, devo admitir que um segundo de tempo para trabalhar o modelo em um Pi "cheio" também não é o sonho final.

Mas vamos continuar testando o modelo.

imagem

O gato mudou a posição do corpo e perdeu até 7% do antigo "persa"). Mas isso é uma piada, é claro, em geral, o trabalho do modelo é muito bom. Foi neste mesmo local que foi possível terminar, mas eu queria complicar um pouco a tarefa do modelo. Vamos continuar praticando em ... gatos. Mas coletaremos quadros em que o gato não se senta em uma pose clássica, mas dorme, por exemplo. Então vamos lá.

imagem

Nesta foto, o gato é definido como Angora, mas isso não é exato. Aparentemente, pelo fato de estar irritada com um pedido obsessivo de sair da pia. Bem, a rede neural estava errada, bem, quem não acontece no final?

imagem

Acontece que uma bola de futebol fofa mora em minha casa) Sim, acontece que as pessoas não são o que parecem à primeira vista. A briga entre gatos e redes neurais dá uma guinada séria.

imagem

Uau. Agora ela é uma husky siberiana. Algo me diz que o gato ainda está contando)

imagem

Parece que um desses dois está claramente derrubado e isso claramente não é um gato. Agora ele é definido pela rede neural como um fuso (embora apenas em 8,5%), ainda existem opções de que seja um beagle, uma orca, um pitão rochoso ou um gambá. Não é um gato, mas uma mulher é um mistério!

imagem

Vamos lá! Ainda é uma orca! Sim, sim, um mamífero marinho de uma ordem de cetáceos. Por alguma razão, lembrei-me das falas da infância distante:
"Não há ordem neste conto,
Aqui está um erro, um erro de digitação! Alguem
Contra todas as regras
Em um conto de fadas, ele reorganizou as letras,
Ferried
"KIT" no "CAT",
"CAT" em "KIT", pelo contrário! ".
O gongo toca, o árbitro para a luta)

imagem

Na segunda rodada, o gato, usando astuciosamente óculos, passou pelo bulldog de Boston com uma probabilidade de 34%. Ou para os franceses. Parece que a rede neural não se recuperou totalmente da derrota no primeiro turno)

imagem

Bem, finalmente! O gato é definido como siamês com uma probabilidade de até 66%! Bravo, SqueezeNet! Sério, parece que no conjunto de dados original prevaleceram as fotos de gatos não mentindo, mas sentados. Mentir eram principalmente cães)

imagem

A capacidade dos gatos de tomar a forma de uma caixa é confusa até para os seres humanos, sem falar na rede neural. A imersão na caixa reduziu a precisão do reconhecimento em até 40%.

imagem

Então, então ... E isso, ao que parece, geralmente é uma recepção proibida. O mouse do computador ao lado do gato confunde completamente a rede neural. Agora nosso gato é um rato! )

Assim, toda a rede neural foi apresentada com 11 fotos de gatos, das quais apenas 5. foram identificadas corretamente, além de uma probabilidade de mais de 50% em apenas três casos. De forma alguma diminui o trabalho dos autores da SqueezeNet. Essa é uma rede sólida com uma classe muito ampla de objetos e requisitos de recursos relativamente baixos.

O artigo, é claro, é de natureza cômica, mas conclusões bastante pragmáticas podem ser extraídas dos dados obtidos. É necessário usar redes neurais pré-treinadas com muito cuidado, verificando-as em imagens reais da tarefa para a qual está planejado usar uma rede neural.

Com relação à escolha da rede neural ideal para o Raspberry - a questão permanece em aberto até o momento. Eu continuo os experimentos, se houver interesse do público neste tópico, compartilharei os resultados de outras pesquisas. Só que os resultados do primeiro passo foram tão engraçados que eu realmente queria compartilhá-los.

Obrigado por ler até o fim. Boa sorte e boa semana de trabalho)

UPD: Consulte a segunda parte deste post para obter o código de funcionamento para executar uma rede neural no Raspberry Pi Zero W.

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


All Articles