5.34. Conclusão¶
O módulo image é a maior API que a cam expõe, e este capítulo acabou de cobrir o panorama dela: como uma imagem é representada na memória, como a câmera lê e escreve pixels individuais, como ela desenha em quadros capturados, como ela os transforma aritmética e geometricamente, como ela os classifica por limiar e os filtra, como ela extrai medições e detecções deles, como ela decodifica símbolos impressos a partir deles, como ela compara uma imagem com outra e como ela leva os resultados para dentro e para fora da cam.
O conjunto de ferramentas é amplo de propósito. Um pipeline clássico de visão computacional rodando em uma pequena câmera embarcada faz a maior parte de seu trabalho antes que qualquer coisa chegue a um modelo de aprendizado de máquina, quando há um – a limiarização limpa a entrada, os filtros removem ruído, as regiões estreitam a busca, os detectores de blob e de linha localizam candidatos, a pontuação de similaridade decide se o candidato é interessante, e a camada de E/S entrega o resultado a qualquer coisa que execute o próximo estágio. Cada página neste capítulo cobriu uma dessas operações; o pipeline certo para qualquer aplicação dada é uma sequência delas composta na ordem que o problema exige.
5.34.1. O padrão de pipeline¶
A maioria das aplicações não triviais da cam segue o mesmo panorama. Capturar um quadro do sensor. Pré-processá-lo: converter formatos, equalizar o histograma, borrar o ruído. Localizar as regiões ou características de interesse: detecção de blob, detecção de linha, correspondência de modelos, decodificação de códigos. Analisar o que foi encontrado: medições geométricas, pontuação de similaridade, estatísticas. Decidir o que fazer com base na análise: acionar um GPIO, reportar um payload, capturar e registrar, entregar o quadro a um modelo de ML. Emitir a decisão ou o artefato capturado: salvar, codificar, enviar, desenhar de volta no quadro para a pré-visualização do IDE.
Nenhuma página de capítulo cobriu sozinha cada etapa; o capítulo cobriu os blocos de construção que o pipeline compõe. Escolher quais blocos usar e em que ordem é o trabalho do script da aplicação.
5.34.2. Para onde o capítulo conduz¶
O módulo image lida com imagens como imagens – pixels, regiões, desenho, detecções. Boa parte do trabalho com dados capturados não se encaixa nesse enquadramento. Calcular estatísticas sobre um array numérico arbitrário, executar aritmética vetorizada em dados brutos do sensor, aplicar uma transformação de matriz personalizada que não tem um método do módulo image por trás dela, preparar dados para um modelo de aprendizado de máquina que quer um layout de tensor específico – todos esses são trabalhos para uma biblioteca de arrays numéricos, não para uma de processamento de imagens.
O próximo capítulo cobre exatamente isso. O módulo ulab.numpy fornecido com o MicroPython na cam é um subconjunto do NumPy, e duas pontes o conectam ao módulo image: to_ndarray() copia os pixels de um quadro para um ndarray para trabalho numérico, e o construtor Image aceita um ndarray para construir uma nova imagem a partir do resultado, pronta para exibir, salvar ou realimentar a biblioteca image. Os dois módulos se compõem – cada um faz o que o outro não faz, e juntos cobrem o trabalho numérico e de imagem de que uma aplicação de visão embarcada precisa.