Introduction to Motion Estimation with Optical Flow

In this tutorial, we div into the fundamentals of Optical Flow, look at some of its applications and implement its two main variants (sparse and dense). Também discutimos brevemente abordagens mais recentes utilizando a aprendizagem profunda e direções futuras promissoras.

recentes descobertas na pesquisa de visão computacional permitiram que máquinas percebessem seu mundo circundante através de técnicas como a detecção de objetos para detectar instâncias de objetos pertencentes a uma determinada classe e segmentação semântica para classificação em pixels.

no entanto, para o processamento de entrada de vídeo em tempo real, a maioria das implementações destas técnicas apenas abordam as relações de objetos dentro do mesmo quadro \((x, y)\) ignorando a informação de tempo \(t)\). Em outras palavras, eles reavaliam cada frame de forma independente, como se fossem imagens completamente não relacionadas, para cada execução. No entanto, e se precisarmos das relações entre quadros consecutivos, por exemplo, queremos rastrear o movimento dos veículos através de quadros para estimar a sua velocidade atual e prever a sua posição no próximo quadro?

fluxo óptico esparso do tráfego (cada seta aponta na direcção do fluxo previsto do pixel correspondente).

ou, alternativamente, e se precisarmos de informações sobre relações pose humanas entre quadros consecutivos para reconhecer ações humanas como tiro com arco, basebol e basquetebol?

Vários esportes de ação classificações
Vários ação classificações
Classificar ações de fluxo óptico
Classificação de ações de fluxo óptico

neste tutorial, vamos aprender o que o Fluxo Óptico é, de como implementar suas duas principais variantes (esparsas e densas), e também obter uma grande figura das mais recentes abordagens que envolvem uma aprendizagem mais profunda e futuro promissor direções.o que é o fluxo óptico?
Implementing Sparse Optical Flow
Implementing Dense Optical Flow
Deep learning and beyond

What is optical flow?vamos começar com uma compreensão de alto nível do fluxo óptico. Fluxo óptico é o movimento de objetos entre quadros consecutivos de sequência, causado pelo movimento relativo entre o objeto e a câmera. O problema do fluxo óptico pode ser expresso como:

fluxo Óptico problema
fluxo Óptico problema

entre quadros consecutivos, podemos expressar a imagem de intensidade \((I)\) como uma função do espaço \((x, y)\) com \((t)\). Em outras palavras, se tomarmos a primeira imagem \(I(x, y, t)\) e mover seus pixels por \((dx, dy)\) através de \(t\) tempo, obtemos a nova imagem \(I(x + dx, y + dy, t + dt)\).em primeiro lugar, assumimos que as intensidades de pixels de um objeto são constantes entre quadros consecutivos.

intensidade Constante assunção de fluxo óptico
intensidade Constante assunção de fluxo óptico

em Segundo lugar, nós tomamos a Série de Taylor Aproximação dos RHS e remover termos comuns.

Série de Taylor Aproximação de intensidade do pixel
a Série de Taylor Aproximação de intensidade do pixel

o Terceiro, dividimos por \(dt\) para derivar o fluxo óptico equação:

fluxo Óptico equação
fluxo Óptico equação

onde \(u = dx/dt\) e \(v = dy/dt\).

\(dI / dx, dI / dy\), e \(dI/dt\) são os gradientes de imagem ao longo do eixo horizontal, do eixo vertical e do tempo. Assim, concluímos com o problema do fluxo óptico, isto é, resolvendo \(u (dx/dt)\) e \(v (dy/dt)\) para determinar o movimento ao longo do tempo. Você pode notar que não podemos resolver diretamente a equação de fluxo óptico para \(u\) e \(v\), uma vez que existe apenas uma equação para duas variáveis desconhecidas. Vamos implementar alguns métodos, como o método Lucas-Kanade para abordar esta questão.

Esparsos vs Denso Fluxo Óptico

Esparsos fluxo óptico dá o fluxo de vetores de algumas características interessantes” (dizem alguns pixels representando as bordas ou cantos de um objeto) no quadro enquanto Denso fluxo óptico, o que dá o fluxo de vetores de todo o quadro (pixels) – até um fluxo de vetor por pixel. Como você teria adivinhado, fluxo óptico denso tem maior precisão ao custo de ser lento/computacionalmente caro.

Left: Fluxo Óptico esparso-track a few “feature” pixels; Right: Dense Optical Flow – estimate the flow of all pixels in the image.

Implementing Sparse Optical Flow

Sparse optical flow selects a sparse feature set of pixels (e.g. interesting features such as edges and corners) to track its velocity vectors (motion). As características extraídas são passadas na função de fluxo óptico de quadro a quadro para garantir que os mesmos pontos estão sendo rastreados. Existem várias implementações de fluxo óptico esparso, incluindo o método Lucas-Kanade, o método Horn–Schunck, o método Buxton–Buxton, e muito mais. Vamos usar o método Lucas-Kanade com o OpenCV, uma biblioteca de código aberto de algoritmos de visão computacional, para implementação.

configurando seu ambiente

Se você já não tiver OpenCV instalado, abra o Terminal e execute:

pip install opencv-python

Agora, clonar o tutorial repositório de execução:

git clone https://github.com/chuanenlin/optical-flow.git

em seguida, aberto sparse-starter.py com seu editor de texto. Vamos escrever todo o código neste arquivo Python.

Configurar OpenCV para ler um vídeo e configurar os parâmetros

Shi-Tomasi Canto Detector – a seleção de pixels para acompanhar

Para a implementação de esparsos fluxo óptico, nós só acompanhar o movimento de um conjunto de pixels. Características nas imagens são pontos de interesse que apresentam informação rica de conteúdo de imagem. Por exemplo, tais características podem ser pontos na imagem que são invariantes a tradução, escala, rotação e mudanças de intensidade, como cantos.

O Detector de Canto Shi-Tomasi é muito semelhante ao popular Detector de Canto de Harris, que pode ser implementado pelos seguintes três procedimentos:

  1. determina janelas (pequenas manchas de imagem) com grandes gradientes (variações na intensidade da imagem) quando traduzidas em ambas as direcções \(x\) e \(y\).
  2. para cada janela, calcula uma pontuação \(R\).
  3. dependendo do valor de \(R\), cada janela é classificada como plana, borda ou canto.se você gostaria de saber mais sobre uma explicação matemática passo a passo do detector de cantos Harris, sinta-se livre para passar por estes slides.

    Shi and Tomasi later made a small but effective modification to the Harris Corner Detector in their paper Good Features to Track.

    Shi-Tomasi executa melhor do que Harris. Fonte

    a modificação é para a equação em que a pontuação \(R\) é calculada. No detector de Canto de Harris, a função de pontuação é dada por:

    $$
    \begin{array}{c}{R=\operatorname{det} M-k(\operatorname{trace} M)^{2}}\newline \
    {\operatorname{det} M=\lambda_{1} \lambda_{2}}\newline \
    {\operatorname{trace} M=\lambda_{1}+\lambda_{2}}\end{array}
    $$

    em Vez disso, Shi-Tomasi propôs a pontuação de função como:

    $$
    R=\min \left(\lambda_{1}, \lambda_{2}\right)
    $$

    o que significa, basicamente, se \(R\) é maior do que um limite, ele é classificado como um canto. O seguinte compara as funções de pontuação de Harris (esquerda) e Shi-Tomasi (direita) no espaço \(λ1-λ2\).

    Comparison of Harris and Shi-Tomasi scoring functions on λ1-λ2 space. Fonte

    Para Shi-Tomasi, apenas quando \(λ1\) e \(λ2\) estão acima de um limiar mínimo \(λmin\) é a janela classificada como um canto.

    A documentação da implementação do OpenCV do Shi-Tomasi via goodFeaturesToTrack() pode ser encontrada aqui.

    rastreamento de objetos específicos

    pode haver cenários onde você quer apenas rastrear um objeto específico de interesse (dizer rastreamento de uma determinada pessoa) ou uma categoria de objetos (como todos os 2 veículos wheeler no tráfego). Poderá modificar facilmente o código para seguir os pixels do(s) objecto (s) que deseja, alterando a variávelprev.

    pode também combinar a detecção de objectos com este método para estimar apenas o fluxo de pixels dentro das Caixas envolventes detectadas. Desta forma, você pode rastrear todos os objetos de um determinado tipo/categoria no vídeo.

    rastreando um único objeto usando fluxo óptico.

    Lucas-Kanade: Esparso Fluxo Óptico

    Lucas e Kanade proposta uma técnica eficaz para estimar o movimento de características interessantes comparando os dois quadros consecutivos em seu artigo Um processo Iterativo de Registo da Imagem Técnica com uma Aplicação de Visão Estéreo. O método Lucas-Kanade funciona sob os seguintes pressupostos::

    1. dois quadros consecutivos são separados por um pequeno aumento de tempo (\(dt\)), de modo que os objetos não são deslocados significativamente (em outras palavras, o método funciona melhor com objetos em movimento lento).uma moldura retrata uma cena “natural” com objetos texturizados exibindo tons de cinza que mudam suavemente.

    primeiro, sob estes pressupostos, podemos ter uma pequena janela 3×3 (vizinhança) em torno das características detectadas por Shi-Tomasi e assumir que todos os nove pontos têm o mesmo movimento.

    Lucas-Kanade: Fluxo óptico é estimada para os pixels pretos

    Este pode ser representado como

    Lucas-Kanade: 9 intensidades de pixel no formato de equação

    onde \(q_1, q_2, …, q_n\) denotam os pixels dentro da janela (por exemplo, \(n\) = 9 para uma janela 3×3) e \(I_x(q_i)\), \(I_y(q_i)\) e \(I_t(q_i)\) denotam as derivadas parciais de imagem \(I\) com relação à posição \((x, y)\) com \(t\), para o pixel \(q_i\) no momento atual.

    esta é apenas a equação de fluxo óptico (que descrevemos anteriormente) para cada um dos pixels.

    O conjunto de equações pode ser representado na seguinte forma de matriz, onde \(Av = b\):

    9 intensidades de pixel em forma de matriz

    note que anteriormente (consulte “o Que é fluxo óptico?”section), we faced the issue of have to solve for two unknown variables with one equation. Temos agora de resolver para duas incógnitas (\(V_x\) e \(V_y\)) com nove equações, que é demasiado determinada.

    em Segundo lugar, para o endereço da sobre-determinado problema, podemos aplicar mínimos quadrados de ajuste para obter as seguintes duas equações-dois-problema desconhecido:

    Novo fluxo óptico equação em dois equação de-dois-desconhecido formulário

    onde \(Vx = u = dx/dt\) denota o movimento de \(x\) ao longo do tempo e \(Vy = v = dy/dt\) denota o movimento de y ao longo do tempo. Resolver para as duas variáveis completa o problema de fluxo óptico.

    horses on the beach optical flow
    Sparse optical flow of horses on a beach. Source

    In a nutshell, we identify some interesting features to track and iteratively compute the optical flow vectors of these points. No entanto, adotar o método Lucas-Kanade só funciona para pequenos movimentos (a partir de nossa suposição inicial) e falha quando há movimento grande. Portanto, a implementação OpenCV do método Lucas-Kanade adota pirâmides.

    Pyramid method computes optical flow
    Pyramid method computes optical flow at different resolutions. Fonte

    numa visão de alto nível, pequenos movimentos são negligenciados à medida que subimos a pirâmide e grandes movimentos são reduzidos a pequenos movimentos-calculamos o fluxo óptico juntamente com a escala. A comprehensive mathematical explanation of Opencv’s implementation may be found in Bouguet’s notes and the documentation of Opencv’s implementation of the Lucas-Kanade method via calcOpticalFlowPyrLK() may be found here.Visualizando

    e é isso! Open Terminal and run

    python sparse-starter.py

    to test your sparse optical flow implementation. 👏

    no caso de se ter esquecido de algum código, o código completo pode ser encontrado em sparse-solution.py.

    implementando denso Fluxo Óptico

    calculamos previamente o fluxo óptico para um conjunto de características esparsas de pixels. Dense optical flow attempts to compute the optical flow vector for every pixel of each frame. Enquanto tal computação pode ser mais lenta, ela dá um resultado mais preciso e um resultado mais denso adequado para aplicações como a estrutura de aprendizagem de movimento e segmentação de vídeo. Existem várias implementações de fluxo óptico denso. Estaremos usando o método Farneback, uma das implementações mais populares, com o uso do OpenCV, uma biblioteca de código aberto de algoritmos de visão computacional, para implementação.

    configurar o seu ambiente

    se ainda não o tiver feito, por favor siga o Passo 1 de implementação de um fluxo óptico esparso para configurar o seu ambiente.

    seguinte, abrir dense-starter.py com o teu editor de texto. Vamos escrever todo o código neste arquivo Python.

    Configurar OpenCV para ler um vídeo

    Farneback Fluxo Óptico

    Gunnar Farneback proposta uma técnica eficaz para estimar o movimento de características interessantes comparando os dois quadros consecutivos em seu artigo Dois-Quadro de Estimativa de Movimento Baseado em polinˆ Omio de Expansão.

    primeiro, o método aproxima as janelas (veja a seção Lucas Kanade da implementação de fluxo óptico esparso para mais detalhes) de quadros de imagens por polinômios quadráticos através de uma transformada de expansão polinomial. Em segundo lugar, ao observar como o polinômio se transforma sob tradução (movimento), um método para estimar campos de deslocamento de coeficientes de expansão polinomial é definido. Após uma série de refinamentos, o fluxo óptico denso é calculado. O papel de Farneback é bastante conciso e simples de seguir, então eu recomendo que você leia o papel se você gostaria de uma maior compreensão de sua derivação matemática.

    Denso fluxo óptico de três pedestres andando em direções diferentes. Fonte

    para a implementação do OpenCV, ele calcula a magnitude e direção do fluxo óptico a partir de uma matriz de 2 canais de vetores de fluxo \((dx/dt, dy / dt)\), o problema de fluxo óptico. Ele então visualiza o ângulo (direção) do fluxo por matiz e a distância (magnitude) do fluxo pelo valor da representação de cor HSV. A resistência do HSV é sempre ajustada a um máximo de 255 para uma visibilidade óptima. A documentação da implementação do OpenCV do método Farneback via calcOpticalFlowFarneback() pode ser encontrada aqui.Visualizando

    e é isso! Open Terminal and run

    python dense-starter.py

    para testar a sua implementação densa do fluxo óptico. 👏

    No caso de você ter perdido qualquer código, o código completo pode ser encontrado em dense-solution.py.

    Fluxo Óptico usando uma Aprendizagem mais Profunda

    Enquanto o problema de fluxo óptico tem sido, historicamente, um problema de otimização, abordagens recentes aplicando uma aprendizagem mais profunda mostraram resultados impressionantes. De um modo geral, estas abordagens tomam dois quadros de vídeo como entrada para a saída do fluxo óptico( imagem codificada a cores), que podem ser expressos como:

    Generation equation of optical flow computed with a deep learning approach.
    Saída de um profundo modelo de aprendizagem: código de cores de imagem; cor codifica a direção do pixel, enquanto a intensidade indica a sua velocidade.

    onde \(u\) é o movimento em \(x\) direção, \(v\) é o movimento em \(y\) direção e \(f\) é uma rede neural que leva em dois quadros consecutivos \(I_{t-1}\) (fotograma de cada vez = \(t-1)\) e \(I_t\) (fotograma de cada vez = \(t)\) como entrada.

    Architecture of FlowNetCorr, a convolucional neural network for end-to-end learning of optical flow. Fonte

    Computing optical flow with deep neural networks requires large amounts of training data which is particularly hard to obtain. Isso é porque rotular imagens de vídeo para fluxo óptico requer descobrir com precisão o movimento exato de cada ponto de uma imagem para a precisão de subpixel. Para abordar a questão da rotulagem de dados de treinamento, pesquisadores usaram gráficos computacionais para simular mundos realistas massivos. Como os mundos são gerados pela Instrução, o movimento de cada ponto de uma imagem em uma sequência de vídeo é conhecido. Alguns exemplos de tais incluem MPI-Sintel, um filme CGI de código aberto com rotulagem de fluxo óptico renderizado para várias sequências, e cadeiras voadoras, um conjunto de dados de muitas cadeiras voando através de fundos aleatórios também com rotulagem de fluxo óptico.

    Synthetically generated data for training Optical Flow Models – MPI-Sintel dataset. Fonte
    Sinteticamente os dados gerados para a formação de Fluxo Óptico Modelos de Vôo Cadeiras conjunto de dados. Fonte

    resolver problemas de fluxo óptico com a aprendizagem profunda é um tópico extremamente quente no momento, com variantes de FlowNet, SPyNet, PWC-Net, e mais cada um superando um ao outro em vários benchmarks.

    aplicação de Fluxo Óptico: segmentação semântica

    o campo de fluxo óptico é uma vasta mina de informação para a cena observada. À medida que as técnicas de determinar com precisão o fluxo óptico melhoram, é interessante ver aplicações do fluxo óptico em junção com várias outras tarefas fundamentais de visão computacional. Por exemplo, a tarefa de segmentação semântica é dividir uma imagem em uma série de regiões correspondentes a classes de objetos únicos, ainda colocados de perto objetos com texturas idênticas são muitas vezes difíceis para técnicas de segmentação de quadros únicos. Se os objetos são colocados separadamente, no entanto, os movimentos distintos dos objetos podem ser altamente úteis quando a descontinuidade no denso campo de fluxo óptico corresponde a limites entre objetos.

    segmentação semântica gerada a partir do fluxo óptico.segmentação semântica gerada a partir do fluxo óptico. Source

    Optical Flow application: Object Detection & Tracking

    Another promising application of optical flow may be with object detection and tracking or, in a high-level form, towards building real-time vehicle tracking and traffic analysis systems. Uma vez que o fluxo óptico esparso utiliza o rastreamento de pontos de interesse, tais sistemas em tempo real podem ser realizados por técnicas de fluxo óptico baseadas em características de uma câmera estacionária ou câmeras ligadas a veículos.

    Real-time tracking of vehicles with optical flow. Fonte
    fluxo Óptico pode ser usado para prever a velocidade. Fonte

    Conclusão

    Fundamentalmente, fluxo óptico vetores de função como entrada para uma infinidade de tarefas de nível mais alto, exigindo cena compreensão de sequências de vídeo, enquanto estas tarefas podem mais agir como blocos de construção para sistemas mais complexos, tais como a expressão facial de análise, veículo autônomo de navegação, e muito mais. Novas aplicações para fluxo óptico ainda por descobrir são limitadas apenas pela ingenuidade de seus designers.

    preguiçoso para codificar, não quer gastar em GPUs? Vá até Nanonets e construa modelos de visão de computador de graça!

Deixe uma resposta

O seu endereço de email não será publicado.