Como escrevi minha tese de mestrado em visão computacional

Neste artigo, continuarei o tópico de visão computacional.



Consulte os artigos anteriores: Algoritmo simples de reconhecimento de movimento e um algoritmo para localizar o deslocamento de objetos na imagem . Deixe-me lembrá-lo de que fui solicitado a escrever estes artigos pelo fato de que quando comecei a trabalhar na minha tese de mestrado sobre "Análise da estrutura espacial de imagens dinâmicas", enfrentei o problema de que é muito difícil encontrar alguns exemplos prontos de algoritmos para reconhecer imagens e objetos em movimento. Em todo lugar, tanto na literatura quanto na Internet, existe apenas uma teoria nua e crua. Muito tempo se passou desde então, consegui defender com sucesso minha tese e receber um diploma vermelho, e agora estou escrevendo para compartilhar minha experiência.



Então, quando comecei a trabalhar nas minhas dissertações, meu conhecimento na área de visão computacional era zero. Onde eu comecei? Dos experimentos mais simples em imagens, que são descritos nos artigos acima. Escrevi alguns algoritmos primitivos, um dos quais me mostrou na forma de pontos onde os objetos em movimento estão localizados, e o segundo encontrou um pedaço da imagem em uma imagem maior (funcionou, é claro, lentamente).



Qual é o próximo? Conectando mais. Minha tarefa era para o veículo aéreo não tripulado navegar por fotografias aéreas ou rastrear um carro em movimento na estrada. E eu não tinha ideia de como iniciar a tarefa. O que comecei a fazer? Leia a teoria. E a teoria dizia que a visão computacional se divide nas seguintes etapas:



  1. Pré-processamento de imagem (remoção de ruído, aumento de contraste, dimensionamento e assim por diante).
  2. Encontrar detalhes (linhas, fronteiras, pontos de interesse)
  3. Detecção, segmentação.
  4. Processamento de alto nível.


Bom, ok, desenhei um diagrama do programa que deveria fazer tudo isso:



imagem



Resumindo, descobri que eu tinha que criar algo grandioso no nível da Inteligência Artificial. Ok, vou tentar criá-lo. Pego o Visual Studio e começo a esculpir aulas em C #. Mais precisamente, espaços em branco de classe. Um pouco depois eu percebi o que eu queria….



Então, começo a praticar o primeiro passo. Pré-processando. Comecei com ela porque



  1. Este é o mais simples.
  2. Esta é a primeira etapa da lista.


Comecei a aplicar diferentes filtros à imagem, para ver o que acontecia. Por exemplo, tentei aplicar o filtro Sobel:



imagem



Remover ruído da imagem usando desfoque Gaussiano:



imagem



Estudei filtragem mediana e seleção de borda:



imagem



uma palestra sobre visão computacional na sala de aula me ajudou muito .



Então, o conhecimento se tornou muito mais, mas ainda não está claro como resolver o problema. Naquela época, o tema e a tarefa da dissertação de mestrado já haviam sido revisados ​​várias vezes e, como resultado, ela foi formulada da seguinte forma: "Rastreando a trajetória de um VANT usando molduras de fotografias aéreas." Ou seja, precisei tirar várias fotos e construir uma trajetória ao longo delas.



Tive a ideia de descrever o contorno na forma de linhas quebradas (descritas por muitos segmentos) e, em seguida, comparar o quanto essas linhas se deslocaram. Mas descobriu-se que os contornos, mesmo em dois quadros adjacentes, eram tão diferentes que não havia como comparar adequadamente os conjuntos das linhas quebradas resultantes. Tentei melhorar os próprios contornos usando vários métodos e suas combinações:



  • Seleção clássica do Canny Edge da biblioteca OpenCV
  • Algoritmo de detecção de borda aprimorado desenvolvido por meu supervisor.
  • Seleção de contornos por binarização.
  • Seleção de contornos por segmentação. A segmentação foi realizada de várias maneiras, em particular, usando recursos de textura.


Como resultado, obtivemos uma confusão de algoritmos que funcionavam muito lentamente, mas não chegavam nem um pouco mais perto do resultado. Parte do meu trabalho foi usado como material para este artigo .



Pois é, então o supervisor sugeriu uma ideia: é preciso usar pontos especiais. E ele até forneceu um algoritmo sobre como calcular esses pontos-chave. Devo dizer que este era um método muito fora do padrão. Este não é um detector Harris, ou BRISK, ou MSER, ou AKAZE. Embora eu tenha tentado usá-los também. Mas, como se viu, o detector proposto pelo supervisor funcionou melhor. E é assim que funciona. Primeiro, calculamos a preparação do contorno usando esta fórmula:



imagem



imagem



Então encontramos os extremos dessa função. Esses são os pontos especiais. Notavelmente, os pontos podem ser de dois tipos "Picos" e "Pits". Aqui está um exemplo desses pontos na imagem: A



imagem



seguir, 50 pontos com a resposta máxima são selecionados a partir dos pontos obtidos. Para todos esses pontos, triângulos são construídos, o número de triângulos formados por esses pontos é:



imagem



onde k é o número de pontos singulares envolvidos no cálculo. Para cada triângulo, um índice especial é calculado de 0 a 16383. A próxima etapa é distribuir os triângulos em uma matriz especial, na qual o número da célula corresponde ao índice do triângulo. Cada célula dessa matriz é uma lista de triângulos. Essa matriz é compilada por dois quadros comparados. As comparações são feitas combinando cada célula na matriz com a célula correspondente na matriz de outro quadro. No total, 16384 grupos precisam ser combinados, o que é uma tarefa bastante viável para um computador em um período de tempo bastante curto.



Ao combinar matrizes, preenchemos a matriz de correspondência. A matriz horizontalmente são os ângulos entre os triângulos combinados, e a escala vertical é a escala, que é calculada como a razão dos comprimentos dos lados mais longos. A escala e o ângulo encontrados são a célula da matriz com mais correspondências. Uma comparação semelhante é feita para calcular o deslocamento horizontal e vertical das imagens.

Leia mais sobre esse método no artigo.



Assim, encontramos o deslocamento horizontal e vertical, o ângulo e a mudança de escala (ou seja, o VANT subiu ou desceu). Resta escrever um programa que simule traçar uma trajetória sobre uma série de frames e traçar essa mesma trajetória, e podemos dizer que a dissertação está pronta:



imagem



All Articles