미연시리뷰

Optical Flow

두원공대88학번뚜뚜 2023. 2. 24. 18:31

참조 논문

1) 2012.00452.pdf (arxiv.org) [Counting People by Estimating People Flows]

1911.10782.pdf (arxiv.org)

2) 1611.00850.pdf (arxiv.org) [Optical Flow Estimation using a Spatial Pyramid Network]

3) 1811.10452.pdf (arxiv.org) [Context-Aware Crowd Counting]

4) 1709.02371.pdf (arxiv.org) [PWC-Net: CNNs for Optical Flow Using Pyramid, Warping, and Cost Volume]

 

기초가 되는 Counting People by Estimating People Flows는 기존의 사람 머리를 찾는 3과 Optical flow를 찾아내는 4를 합친 다음, 자신만의 loss function을 고안하여 만들어낸 네트워크이다. 따라서, 3과 4는 아래에 설명하도록 하고, 일단 1은 여기에서 차용한 손실함수에 대해서 설명한다.

테이블 1

  • Mtj: 이미지를 여러 개의 패치로 나눴을 때, j패치에서 time t에서의 사람 수
  • K: 패치 총 수. 즉 j는 K보다 작거나 같다.
  • F: t-1에서 t로 가는 순간 패치 I에서 J로 가는 사람 수
  • N: j패치의 이웃. 즉 5는 그 전부, 1은 1, 2, 4(그림2 참조)

비디오 시퀀스 I = {I1, l2, …. IT } 여기서 나온 개의 연속된 이미지 It-1, It, It+1 고려해 보자. 이미지가 K개의 직사각형 그리드 위치로 분할되었다고 가정한다. 해당 구현에서 위치는 최종 컨볼루션 피처 맵에서 이미지의 8x8 이웃에 해당하는 하나의 공간 위치이다.

 

우리가 시행하고자 하는 주요 제약 조건은 시간 t - 1 이미 패치에 있었고 그곳에 머물렀던 사람들의 수에 t - 1 t 사이의 해당 패치의 이웃 위치에서 걸어 들어온 사람들의 수를 더한 이다. 또한 시간 t 위치 j 존재하는 사람들의 수는 시간 t + 1까지 그곳에 머물렀던 사람들의 수와 t t + 1 사이의 이웃 위치에 갔던 사람들의 수를 합한 것이다.

시간 t 위치 j 존재하는 사람들의 수를 mtj라고 하자. t-1, ti,j t - 1 t 시간 사이에 위치 i에서 위치 j 이동하는 사람들의 수이고, N(j)는 단일 시간 단계 내에 도달할 있는 위치 j 이웃이라고 하자. 우리는 그림 2(b) 표시된 것처럼, N(j) 그리드 위치 j 그리드 위치 자체의 8 이웃으로 간주한다. 이제 우리의 사람 보존 제약 조건은 그리드의 가장자리에 있지 않은 모든 위치 j, 이미지의 다른 곳에서 보이지 않고는 사람이 나타나거나 사라질 없는 위치에 대해 아래와 같이 작성된다.

해당 식은 위의 볼드체임

이를 위해 아래의 제약 조건을 건다.

아무튼 결론은, 위 식(1)에 맞도록 loss function을 설계한단 거임. 사람의 수는 무조건 시야 /안으로 들어오는 놈들 말고는 계속 지켜져야 하는데, 실제론 그렇지 않다이를 위해,  이미지 평면에서 밀도 대신 위치에서 다른 위치로 이동하는 사람의 수를 회귀시킬 것을 제안한다는 거임.

 

Regressor을 설계하자. 훈련 중에 학습할 매개 변수 Φ 사용하여 It-1 It에서 F 흐름을 예측하는 회귀기를 나타내자. , ft-1,t = F(It-1, It; Φ) t - 1 t 사이의 모든 이웃 위치 사이의 예측된 흐름의 벡터이다.

 

예측된 현지인 mt j, 그리드 위치 j 시간 t 사람 [테이블1 참조] Eq 1 따라 유입되는 흐름의 합으로 간주되며, 전체 이미지에 대한 예측 수는 모든 mtj 이다.

맨 좌측은 GT. 식(1)과 같다. 단 하나 다른점은, 맨 우측을 보자.

맨 우측 식은 곧 '비디오를 거꾸로 해서 j에서 i로 간놈 수' = '비디오 정방향으로 했을 때 i에서 j로 간 놈 수'여야 한다는 것이다. 이 역시 제약조건 중 하나다. 제약조건 = 학습해서 지켜져야 하는 놈.

식 A

식은 시간 t - 1 t 사이의 인접한 위치로부터의 예측된 흐름의 벡터이고, Φ는 배워야 하는 매개변수이다.

IMG1과 IMG2를 가중치 공유하는 Network로 feature을 뽑고, 붙인다. 다음으로 디코더에 넣으면 flow가 나옴.

그리고 F는 앞서 말한 CAN네트워크의 인코더/디코더임. 식A의 아웃풋은 이미지 그리드와 동일한 치수를 가지며, 위치당 10개의 채널, 즉 좌상-상-우상-우....-9개를 다 합한 것으로 총 9개의 방향 + 그 합으로 이뤄짐.

 

연속프레임 It-1 It CAN 인코더 네트워크에 공급되어 아래의 2개의 깊은 특징 s^(t-1) s^t 산출한다.

여기서 Ee 가중치가 θe 인코더를 나타낸다. 그런 다음 이러한 특징들은 연결(Concatenated)되어 아래의 아웃풋을 출력하기 위해 디코더 네트워크에 공급된다.

D 출력이 항상 음이 아닌 것을 보장하기 위해 추가적인 최종 ReLU 층과 함께 CAN 백엔드 디코더로 구성된다.

 

그리드 크기 : 모든 실험에서 출력 사람 흐름 맵의 공간 위치를 별도의 위치로 처리했다. CAN백본은 다운샘플링된 밀도 맵을 출력하므로, 출력 그리드 위치는 입력 이미지에서 8 × 8 픽셀 블록을 나타낸다[, 아웃풋 밀도맵은 다운샘플링되어 있기에, 하나의 grid 8x8 정보를 담고 있음]

 

손실 기능 교육 : Eq. 3 gt인 mt 얻기 위해, 인간 머리의 위치를 나타내는 st 2D 포인트 세트 Pt = {P ti }1≤ i≤ st 주석을 달았다[, anntation 머리 위치로 충분함]. 거기에 상응하는 해당 GT density m¯t 평균 µ 표준 편차 σ 가진 가우스 커널 N(·|θ, θ2)으로 이러한 위치와 0 포함하는 이미지를 합성하여 얻는다.

pj는 위치  j의 중심을 나타낸다 .

 

, 사람이 n픽셀만큼 주어진 방향으로 이동하면 밀도 맵에 대한 해당 기여도는 n픽셀만큼 같은 방향으로 이동한다. 회귀기의 최종 ReLU 층은 추정된 흐름이 음이 아님을 보장한다. Eq.3 제약 조건을 시행하기 위해, 결합 손실 함수 Lcombi 손실 조건의 가중 합으로 간주한다.

손실함수

m¯t j 지상 실측 군중 밀도 , 타임 t에서의 위치 j 사람 수다. 또한 α 모든 실험에서 1 설정한 스칼라 가중치다.

 

훈련은 Lcombi(손실함수) 평가하기 위해 개의 연속 프레임을 사용한다. 이것의 장점은, 모든 곳에 주석을 달 필요는 없다고 한다..

 

 A 주석이 달린 프레임의 집합이고, U 그렇지 않고 따라서 m¯ t 사용할 없는 이전 다음 프레임의 집합이라고 하자. 이들 프레임의 경우, 합의 값을 없는 경우에도 모든 j 대해 아래의 식을 유지한다.

따라서 손실 함수를 Lflow Lcycle Eq 5 같이 정의되는 아래로 다시 작성한다.

알고리듬 1 우리의 훈련 계획을 자세히 설명한다. 결과 섹션에서, 우리는 우리의 알고리듬이 255 프레임 하나만 주석이 달린 상태로 처리할 있음을 보여준다.

  1. Ltflow: t시점의 이미지의 모든 패치 j 대해, (gt -[t-1에서 t   i에서 j 가는 사람]^2 + (gt -[t에서 t+1   j에서 k 가는 사람]^2) = reconstruction_from_prev + reconstruction_from_post
  2. Ltcycle: t시점의 이미지의 모든 패치 j 대해, ([t-1에서 t   i에서 j 가는 사람 –t에서 t-1   j에서 i 가는 사람(, 영상을 역방향으로)]^2 + [t에서 t+1   j에서 k 가는 사람 - t+1에서 t   k에서 j 가는 사람(역시 영상을 역방향으로 해서 input으로 넣기)]^2) = reconstruction_from_prev_inverse + reconstruction_from_post_inverse
  3. Ltuflow: t시점의 이미지의 모든 패치 j 대해, [t-1에서 t   i에서 j 가는 사람 – t에서 t+1   j에서 k 가는 사람]^2 = prev_reconstruction_from_prev + post_reconstruction_from_post
  4. 최종 Loss : 모든 프레임에 대해 Ltflow +Ltcycle +Ltuflow

또한, Optical flow를 생각하자. 

아래의 손실함수를 추가로 도입하는데, mt-1 mt1 Eq1 사용하여 예측된 흐름에서 추론된 밀도 맵이며, Oj 사전 훈련된 회귀기 F0 도출한 그리드 위치 j에서 나타나는 예측 광학 흐름을 나타낸다.

o¯t1,t 프레임 t - 1에서 t 계산된 Optical flow이며, 지시 함수 δ(σ > 0) 상관관계가 사람이 있는 곳에서만 시행되도록 보장한다. 이것은 카메라가 변화하는 배경에 의해 생성된 광학 흐름을 discount하기 위해 움직일 특히 유용하다.

 

역시,  개의 입력 채널(하나는 mt-1용이고 다른 하나는 mt) 가진 광학 흐름 회귀기 Fo CAN 사용한다. 네트워크는 훈련 데이터에 대해 별도로 사전 훈련된 다음 사람 흐름 회귀기를 훈련하는 사용된다.

 

회귀기 F0 사전 훈련하려면 연속 프레임, 알고리듬 1 정의에서 V = 1 대한 주석이 필요하다. 이러한 주석을 사용할 있을 , 우리는 알고리즘을 다시 사용하지만 Lcombi P 대체한다.

모든 실험에서, 광학 흐름 값이 사람 흐름 값보다 4,000 크다는 사실을 고려하여 β 0.0001 설정한다. Fo Adam 함께 사전 훈련을 받고 있으며 학습 속도는 1e - 4이. 사전 훈련 동안 Fo GT density map m¯ t-1, m¯ t 프레임 t - 1에서 t 광학 흐름 o¯ t-1 매핑한다. 그런 다음 사전 훈련된 네트워크 Fo Eq.7 Eq.8 사용하여 사람 흐름 모델을 훈련할 정규화 용어로 사용되며, 여기서 mt-1 mt 예측 흐름을 합산하여 얻은 밀도 맵이다.


PWC-Net과 그곳에서 참조한 Spy-Net의 구조도 및 각 구조의 역할

w1~w6은 무조건 2채널임. 첫 번째 채널은 x방향 변화량, 두 번째 채널은 y방향 변화량

논문에서 나온 PWC-Net의 구조도(오른쪽)

1) 피쳐 피라미드 추출기 - 개의 입력 이미지 I1 I2 주어지면, 하단(0번째) 레벨이 입력 이미지, c0t = It(t번째 Image It 원본 자체(다운샘플링 등이 없는) 피처는 c0t) 형상 표현의 L-레벨 피라미드를 생성한다.

T번째 이미지 I l번째 계층 clt에서 피처표현을 생성하기 위해, 우리는 (l-1)번째 피라미드 수준 cl-1 t(t번째 Image (l-1)번째 feature)에서 형상을 2배로 다운샘플링하기 위해 컨볼루션 필터 레이어를 사용한다. , l단계의 피처는 (l-1)단계 이미지를 2 다운샘플링함으로써 만들어진다. 1단계부터 6단계까지 피쳐 채널의 수는 각각 16, 32, 64, 96, 128, 196.

 

2)워핑 레이어 - l단계에서, 우리는 l+1단계에서 2 업샘플링된 흐름을 사용하여 번째 이미지의 특징을 번째 이미지로 왜곡한다. 아래는 Warping 공식.

, l-레벨 feature 픽셀에 warping 2-레벨 feature 픽셀에 up2(w^l+1) 더한 것임(x 픽셀), 다시 말하면 인풋이미지1 previous pyramid에서 얻은 Flow, 모션벡터를 업스케일링해서 번째 이미지에 더해줌.

과정을 통해, GT Img2 Warping 통해 얻은 Input Img2’ 2개가 존재하게 . 둘은 서로 근사하나 완전 같지는 않다. 오차가 작을수록 연산이 정확.

 

효과로는, training 통해 학습을 1회가 아닌 L(피라미드 레벨 ) 있게 . Down-scaling and Up-scaling 과정에 순간순간 Input img 2 2’ 오차를 가중치로 같이 추가.

 

3) 비용 볼륨 계층 - 다음으로, 우리는 피처를 사용하여 어떤 픽셀을 다음 프레임에서 자신과 해당하는 픽셀과 연결하기 위한 일치 비용을 저장하는 비용 볼륨을 구성한다.

Img2에다 보간법을 것과, Img1 개의 이미지가 있는데(정확히는 피처), im1 어떤 피처(또는 픽셀이) 2 어떤 피처/피처와 매칭되는지 알아내는 것.

 

 

4) 광학 흐름 추정기 - 다층 CNN이다. 입력은 비용 볼륨, 번째 이미지의 특징, 업샘플링된 광학 흐름이며 출력은 l번째 수준의 흐름. 컨볼루션 레이어의 피처 채널 수는 각각 128, 128, 96, 64, 32이며 모든 피라미드 수준에서 고정되어 있다.

 

서로 다른 수준의 추정기에는 고유한 파라미터가 있다. 추정 과정은 원하는 수준 l0까지 반복된다. 모든 컨볼루션 레이어에 대한 입력은 이전 레이어에서 나온 출력과 이전 레이어로 들어온 입력이다. 해당 광학 흐름 추정기는, 밑의 Spy-Net을 참조한다. 하는 역할은 같다.

 

 

5) 컨텍스트 네트워크 - 전통적인 흐름 방법은 종종 흐름을 후처리하기 위해 상황 정보를 사용한다. 따라서 원하는 피라미드 수준에서 출력 유닛의 수용 필드(receptive field) 크기를 효과적으로 확대하기 위해 컨텍스트 네트워크라고 불리는 하위 네트워크를 사용한다. 광학 흐름 추정기에서 번째 마지막 레이어의 추정 흐름과 특징을 가져와서 정제된 흐름을 출력한다.

 

컨텍스트 네트워크는 피드포워드 CNN이며 설계는 확장된 컨볼루션을 기반으로 한다. 그것은 7개의 컨볼루션 레이어로 구성된다. 컨볼루션 레이어의 공간 커널은 3×3이다. 레이어들은 각각 서로 다른 팽창 상수(dilation constant) k 가지며, 이 컨볼루션 레이어는 레이어의 필터에 대한 입력 단위가 수직 수평 방향 모두에서 레이어의 필터에 대한 다른 입력 단위로부터 떨어져 있는 k 단위임을 의미한다. 확장 상수가 컨볼루션 레이어는 계산 부담 없이 출력 유닛의 수용 필드를 확장한다. 아래에서 위로 확장 상수는 1, 2, 4, 8, 16, 1 1.

 


Spy-Net의 구조도

  • U: 업샘플링 / D : 다운샘플링 à 이 두 요소는, 원본이미지 I뿐만 아니라, optical flow field인 V에도 쓰임.
  • W: 워핑 연산. W(I, V) : I는 원본, V는 flow field. Bilinear 보간법을 통해 이미지 I를 V로 왜곡. 즉, Gk에 들어가는 것은 원본이미지 급 3채널 2장임. 따라서 I12/I22에 u(V0), u(V1)을 보간법으로 왜곡함으로써 u(V0)과 u(V1)가 ‘그럴듯한 색을 가진 이미지’로 되도록 한다. 

Convnet Gk 이전 피라미드 레벨인 Vk-1에서 업샘플링된 흐름과 레벨 k에서 프레임 {I1k, I2k} 사용하여 Residual flow vk 계산. 2 프레임 I2k convnet Gk 공급하기 전에 흐름을 w(I2k, u(Vk-1)) 사용하여 뒤튼다. K번째 피라미드레벨의 flow 아래와 같음.

처음엔 피라미드 상단의 잔류 흐름(optical flow) v0 = V0 계산하기 위해 2 다운샘플링된 이미지 {I10, I20} 모든 곳에서 0 초기 흐름 추정치로 시작한다. 결과 흐름인 V0 업샘플링, u(V0) 만들어 {I11, w(I21, u(V0))} 함께 네트워크 G1 전달하여 잔류 흐름 v1 계산.

, v0 {I11, w(I21, u(V0))} 함께 네트워크 G1 넣는다. I11 업샘플링한 V0 1 다운샘플링한 것이고, 워핑은 번째 이미지이자 다운샘플링한 I21 u(V0)으로 진행한다. 피라미드 수준에서, (2) 사용하여 흐름 Vk 계산한다. 흐름 Vk 우리가 최대 해상도로 흐름 VK 얻을 때까지 피라미드의 높은 해상도 층으로 비슷하게 전파된다. 그림 1 3단계 피라미드를 사용한 접근 방식의 작동을 보여준다. 실험에서는, 5단계 피라미드(K = 4) 사용한다.

 


 

Optical Flow in OpenCV (C++/Python) | LearnOpenCV #

 

Optical Flow in OpenCV (C++/Python) | LearnOpenCV #

In this post, we will take a look at the theoretical aspects of Optical Flow algorithms and their practical usage with OpenCV.

learnopencv.com

Optical flow는 위와 같이 사물의 움직임을 화살표로 표시하고, 

해당 움직임에 대해 HSV를 씌우는 것이라 함.

그렇다면 이걸 HSV를 제거하고 단순히 화살표만 보이게 할 수 있을까?

 

[optical flow] Lucas-Kanade method with pyramid (tistory.com)

 

[optical flow] Lucas-Kanade method with pyramid

개념정리문제 optical flow를 적용하기 위한 가장 중요한 가정(전제)은? optical flow equation과 각 항들이 의미하는바는? Lucas-Kanade 기법을 쓰는 이유 Lucas-Kanade의 단점을 보완하기 위한 방법은? 위 질문

powerofsummary.tistory.com


PWC-Net의 correlation 효과

Correlation은 내적 유사도 측정임.

같은 부분인 feature은 값이 커지고, 다른 부분은 값이 작아지는 효과가 있다.

pwc-net의 Context Convolution. 늘린 차원을 다시 줄인다. 마치 U-net처럼.

이를 다시 Convolution을 진행하는데, 채널을 줄이는 과정을 통해 U-net처럼 원래 정보를 획득한다.

U-net을 보면 semantic segmentation과 비슷한 효과를 지니는데, 이걸 통해 정보를 획득.

 

feature map을 1열로 펼친 것들의 유사도 계산에 대해선 아래에서 이미지로 잘 설명했다.

흰곳과 검은 곳을 바탕으로 유사도를 계산하는 것으로 판단됨.

2.2 벡터와 행렬의 연산 — 데이터 사이언스 스쿨 (datascienceschool.net)

 

2.2 벡터와 행렬의 연산 — 데이터 사이언스 스쿨

벡터와 행렬도 숫자처럼 덧셈, 뺄셈, 곱셈 등의 연산을 할 수 있다. 벡터와 행렬의 연산을 이용하면 대량의 데이터에 대한 계산을 간단한 수식으로 나타낼 수 있다. 물론 벡터와 행렬에 대한 연

datascienceschool.net

실제로 마지막단의 feature map을 보면 아래와 같으니, 성능은 어느 정도 보장된다고 판단 가능.

 

 

RAFT의 correlation 함수를 보면 명확히 알 수 있다.

def corr(fmap1, fmap2):
        batch, dim, ht, wd = fmap1.shape
        fmap1 = fmap1.view(batch, dim, ht*wd)
        fmap2 = fmap2.view(batch, dim, ht*wd) 
        
        corr = torch.matmul(fmap1.transpose(1,2), fmap2)	# corr : (batch, ht*wd, ht*wd)
        corr = corr.view(batch, ht, wd, 1, ht, wd)
        return corr  / torch.sqrt(torch.tensor(dim).float())

이를 통해, 두 피처맵이 들어오면, 이를 곱해서 하나의 피처맵으로 만들어준다.

그 결과는 input과 동일한 사이즈로 만들어진다.

ht*wd는 결국 하나의 피쳐값이 다른 피처들과 얼마나 관계가 있는지를 보여주는 값이 됨(유사도 측정).

 

core/corr.py의 19번째 줄에서 해당 함수를 수행한 다음

CorrBlock 클래스의 다음에서

batch, h1, w1, dim, h2, w2 = corr.shape	
corr = corr.reshape(batch*h1*w1, dim, h2, w2)	# (batch * h * w, 1, h, w)
        
self.corr_pyramid.append(corr)
for i in range(self.num_levels-1):
	corr = F.avg_pool2d(corr, 2, stride=2)
	self.corr_pyramid.append(corr)

pooling을 통해 사이즈를 2배씩 줄이는 피라미드를 진행, 각각을 array에 삽입.


FlowNet의 Correlation 과정

일반적인 Correlation  과정


광학 흐름은 논문에 대한 많은 잠재적 주제를 가진 풍부하고 역동적인 연구 영역입니다. 다음은 시작할 수 있는 몇 가지 아이디어입니다:

1. 광 흐름 알고리즘의 비교 연구: 광학 흐름을 계산하기 위한 다양한 알고리즘이 있으며, 각각 장단점이 있습니다. 공통 데이터 세트에서 이러한 알고리즘 중 몇 가지를 비교하여 서로 다른 조건에서 가장 정확하고 효율적인 알고리즘을 결정할 수 있습니다.

2. 동작 인식의 광학적 흐름: 광학 흐름은 오랫동안 모션 분석에 사용되었으며 비디오의 동작을 인식하는 데 사용될 수 있습니다. 동작 인식에서 광학 흐름을 사용하는 새로운 방법을 개발하고 기존 방법과 비교할 수 있습니다.

3. 객체 추적을 위한 광학 흐름: 광학 흐름은 물체의 움직임을 추정하여 비디오에서 물체를 추적하는 데 사용될 수 있습니다. 광학 흐름을 사용하여 객체 추적을 위한 새로운 방법을 개발하고 까다로운 데이터 세트에 대한 성능을 평가할 수 있습니다.

4. 딥 러닝의 광학 흐름: 광학 흐름은 객체 감지 및 세분화와 같은 작업을 위한 딥 러닝 모델의 핵심 입력으로 사용되었습니다. 광학 흐름을 딥 러닝 아키텍처에 최적으로 통합하고 성능에 미치는 영향을 평가하는 방법을 탐구할 수 있습니다.

5. 자율주행차용 광유량: 광학 흐름은 장면에서 물체의 움직임을 추정하는 데 사용될 수 있으며, 이는 자율 주행 차량에 중요합니다. 당신은 자율 주행 차량에서 광학 흐름을 사용하는 새로운 방법을 개발하고 실제 주행 시나리오에서 그 성능을 평가할 수 있습니다.

시작하기 위한 몇 가지 아이디어입니다. 당신의 관심사와 전문성에 따라, 당신이 광학 흐름에 대한 연구를 할 수 있는 다른 많은 방향들이 있습니다.