você está aqui: Home  → Arquivo de Mensagens

Conceito - Evitando acidentes com visão computacional

Colaboração: Alessandro de Oliveira Faria

Data de Publicação: 06 de agosto de 2014

Visão computacional é uma divisão da computação que trabalha com o conceitos das máquinas que enxergam. Esta tecnologia é geralmente aplicada em robôs industriais, veículos autônomos, câmeras inteligentes, biometria e outros sistemas computacionais.

Trabalhos relacionados à visão computacional, têm ainda um longo caminho evolutivo, pois somente após o final da década de 70 que se iniciaram estudos aprofundados. Entretanto, a evolução do hardware e os seus respectivos recursos, vem ajudando muito ao progresso deste segmento.

A visão computacional é um problema mal posto, como também não existe uma formulação padrão para a resolução do mesmo, todos os métodos são baseados em aprendizagem e está cada vez mais comum no mercado de tecnologia.

O reconhecimento de padrões e a aprendizagem de máquina é um processo que consiste em determinar se uma imagem contém ou não um objeto. As principais lógicas de processamento estão classificadas geralmente em:

  1. Aquisição da imagem: geralmente a imagem é obtida através de um dispositivo de vídeo captura, câmeras digitais, celulares, smartphones e outros.
  2. Pré-processamento: geralmente, é necessário processar a imagem para garantir as condições mínimas. Por exemplo, redução de ruídos, balanceamento de brilho e contraste.
  3. Extração da características: características matemáticas em diversos níveis de dificuldades são extraídas. Como exemplo, o processo de detecção de borda, cantos, morfologia matemática e muitos outros.
  4. Segmentação: a seleção de regiões de interesse e/ou segmentação são incluídas nas áreas que contém o objeto.
  5. Processamento: um conjunto de dados é processado e verificado a satisfação e conformidades matemáticas.

O princípio computacional do título deste artigo, baseia-se com os devidos treinos computacionais (o qual não é o objetivo deste documento), podemos detectar animais, humanos, partes do corpo e objetos. Então, se identificados os itens mencionados, podemos estimar a ação do indivíduo e/ou animal e objeto.

Após detectar as partes do corpo, calculamos os vetores para simplificar o trabalho do algoritmo de detecção de esqueleto. Sendo assim, facilmente identificamos, por exemplo, pedestres, ciclistas, cavalos e outros prováveis obstáculos possivelmente diante do veículo.

Com todas estas informações, as ações como pular, falar ao celular, tocar um instrumento, ler, cavalgar, correr, tirar foto, usar um computador e outros, tornaram-se uma tarefa tangível.

E a performance? Em 2011 utilizei a biblioteca OpenCV compilada com as chamadas do SDK NVIDIA. Ou seja, utilizei a GPU para obter o máximo desempenho na localização de padrões. No caso do vídeo demonstrativo a seguir uma face.

Atualmente, com a abertura do código Tegra para GNU/Linux, podemos em hardwares embarcados, utilizar todo o poder do hardware junto à biblioteca OpenCV e outros recursos/bibliotecas de visão computacional.

Mão na massa

O motor principal do projeto é a biblioteca LibPaBOD, escrita em C++ e criada para detectar objetos usando misturas de modelos, assim, detectando parcialmente peças do objeto em questão.

O processo recebe uma imagem que, por sua vez, é submetida ao processamento, utiliza modelos anteriormente treinados em MATLAB. Esta biblioteca utiliza, como dependência, os pacotes OpenCV e MatIO, então instale na sua distribuição favorita os requisitos para iniciar a instalação desta biblioteca.

O download do código fonte deve ser efetuado com o comando git, conforme o exemplo abaixo:

  # git clone ""https://github.com/mjmarin/libpabod
  Cloning into 'libpabod'...
  remote: Counting objects: 350, done.
  remote: Total 350 (delta 0), reused 0 (delta 0)
  Receiving objects: 100% (350/350), 684.93 KiB | 176.00 KiB/s, done.
  Resolving deltas: 100% (179/179), done.
  Checking connectivity... done

Logo a seguir, entre na pasta recém criada, crie a pasta build e utilize o comando cmake:

  # cd libpabod/
  # mkdir build
  # cd build/
  # cmake ..
  -- The C compiler identification is GNU 4.8.1
  -- The CXX compiler identification is GNU 4.8.1
  -- Check for working C compiler: /usr/bin/cc
  -- Check for working C compiler: /usr/bin/cc -- works
  -- Detecting C compiler ABI info
  -- Detecting C compiler ABI info - done
  -- Check for working CXX compiler: /usr/bin/c++
  -- Check for working CXX compiler: /usr/bin/c++ -- works
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  -- CMAKE_BUILD_TYPE=
  -- Found PkgConfig: /usr/bin/pkg-config (found version "0.28")
  -- checking for module 'matio>=1.3.3'
  --   found matio, version 1.5.2
  -- MATIO lib=matio;hdf5;z
  -- -------------------------------------------------------------------------------
  -- GNU COMPILER
  -- -------------------------------------------------------------------------------
  -- OpenCV_LIB_DIR=
  --
  -- -------------------------------------------------------------------------------
  -- General configuration for pabod 0.2.10
  -- -------------------------------------------------------------------------------
  --
      Built as dynamic libs?:ON
      Compiler:/usr/bin/c++
  -- C++ flags (Release):         -Wall -Wno-long-long -ffunction-sections  -fopenmp  -fomit-frame-pointer -O3 -ffast-math -mmmx -msse -msse2 -msse3 -DNDEBUG
  -- C++ flags (Debug):           -Wall -Wno-long-long -ffunction-sections  -fopenmp -g3 -O0 -DDEBUG -D_DEBUG -W -Wextra -Wno-return-type
  -- CMAKE_CXX_FLAGS:           -Wall -Wno-long-long -ffunction-sections  -fopenmp
  -- CMAKE_BINARY_DIR:         /tmp/libpabod/build
  --
  -- CMAKE_SYSTEM_PROCESSOR = x86_64
  -- BUILD_SHARED_LIBS = ON
  -- CMAKE_INSTALL_PREFIX = /usr/local
  -- CMAKE_BUILD_TYPE =
  -- CMAKE_MODULE_PATH = /usr/local/lib/cmake/;/usr/lib/cmake
  --
  -- ---------------------------     Documentation     -----------------------------
  --
  -- INSTALL_DOC = OFF
  -- USE_LATEX =
  -- USE_DOT =
  -- USE_CHM =
  --
  -- OpenCV_LIB_DIR=
  -- CMAKE_INSTALL_PREFIX=/tmp/libpabod/build
  --
  --
  -- Change a value with: cmake -D<Variable>=<Value>
  --
  -- Configuring done
  -- Generating done
  -- Build files have been written to: /tmp/libpabod/build

Agora, utilize o comando make e make install, para efetuar a compilação e instalação do pacote. Se tudo estiver funcionando corretamente, na pasta /usr/local/bin/ estará presente os arquivos detectobj, detectobj2 e detectvid.

Para entender melhor o funcionamento, ao executarmos o comando detectobj precedido dos parÂmentos cavalo.mat como modelo e uma imagem, teremos a seguinte saída como detecção:

  # detectobj -m ../../data/models/cavalo_v6.mat -i livinha.jpg -t 0.1
    Model: ../../data/models/cavalo_v6.mat
    Image: livinha.jpg
    Threshold used:      0.1
  
  init done
  opengl support available
  Searching for objects... This operation may take a few seconds
  
  Elapsed time: 25.3003 seconds
  
  1 object(s) found using threshold = -9.22337e+18
  ----------------------------------------------
  
    - cavalo 1, score = 0.137023
  
  Push 't' key to save a copy of (t)agged image
  Push 'c' key to save each of objects found on differents (c)ut images
  Push 'q' key to (q)uit

Após alguns segundos, o resultado será o processamento similar à imagem a seguir:

Este documento tem como objetivo, demonstrar uma prova de conceito sobre como podemos utilizar o poder dos hardwares atuais, junto à força do software livre.

Então, deixo aqui a minha colaboração para futuras ideias e implementações neste segmento.

Críticas e sugestões, enviem para cabelo[at]opensuse.org.

Linux: Utilize qualquer Tablet/Smartphone como monitor estendido sem fio no GNU/Linux

Este artigo foi publicado originalmente no portal Viva o Linux



Veja a relação completa dos artigos de Alessandro de Oliveira Faria