algorithme Gunnar-Farneback principe flux optique de démonstration et Farneback sur l'ensemble de données anormales UCSD

Gunnar-Farneback algorithme

论文: deux images de mouvement Estimation basée sur l'expansion polynomiale

期刊: 13e Conférence scandinave sur l'analyse d'images (SICE 2003)

作者: Gunnar Farnebäck (Computer Vision Laboratory, Université de Linköping, SE-581 83 Linköping, Suède)

Note: [email protected] http://www.isy.liu.se/cvl/

Tout d'abord, l'expansion polynomiale

L'idée est d'élargir le polynôme pour chaque pixel dans le voisinage sont représentés par un polynôme:

f (x) \ sim x ^ {T} Ax + b ^ {T} x + c(1)

Où A est une matrice symétrique, b est un vecteur, c est une constante. Coefficient est estimée selon la méthode des moindres carrés pondérés de valeurs de signal dans le voisinage. Le poids des deux composants, connu sous le nom déterministe et applicabilité. La valeur de signal déterministe couplée à des zones adjacentes, en fonction du point pour déterminer le caractère approprié de points poids relatifs dans le voisinage de la position du poids dans le voisinage.

En second lieu, l'estimation de déplacement

Parce que chaque quartier peut être utilisé pour approcher un polynôme, donc la première analyse d'un changement polynomiale ce qui se passera après la traduction. Considérons le polynôme quadratique suivante:

f_ {1} (x) = x ^ {T} A_ {1} x + b_ {1} ^ {T} x + c_ {1}     (2)

signal de déplacement global d pour obtenir des unités f_ {2}:

f_ {2} = f_ {1} (x - d) ^ {T} A_ {1} (x - d) + b_ {1} ^ {T} (x - d) + c_ {1} = x ^ { T} A_ {2} x + b_ {2} ^ {T} + c_ {2}     (3)

À condition que l'équation polynomiale quadratique suivante:

A_ {2} = A_ {1}     (4)

b_ {2} = b_ {1} - {1} 2A_ d     (5)

c_ {2} = d ^ {T} A_ {1} d - b_ {1} ^ {T} d + c_ {1}     (6)

Lorsque le A_ {1}temps est une matrice non singulière, il peut être résolu ré:

2A_ {1} d = - (b_ {2} - b_ {1})     (sept)

d = - \ frac {1} {2} A_ {1} ^ {- 1} (b_ {2} - b_ {1})     (8)

En réalité, l'absence complète d'un signal est représenté par un polynôme, et de translation globale de ces deux signaux d'image, l'équation ci-dessus (7) applique encore le signal réel.

Ici mondial polynomiale Approximation (2) avec une équation polynomiale locale. Ensuite , les deux images ayant une expansion polynomiale, une première coefficients correspondant l' image A_1 (x), b_ {1} (x)et c_ {1} (x)la deuxième image de la même manière. Idéalement, selon l'équation (4) devrait avoir A_ {2} = A_ {1}, mais devrait résoudre réellement approximation:

A (x) = \ frac {A_1 (x) + A_ {2} (x)} {2}     (9)

\ Delta b (x) = - (- (x) b_ {1} b_ {2} (x)) \ frac {1} {2}     (dix)

Ensuite , au d (x)lieu de l'avant des variables globales ré:

A (x) d (x) = \ Delta b (x)     (11)

Commençons à résoudre l'estimation du voisin problème. Calcule les valeurs de chaque pixel selon l'équation (11), mais compte tenu de l'énorme quantité de calcul à faire est évidemment pas réaliste. En supposant que le processus de déplacement est effectué lentement, alors il devrait être réduit autant que possible Xquartier jechercher et de trouver la ligne avec l' équation (11) d (x):

somme $ \ _ {\ Delta x \ epsilon I} ^ w (\ Delta x) \ left \ {.} |  A (x + \ Delta x) d (x) - \ Delta b (x + \ Delta x) \ right \ | ^ {2}     (12)

Ici définir w (\ delta x)des pixels correspondant fonction de pondération, peuvent être obtenus selon la méthode des moindres carrés:

d (x) = (\ somme wA ^ {T} A) ^ {- 1} \ somme wA ^ {T} \ Delta b     (13)

Troisièmement, les paramètres du champ de déplacement

Afin d'améliorer la robustesse de l'algorithme, pour certains modèles de mouvement devrait être établi modèle paramétrique. Le modèle de mouvement 2D suivant construit avec huit paramètres:

D_ {x} (x, y) = {1} a_ + a_ {2} x + a_ {3} y + a_ {7} x ^ {2} + a_ {8} xy     (15)

D_ {y} (x, y) = a_ {4} + a_ {5} x + a_ {6} y + a_ {7} x ^ {2} + a_ {8} xy

Elle peut être exprimée par la formule:

d = S_ {P}      (16)

S = \ binom {1, x, y, 0,0,0, x ^ {2}, {xy} 0,0,0,1, x, y, xy, y ^ {2}}     (17)

P = (a_ {1}, a_ {2}, {3} a_, a_ {4}, {5} a_, a_ {6}, {7} a_, a_ {8}) ^ {T}      (18)

Dans l'équation (12), pour obtenir un problème des moindres carrés pondérés:

{.} \ Sum_ {i} ^ {i} w_ \ left \ |  A_ {i} S_ {i} P - \ Delta b_ {i} \ right \ | ^ {2}     (19)

Maintenant , avec les jecoordonnées du pixel de voisinage à l'indice, avec la méthode des moindres carrés peuvent être tirées:

P = ({.} \ Sum_ {i} ^ w_ {i} S_ {i} ^ {T} A_ {i} ^ {T} A_ {i} S_ {i}) ^ {- 1} \ sum_ {i } ^ {.} w_ {i} S_ {i} ^ {T} A_ {i} ^ {T} \ Delta b_ {i}     (20)

Ici ont été calculés comme avant S_ {i} ^ {T} A_ {i} ^ {T} A_ {i} S_ {i}et S_ {i} ^ {T} A_ {i} ^ {T} \ Delta b_ {i}ensuite utilisé wpour faire une moyenne pondérée du déplacement est obtenu d (x).

Quatrièmement, l'utilisation d'une information a priori

Jusqu'à présent , il y a encore un problème que deux signaux locaux polynomiale aux mêmes coordonnées en plus le déplacement est le même. En raison de cette expansion est un modèle polynomial partielle, il variera avec le déplacement spatial, il peut introduire des erreurs (11), et l'erreur augmentera avec l' augmentation de déplacement. Voici les informations incorporées de déplacement a priori, à savoir un premier signal de comparaison Xd'une expansion polynomiale et un second signal dans x + \ tilde {d} (x)l'expansion polynomiale , dans lequel le \ Tilde {d} (x)déplacement a priori arrondi valeur entière, de sorte que seulement besoin d'être calculé la valeur réelle sur la base des estimations a priori de déplacement.

En variante, le plus haut (9) et (10) en tant que:

A (x) = \ frac {A_ {1} (x) + A_ {2} (\ tilde {x})} {2}     (21)

\ Delta b (x) = - \ frac {1} {2} (b_ {2} (\ tilde {x}) - b_ {1} (x)) + A (x) \ tilde {d (x)}     (22)

Parmi eux,

\ Tilde {x} = x + \ tilde {d} (x)     (23)

Cinquièmement, itérative et estimations de déplacement multi-échelles

Champ de déplacement en utilisant a priori dans l'algorithme peut être en boucle fermée et avantages de itérations. Avoir un bon un moyen d'estimer a priori que le déplacement relatif est plus petit, ce qui peut améliorer la précision de l'estimation de déplacement. Considérer ici deux méthodes différentes, itérative et déplacement multi-échelle d'une estimation de déplacement estimé.

Dans les deux procédés, l'étape d'estimation itérative de déplacement, en tant que prochaine étape de déplacement avant. La première étape est généralement un champ de déplacement priori est initialisé à zéro, à moins d'un message clair. Dans la première méthode, les mêmes coefficients d'expansion polynomiale dans toutes les itérations, et que les besoins à calculer une fois. Ce problème est que, si la première itération de déplacement est trop grand (par rapport au déplacement avant), la sortie de déplacement ne peut pas être prévu d'améliorer, itérative perd son sens. En analysant à l'échelle grossière, on peut réduire le problème des déplacements excessifs. Cela signifie que nous avons élevé d'application à une expansion polynomiale. En conséquence, l'algorithme d'estimation peut gérer un grand déplacement, mais la précision est diminuée.

méthode d'estimation de déplacement multi-échelle, à partir d'une échelle plus grossière, pour obtenir une estimation approximative mais raisonnable de déplacement, puis obtenir de plus en plus des estimations précises par échelle par étapes de raffinement. désavantage Un tel est la nécessité de recalculer les coefficients d'expansion polynomiale pour chaque échelle, mais ce coût peut être réduit par sous-échantillonnage entre l'échelle.

 

Procédé de flux optique Demo Farneback dans les ensembles de données anormales UCSD

Environnement expérimental: Win10 | Python 3.7.3 | OpenCV 4.1.0

Code d'essai:

def draw_flow(im, flow, step=16):
    # 在间隔分开的像素采样点处绘制光流
    h, w = im.shape[:2]
    y, x = mgrid[step/2:h:step, step/2:w:step].reshape(2, -1).astype(int)
    fx, fy = flow[y, x].T
    # 创建线的终点
    lines = vstack([x, y, x+fx, y+fy]).T.reshape(-1, 2, 2)
    lines = int32(lines)
    # 创建图像并绘制
    vis = cv2.cvtColor(im, cv2.COLOR_GRAY2BGR)
    for (x1, y1), (x2, y2) in lines:
      cv2.line(vis, (x1, y1), (x2, y2), (0, 255, 0), 1)
      cv2.circle(vis, (x1, y1), 1, (0, 255, 0), -1)
    return vis

# 省略N行代码......

# 提取第一帧
first_rgbframe = cv2.imread(frame_path + frames[0], 1)
del frames[0]
prev_gray = cv2.cvtColor(first_rgbframe, cv2.COLOR_BGR2GRAY)

for frame_i in frames:
  rgbframe = cv2.imread(frame_path + frame_i, 1)
  gray = cv2.cvtColor(rgbframe, cv2.COLOR_BGR2GRAY)
  # 计算流
  flow = cv2.calcOpticalFlowFarneback(prev_gray, gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)
  prev_gray = gray

  drawImg = draw_flow(gray, flow)
  cv2.imwrite(frameFB_path + frame_i, drawImg)
  # 画出流矢量
  cv2.imshow('Optical flow', drawImg)
  if cv2.waitKey(10) == 27:
     break
  time.sleep(0.1)

Les résultats:

UCSDped1 \ Test \ Test014

UCSDped2 \ Test \ Test005

Ci-dessus sont les deux segments de test UCSD ensemble de données anomalie, vous pouvez voir où la foule ou à vélo / véhicule passe, le point vert sera accompagné par une liaison.

 

Annexe:

Dataset lien: UCSD Détection des anomalies Dataset

OpenCN - paramètres calcOpticalFlowFarneback () a expliqué:

prev: canal unique avant une image d'entrée 8

suivante: Après une image d'entrée à canal unique 8

flux: image d'entrée calculée coïncide avec la taille et le type du flux optique de la figure CV_32FC2

pyr_scale: facteur de mise à l'échelle de l'image de la construction (<1) de la pyramide; = coefficient tel que 0,5 est le modèle de pyramide typique, non pas sur le niveau suivant est la moitié de la taille d'une image de

niveaux: les couches de la pyramide, le niveau de strate de 1 indique qu'aucune quantité supplémentaire d'image d'entrée directe

winsize: taille de la fenêtre de la moyenne, la plus grande fenêtre pour le bruit d'image moins sensible peut être plus rapide opération de capture, mais l'opération produira un champ plus manquant

itérations: itérations chaque hiérarchie pyramide algorithme

poly_n: la taille des pixels du voisinage, le quartier de faire l'expansion polynomiale; plus le voisinage, plus lisse l'image, l'algorithme est plus robuste et plus floue stade, une valeur de référence standard 5 ou 7

poly_sigma: lissage norme développement polynomial en fonction de la dérivée gaussienne base de la différence, lorsque poly_n = 5, peut être fixée à 1,1 poly_sigma, quand poly_n = 7, on peut prévoir poly_sigma = 1,5

drapeaux: peut être réglé sur l'un des deux drapeaux

OPTFLOW_USE_INITIAL_FLOW: flux optique en utilisant la figure de l'entrée comme valeur initiale de l'estimation de flux optique

OPTFLOW_FARNEBACK_GAUSSIAN: winsize × winsize filtre en utilisant un filtre gaussien au lieu de la même estimation de flux optique de cassette de taille; Habituellement, cette option permet d'obtenir plus courant précis que la cartouche de filtre z à une vitesse inférieure, en général, une fenêtre gaussienne si le winsize définir une valeur plus grande pour atteindre le même niveau de robustesse.

OpenCV explication officielle originale: cliquez pour sauter aux documents officiels

 

références:

1. Gunnar Farnebäck. Deux-Frame estimation de mouvement basée sur l'expansion polynomiale [C] // 13e Conférence scandinave sur l'analyse d'images (SICE 2003). Springer-Verlag, 2003.

2.  documents officiels OpenCV

Publié quatre articles originaux · a gagné les éloges 13 · vues 1579

Je suppose que tu aimes

Origine blog.csdn.net/Carson1145/article/details/105039670
conseillé
Classement