Índice:

Reconhecimento de imagem com placas K210 e Arduino IDE / Micropython: 6 etapas (com imagens)
Reconhecimento de imagem com placas K210 e Arduino IDE / Micropython: 6 etapas (com imagens)

Vídeo: Reconhecimento de imagem com placas K210 e Arduino IDE / Micropython: 6 etapas (com imagens)

Vídeo: Reconhecimento de imagem com placas K210 e Arduino IDE / Micropython: 6 etapas (com imagens)
Vídeo: Chip de $23 com Inteligência Artificial 2024, Novembro
Anonim
Image
Image

Já escrevi um artigo sobre como executar demos OpenMV no Sipeed Maix Bit e também fiz um vídeo de demonstração de detecção de objetos com esta placa. Uma das muitas perguntas que as pessoas fizeram é - como posso reconhecer um objeto para o qual a rede neural não foi treinada? Em outras palavras, como fazer seu próprio classificador de imagens e executá-lo com aceleração de hardware.

Esta é uma pergunta compreensível, já que para o seu projeto você provavelmente não precisa reconhecer alguns objetos genéricos, como cães e gatos e aviões. Você deseja reconhecer algo específico, por exemplo, uma raça de cachorro para aquela porta automática para animais de estimação, ou uma espécie de planta para classificação, ou qualquer outro aplicativo existente que você possa imaginar!

Te peguei! Neste artigo, vou ensiná-lo a criar seu próprio classificador de imagem personalizado com aprendizagem por transferência em Keras, converter o modelo treinado para o formato.kmodel e executá-lo na placa Sipeed (pode ser qualquer placa, Bit / Dock ou Go) usando Micropython ou IDE Arduino. E apenas sua imaginação será o limite para as tarefas que você pode realizar com esse conhecimento.

ATUALIZAÇÃO DE MAIO DE 2020: Vendo como meu artigo e vídeo sobre reconhecimento de imagem com placas K210 ainda são muito populares e entre os principais resultados no YouTube e Google, decidi atualizar o artigo para incluir as informações sobre aXeleRate, estrutura baseada em Keras para IA no Edge eu desenvolvo.

AXeleRate, essencialmente, é baseado na coleção de scripts que usei para treinar modelos de reconhecimento de imagem / detecção de objetos - combinados em uma única estrutura e otimizados para fluxo de trabalho no Google Colab. É mais conveniente de usar e mais atualizado.

Para a versão antiga do artigo, você ainda pode vê-lo em steemit.com.

Etapa 1: CNN e transferência de aprendizagem: algumas teorias

CNN e transferência de aprendizagem: alguma teoria
CNN e transferência de aprendizagem: alguma teoria

Redes neurais convolucionais ou CNN é uma classe de redes neurais profundas, mais comumente aplicada à análise de imagens visuais. Existe muita literatura na internet sobre o assunto e darei alguns links na última parte do artigo. Em suma, você pode pensar na CNN como uma série de filtros, aplicados à imagem, cada filtro procurando por um recurso específico na imagem - nas camadas convolucionais inferiores, os recursos são geralmente linhas e formas simples e nas camadas superiores os recursos pode ser mais específico, por exemplo partes do corpo, texturas específicas, partes de animais ou plantas, etc. A presença de certo conjunto de características pode nos dar uma pista do que o objeto na imagem pode ser. Bigodes, dois olhos e um nariz preto? Deve ser um gato! Folhas verdes, um tronco de árvore? Parece uma árvore!

Espero que você tenha uma ideia sobre o princípio de funcionamento da CNN agora. Normalmente, uma rede neural profunda precisa de milhares de imagens e horas de treinamento (depende do hardware que você está usando para o treinamento) para "desenvolver" filtros úteis para reconhecer os tipos de objetos que você deseja. Mas existe um atalho.

Um modelo treinado para reconhecer muitos objetos comuns diferentes (gatos, cachorros, eletrodomésticos, transporte, etc.) já tem muitos desses filtros úteis "desenvolvidos", então não precisamos dele para aprender a reconhecer as formas e peças básicas dos objetos novamente. Podemos apenas treinar novamente as últimas camadas da rede para reconhecer classes específicas de objetos, que são importantes para nós. Isso é chamado de "aprendizagem por transferência". Você precisa de muito menos dados de treinamento e tempo de computação com o aprendizado de transferência, uma vez que você está treinando apenas as últimas camadas da rede, compostas talvez por algumas centenas de neurônios.

Parece incrível, certo? Vamos ver como implementá-lo.

Etapa 2: Prepare seu ambiente

Prepare o seu ambiente
Prepare o seu ambiente

Existem duas maneiras de usar aXeleRate: executando localmente na máquina Ubuntu ou no Google Colab. Para executar no Google Colab, dê uma olhada neste exemplo:

Classificação de imagens Colab Notebook

Treinar seu modelo localmente e exportá-lo para ser usado com aceleração de hardware também é muito mais fácil agora.

Meu ambiente de trabalho é Ubuntu 16.04, 64bit. Você pode usar a máquina virtual para executar a imagem do Ubuntu, pois não usaremos GPU para treinamento. Com algumas modificações, você também pode executar o script de treinamento no Windows, mas para a conversão do modelo você precisará usar o sistema Linux. Portanto, o ambiente preferível para você executar este tutorial é o Ubuntu 16.04, rodando nativamente ou em máquina virtual.

Vamos começar instalando o Miniconda, que é o gerenciador de ambiente do Python. Criaremos um ambiente isolado, portanto, não alteraremos acidentalmente nada no ambiente Python de seu sistema.

Baixe o instalador aqui

Após a conclusão da instalação, crie um novo ambiente:

conda criar -n ml python = 3.7

Vamos ativar o novo ambiente

conda ativar ml

Um prefixo antes de seu shell bash aparecerá com o nome do ambiente, indicando que você agora trabalha naquele ambiente.

Etapa 3: Instale AXeleRate e execute os testes

Instale AXeleRate e execute testes
Instale AXeleRate e execute testes

Instale aXeleRate em sua máquina local com

pip install git +

Para baixar os exemplos, execute:

git clone

Você pode executar testes rápidos com tests_training.py na pasta aXeleRate. Ele executará o treinamento e a inferência para cada tipo de modelo, salvará e converterá os modelos treinados. Como ele está treinando apenas para 5 épocas e o conjunto de dados é muito pequeno, você não poderá obter modelos úteis, mas este script serve apenas para verificar a ausência de erros.

Etapa 4: treine novamente o modelo, converta o modelo Keras em.kmodel

Treine novamente o modelo, converta o modelo Keras em.kmodel
Treine novamente o modelo, converta o modelo Keras em.kmodel

Para este exemplo de brinquedo, iremos treinar o modelo para reconhecer o Papai Noel e o Arduino Uno. Obviamente, você pode escolher outras classes. Baixe o conjunto de dados aqui. Crie uma cópia do arquivo classifier.json na pasta de configuração e, em seguida, altere-o de acordo, semelhante ao arquivo de configuração na captura de tela - certifique-se de que o caminho para as pastas de treinamento e validação esteja correto!

Execute o seguinte comando da pasta aXeleRate:

python axelerate / train.py - c configs / santa_uno.json

O treinamento vai começar. Se a precisão da validação (nossa métrica de validação) não melhorar por 20 épocas, o treinamento será interrompido prematuramente. Cada vez que a precisão da validação melhora, o modelo é salvo na pasta do projeto. Após o término do treinamento, aXeleRate converte automaticamente o melhor modelo para os formatos especificados - você pode escolher "tflite", "k210" ou "edgetpu" a partir de agora.

Etapa 5: execute o modelo no bit Sipeed Maix

Execute o modelo no bit Sipeed Maix
Execute o modelo no bit Sipeed Maix
Execute o modelo no bit Sipeed Maix
Execute o modelo no bit Sipeed Maix
Execute o modelo no bit Sipeed Maix
Execute o modelo no bit Sipeed Maix

Existem duas maneiras de executar o modelo que você tem agora no hardware Sipeed Maix: firmware micropython e Arduino IDE. O hardware Micropython é mais fácil de usar, mas ocupa uma parte significativa da memória disponível, portanto, sobra menos espaço para o modelo. Arduino IDE é basicamente código C, que é muito mais eficiente e ocupa menos memória. Meu modelo tem apenas 1,9 Mb, então ambas as opções funcionam para ele. Você pode usar modelos de até 2,9 Mb com Micropython; para qualquer coisa maior, você precisa considerar o uso do IDE do Arduino.

Baixe o IDE OpenMV aqui e o firmware mínimo de micropython aqui.

Grave o firmware com a ferramenta kflash_gui. Você também pode optar por gravar o modelo treinado em flash também, como mostrado na imagem. Ou copie-o para o cartão SD (nesse caso, copie.kmodel para a raiz de um cartão SD e insira o cartão SD no Sipeed Maix Bit)

Abra OpenMV IDE e pressione o botão de conexão. Abra o script santa_uno.py da pasta example_scripts e pressione o botão Iniciar. Você deve estar vendo uma transmissão ao vivo da câmera e, se abrir o Terminal Serial, terá o melhor resultado de reconhecimento de imagem com a pontuação de confiança!

Para usar com o Arduino IDE, primeiro você precisa seguir o procedimento para adicionar placas Sipeed ao Arduino IDE, que está documentado aqui. Sua versão do Arduino IDE precisa ser pelo menos 1.8.12. Depois de adicionar as placas, abra o esboço mobilenet_v1_transfer_learning.ino e carregue-o no Sipeed Maix Bit. Mude o nome do modelo no cartão SD para "modelo" (ou faça uma cópia com este nome). Você pode alterar os nomes dos rótulos em names.cpp. Ele mostrará a transmissão da câmera ao vivo na tela do Sipeed Maix junto com o resultado do reconhecimento da imagem principal.

Etapa 6: Conclusões

Aqui estão mais alguns materiais para ler sobre o tópico CNNs e transferência de aprendizagem:

Aprendizagem por transferência usando Mobilenet e Keras Uma ótima explicação da aprendizagem por transferência, este tutorial usa uma versão modificada do código daquele artigo.

Cães e gatos e redes neurais convolucionais Explica os fundamentos das CNNs e visualiza alguns dos filtros. Com gatos!

Treine, converta, execute o MobileNet no Sipeed MaixPy e MaixDuino! Um tutorial da equipe Sipeed sobre como treinar classes Mobilenet 1000 do zero (sem aprendizagem por transferência). Você pode baixar o modelo pré-treinado e experimentá-lo!

Espero que você possa usar o conhecimento que tem agora para construir alguns projetos incríveis com visão de máquina! Você pode comprar placas Sipeed aqui, elas estão entre as opções mais baratas disponíveis para ML em sistemas embarcados.

Recomendado: