- abstract

빠르게 움직이는 객체를 탐지->using optical flow clustering & Delaunary triangulation

1. 먼저 corner feature point를 Harris corner detector를 사용해서 추출한 뒤 그 점들로부터 optical flow vector를 계산.

2. 옵티컬플로우 벡터를 K-means clustering을 사용하여 클러스터링한 뒤, RANSAC으로 outlier를 제거

3. 옵티컬플로우의 흩어진 정도를 보고 카메라움직임 or 객체움직임 중에 분류한다.

4. multi-resolution block-based motion propagation으로 카메라 움직임을 보완하고, background subtraction으로 object detection

5. Delaunary triangulation을 사용하여 separately detected objects를 합쳐준다.

 

-Introduction

 

움직이는 카메라에서 객체를 탐지하려면 우선 다양한 모션들 중 카메라의 모션과 객체의 모션을 구분해야한다.

 

그러기 위해서는 세가지 접근방법이 있다.

 

첫번째, ego-motion estimation으로 카메라의 움직임을 보완한다. 두 프레임 사이에서 corner point와 epipolar geometry(https://darkpgmr.tistory.com/83 참고) 를 계산하여 이미지의 관계를 나타낸다. 그러나 이 방법은 카메라의 이동이 적은 경우만 다룰 수 있고 백그라운드가 한 통계적모델에 의해 잘 표현된다는 가정이 있어야한다.

 

두번째, input sequence의 multiple motion을 나누는 방법이다. 그러나 이 방법은 단지 모션을 분류하고 그것을 움직이는 물체의 모션임을 골라내는 추가적인 알고리즘이 필요하다.

 

세번째는 카메라와 객체의 움직임을 '그래프 컷 알고리즘'을 사용해서 나누는 것이다. 이 방법은 정확도가 높지만 계산이 오래걸린다.

 

-> 따라서 성능도 높고 빠른 방법을 제시함.

 

 

 

이 방법은 이러한 특징들이 있다.

 

1. 성능이 높음->Delaunary triangulation으로 잘못 분리된 요소를 합칠 수 있다(?)

2. real time app으로 쓸수있을정도로 빠르다-> 오직 연속된 두 프레임만 사용하고 배경에 평면 가정(planar assumption)을 쓰지 않기 때문

 

아래 부터는 한 단계씩 자세한 설명이 있음.


<Motion estimation>

corner feature points를 찾기위해 Harris corner detector를 사용함.

그 이유는 이 디텍터는 회전, 이동, 확장, 조명변화나 노이즈 등에 강하기 때문임.(이 요소들은 모션추정에서 중요한 요소들임)

harris corner detector 설명은 https://darkpgmr.tistory.com/131 참고

 

또한, 그 코너점들로부터 motion vector를 계산하기 위해 pyramidal Lucas-kanade method를 사용함.(두 이미지 프레임 사이에 상응하는 점 찾는 알고리즘)

Lucas kanade는 두가지 방법으로 모션벡터를 찾는다.

1. image pyramid 생성

이미지 피라미드란, 어떤 이미지 입력 I를 단계적으로 축소시켜서 일련의 축소된 이미지를 생성하는데 이때 이 집합을 이미지 피라미드라고 한다.

따라서 제일 낮은 층이 raw image이고 제일 고해상도이다. 그러니까 올라갈수록 해상도가 떨어지는 것이다.

루카스 카나데에서는 연속된 두 프레임이 각각 피라미드를 만들고 거기서 2~4층의 이미지를 사용했다고 한다.

(피라미드를 쓰는 이유는, 윈도우보다 큰 움직임이 발생한 경우  또한 잡아내기 위해서라고 한다)

 

2. 이미지 피라미드에 있는 두 프레임들 사이의 상응하는 점을 찾으면 된다.

알고리즘을 한줄로 요약하자면,

t번째 이미지 I_t(x,y)의 feature point (u_x, u_y)에 상응하는 (v_x, v_y)를 t+1번째 이미지 I_t+1(x,y)에서 찾는다. 이 과정을 I_t(x,y)의 모든 특징점에 대해서 반복함.

 

 

+) 루카스 카나데 추가설명(내가 추가함)

LK 알고리즘의 3가지 가정

-밝기 향상성: 어떤 객체상의 픽셀은 프레임이 바뀌어도 그 값이 변하지 않는다.

-시간 지속성: 영상에서 객체의 움직임에 비하여 시간의 변화가 더 빠르게 진행되며, 이는 연속된 프레임 사이에서 객체의 이동량이 많지 않음을 의미함.

-공간 일관성: 공간적으로 서로 인접하는 점들은 동일한 객체에 속할 가능성이 높고, 동일한 움직임을 갖는다.

Opencv -> cvCalcOpticalFlowPyrLK() : 피라미드 LK 코드

 


<Motion Clustering>

 

feature points를 optical flow vector의 direction θ와 길이 L을 이용해서 클러스터링한다.

 

즉 특징점들을 (L, θ) 좌표계 상에 나타낸다고 보면 된다.(변환법은 논문참고)

클러스터링에서 초기점(initial points for clustering)의 위치와 개수가 매우 중요하고 block-based k-means clustering을 사용했다고 한다.

block-based k-means 의 방법은 다음과 같다.

1. optical flow coordinate division  

먼저 (L, θ) 좌표를 블락으로 나눈다. 여기서는 블락의 높이(이자 θ값)=30,  블락의  너비(이자 L)=1  로  지정함.

 

2. 생성된 블락으로부터 initial points들을 고르고 모든 feature points를 클러스터한다.

=>각 블락안에 있는 특징점들의 개수를 구한 뒤, 그 값을 기준으로 정렬한다.

그리고 최대값을 가진 블락에서부터의 합이 총 특징점 개수의 70% 이상이 될때까지 initial block을 고른다.

그리고 initial point와 가장가까운 점에 각 feature point를 할당함으로써 최종적인 motion cluster를 얻는다.

(이 부분 설명 잘 모르겠음.)

 

 

 

outlier제거를 위해서는 RANSAC 알고리즘을 사용한다.

(설명 https://darkpgmr.tistory.com/61 참고)

이는 세가지 단계로 이루어진다

1. model generation

먼저 2차원 가우시안 모델을 각 모션 클러스터마다 생성한다. 이때 무작위로 샘플 몇개를 뽑아서 consensus data를 세팅하고 그것을 이용하여 파라미터를 추정한다. 

 

2. consensus data(일관된 데이터) update

그리고 추정한 모델을 가지고 consensus data를 업데이트한다. 모델로부터의 거리가 임계값보다 작은 점들은 consensus data에 추가한다.

 

3. best model selection

consensus data의 개수가 임계값보다 큰 모델을 best model로 고른다. 이전모델과 현재모델을 계속 반복 비교하면서 가장 consensus data개수가 많은 모델을 고르게된다.

 

 


<Motion classification>

 

이제 모션 클러스터들 중 객체인지 카메라의 움직임인지를 골라야된다. 카메라의 모션클러스터를 알면 카메라 모션 모델을 추정하고, 이를 사용해서 객체가 움직이는 범위를 찾아낼 수 있다.

 

 

배경의 corner point가 움직이는 객체의 corner point보다 더 흩어져 있을 것이다.

즉, original image 좌표평면(x,y)에서 배경은 움직이는 객체보다 더 큰 공간을 차지하고 있을 것이다.

 

흩어진 정도를 측정하는 방법으로는 여러가지가 있다.

첫째, Range(R) 사용. 두 점 사이의 가장 큰 거리를 구하는 것. 제일 심플하지만 distribtuion의 특성을 설명할 수 없음

둘째, Mean Absolute Deviation(MAD) 평균절대편차 사용:  distribution의 중심점을 정의하고 중심점과 각 데이터점들 사이의 거리의 평균값을 계산. 이 방법은 또 예외적인 케이스가 있어서 안됨.

셋째, Standart Deviation 표준편차 사용

넷째, hyperellipsoid의 부피를 사용.-> 이 방법을 채택

hyper ellipsoid는 초기하 타원이라고 한다. 

관련 이론은 여기를 참고하면 더 좋을 것 같다. http://wanochoi.com/lecture/PCA.pdf

covariance matrix와 Mahalanobis distance(얼마나 이상한 값인지를 수치화)를 사용하여, hyperellipsoid의 부피를 계산한다.

부피가 클 수록 더 넓게 퍼져있다고 여긴다.

이 논문에서 모든 경우에 대해서 분류 정확도를 측정했는데 이 방법이 제일 정확했다고 한다.

 


<Motion classification>

카메라 모션 클러스터 : 임계값보다 큰 특징점을 가진 클러스터 중 maximum value of scatteredness를 가진 클러스터

moving object cluster : hyperellipsoids의 평균 부피와의 상대적인 비율을 사용한 임계값보다 큰 특징점을 가진 클러스터

 

 


<Moving object detection>

-Moving object border detection

 

일반적인 camera motion compensation model을 사용할 수 없는게, 카메라와 백그라운드 컴포넌트 사이의 거리가 다르기 때문이다.

따라서 이 논문에서는 MRMP(multi-resolutional motion propagation)을 제안하였다.

 

이미지를 MxN blocks로 나누고 백그라운드 특징점 x_back을 모은다.

여기서 각 block의 카메라 모션을 추정하기 위해 perspective model을 사용했는데, 이것은 두 연속 프레임 사이의 pan/tilt/zoom effect를 다루는 모델이다.

 

파라미터가 없는 빈 박스에서 조금씩 크기를 늘려가다가 파라미터가 있는 박스가 되면 parameter forward propagation이 된다.

camera motion compensation은 예측된 모션 모델 파라미터를 사용해서 각 블락에서 행해진다.(backward propagation)

(이부분은 설명하기 어려워서 논문 읽는 거 추천)

그 후에는 frame difference(FD)로 moving object detection을 한다.

두 이미지를 그레이스케일로 바꾸고 각 픽셀의 difference의 절대값을 계산한다. 만약 그 값이 임계값보다 크면, 움직이는 객체의 픽셀이라고 여긴다.

 

이 방법은 객체 안쪽의 픽셀의 색깔정보가 비슷할때, 움직이는 객체 region과 정확한 바운더리를 탐지하지 못한다.

이러한 경우에 물체의 앞과 뒷 region만 디텍션하게 된다. ( 두 프레임 사이에서 이부분의 색깔정보은 차이가 있기 때문)

이것을 극복하기 위해서 Delaunay Triangulation 방법을 FD와 함께 썼다.

DT는 moving object cluster의 픽셀을 사용해 whole region of the moving object를 나누고,

FD는 region의 boundary shape을 다듬는다.

 

 

- Moving object interior detection

DT는 특정 영역이나 객체를 기술하는 방법이다.

인접한 삼각형들은 주어진 점들에 의해 생성되고, 그 삼각형으로 객체의  rough shape을 나타낼 수 있다.

Empty circum-circle property = 어떤 삼각형의 외접원도 그 삼각형의 세 꼭지점을 제외한 다른 어떤 점도 포함하지 않는다.

DT는 삼각형의 내각의 최소값이 최대가 되도록 분할한다.

 

여기서 제안할 moving object detection은 세가지 방법으로 이루어져있다.

1. inner-outlier rejection

- motion classification에서, 여러개의 클러스터로부터 카메라 모션 클러스터(=outlier object points)를 고른다.

- 남아있는 점들 중에서 inner-outlier object points를 제외(reject)하므로써 inner-inlier object points를 고른다.

- scatteredness가 카메라 모션 클러스터의 scatteredness와 비슷하면, 움직이는 물체가 아니라 여김

- inner-outlier object region(false detected region)을 제외(reject)

 

 

2. randomized incremental DT

초기 DT를 만들고, 블락사이즈의 두배보다 큰 변을 가진 삼각형을 제외(reject)

 

3. final object region detection

DT로 구한 삼각형들로 채워진 R_dt와 inlier object region R_fd를 합친다.

 

(이부분은 이론이 너무 어려워서..논문 설명으로 충분하지 않을거같아요)

 


- 실험

 

무빙카메라로 촬영한 자동차, 사람, 손 이미지

손으로 들고 찍거나 mobile robot위에 달려있는 카메라로 찍은 풍경 등을 사용.

 

MC / DT / MC와 DT를 합친 것 중에 MC의 결과가 안좋고, 합친게 제일 결과가 좋았다.

또, DT에서 쓰이는 블락 사이즈에 따른 결과를 보았는데, 10x10 정사각형 블락의 결과가 제일 좋았다.

 

 

한계점:

전경보다 배경이 차지한 비율이 더 커야되고, 배경 feature poirnt는 이미지 좌표에서 잘 퍼져있어야된다는 가정에서 벗어나지 못한다.

smooth plane background에서, 특징점은 추출이 잘 안되고 모션또한 잘 탐지가 안되었다고 한다.

 

 

Posted by 알 수 없는 사용자
:

- 트래킹하기

1. 매 프레임마다 블롭의 중심좌표를 구하기

2. 현 프레임의 블롭들의 위치와 새 프레임의 블롭들의 Euclidean distance계산

-> if 제일 가까운 경우 : 같은 블롭이라 간주하고 트래킹

-> if 멀리 떨어져있는 경우 : 새 블롭이라 간주하고 트래킹

 

- ROI 범위에 있는지 확인하기

차의 Rectangle box에 있는 블롭을 트래킹하여 그 리스트를 출력한다.

이전프레임과 현재 프레임을 차집합 연산을 통해 비교하여 사라진 블롭을 발견할 경우 이를 쓰레기 후보라고 간주함.

 

 

- 쓰레기 후보의 중심좌표와 ROI의 중심좌표 사이의 거리를 계산.

거리가 일정 범위 이상이고, 일정 프레임 수 이상 이 상태가 지속될때

=> 쓰레기를 버린다고 판단.

 

 

 

-결과:

 

 

문제점

- too many false positives

- detect only if the cars are detected accurately

- NOT detect if the trash is moving in the ROI

 

 

Posted by 알 수 없는 사용자
:

* YOLO window는 차량의 위치와 크기를 정확히 나타낸다고 가정한다.

- 차량의 크기 : window 의 width와 height

- 차랑의 위치 : window의 좌표

- 이때 크기와 위치는 차량의 절대적인 크기가 아닌 영상에서 보여지는 위치와 크기를 나타냄

 

1. 쓰레기 블롭이 생성될만한 위치 (유효한 영역)

 

- 오버헤드를 줄이기 위한 전처리

- 차량의 위치와 쓰레기 블롭 위치와의 관계

- 무효한 영역은 계산을 생략하기-padding 등

 

<Task> 

- 차량의 위치와 쓰레기 블롭 위치를 분석하여 가장 적절한 유효한영역을 정하기

 

 

2. 쓰레기 블롭과 노이즈 블롭의 차이

 

1) 쓰레기 블롭의 움직임과 노이즈 블롭의 움직임의 차이

- 노이즈 블롭은 중구난방으로, 쓰레기 블롭은 포물선을 그리거나 그와 비슷하게 아래로 움직일 것이다

- 쓰레기 블롭의 자취를 계수가(p0,p1,p2,...,pn)인 n차 다항식으로 나타낼 수 있다

- 노이즈 블롭의 자취를 계수가(p0,p1,p2,...,pn)인 n차 다항식으로 나타낼 수 있다

 

<Task>

- tracking 방법

- n의 값 정하기

- 다항식의 계수({Pk})를 분석하여 쓰레기블롭과 노이즈블롭의 움직임의 차별점 발견하기

- 쓰레기 블롭의 자취를 나타내는 다항식 일반화

              - 데이터가 많다면 : svm, deep-learning 

              - 데이터가 적다면 : 직접 일반화


2) 차량 크기와 쓰레기 블롭의 속도

- 차량의 크기가 클수록 물체가 앞에 있기 때문에 쓰레기 블롭의 속도가 클 것이다

 

<Task>

- 차량의 크기(w,h)와 쓰레기의 속도(v=pixel/frame)를 분석하여 그 관계 찾기

 

 

 

 

 

** pseudo code **

 

for each frame

 

유효한 영역 계산

유효한 영역에서 blob

 

for each blob {

tracking

blob location history 배열에 저장

}

 

blob location history 배열에서, 움직임 조건과 속도 조건을 n번이상 만족하는 객체가 있다면 {

           trash로 간주

}

blob location history 배열에서 오래된 객체가 있다면 {

          remove

}

 

 

}

 

 

Posted by somsomdah
:

우리의 과제는 영상에서 인식된 여러개의 블롭들 중 어느 블롭이 쓰레기인가를 판단하는 것이다

 

https://play-tv.kakao.com/v/402887023

 

'Green Battle Project'에서 업로드한 동영상

 

play-tv.kakao.com

 

 

 

나는 쓰레기가 창문밖으로 날아가는 특징을 이용해 이를 판단할 수 있다고 생각했다.

내가 생각한 쓰레기의 특징은 다음과 같다

 

1. 인식된 차량의 창문 부근에서 생성될것.

쓰레기에 해당하는 블롭이 화면에서 처음 나타나는 위치는 차량의 창문 근처여야 한다. 나는 쓰레기가 생성될 법한 위치를 Yolo 코드에서 반환된 바운딩박스의 좌표를 이용하여 아래 그림과 같이 잡았다.

 

 

2. 연속적으로 움직일 것

시간에 따른 쓰레기의 위치는 연속적이다. 만약 인식된 블롭이 우리가 인식하고자 하는 쓰레기에 해당하는 블롭(ㄱ)이라면, 다음 프레임에서 생성된 블롭 중에 (ㄱ) 블롭과 인접한 위치에 블롭이 있어야 하며, 이는 쓰레기 블롭일 가능성이 있다.

 

3. 차량의 왼쪽에서 생성된 쓰레기는 왼쪽으로, 차량의 오른쪽에서 생성된 쓰레기는 오른쪽으로 움직일 것.

 

4. 쓰레기가 움직이는 기울기(y/x) 가 증가할 것.

쓰레기 역시 물리법칙을 따르므로 포물선을 그리며 떨어질 것이다.

(하지만, 카메라의 위치는 변하고 다른 변수들이 많기 때문에 약간의 예외를 두었다.)

 

 

나는 1~4를 모두 만족하는 블롭을 쓰레기로 인식하도록 하였다.

 

즉, 차량의 창문 부근에서 생성된 블롭들 중에서 (ㄱ)

다음 프레임에 인접한 블롭이 있고(ㄴ),

그 블롭이 알맞은 방향으로 움직이며(ㄷ),

알맞은 기울기로 움직일 때(ㄹ)

이를 쓰레기 블롭일 가능성이 있다고 판단하고, 블롭의 위치를 변경한 후 2~4를 반복한다. (ㅁ)

 

(ㄴ)~(ㅁ) 가 5번 이상 만족될 때 나는 해당 블롭을 쓰레기로 인식하도록 하였다.

 

 

blob을 리스트에 저장 - 오버헤드가 크다
blob 을 객체화한 코드 - 오버헤드가 비교적 작다

 

노이즈가 큰 경우, 노이지 블롭이 쓰레기로 잘못 인식됨

 

 

한계점)

우선 두 가지 조건이 전제되어야 한다.

1. 블롭이 끊기지 않아야 한다

2. 차량이 제대로 인식되어야 한다

 

또한 쓰레기의 움직임을 바탕으로 코드를 작성하였기 때문에 내가 상상한 바와 같이 움직이지 않는 쓰레기는 인식할 수 없다.

 

 

 

 

 

Posted by somsomdah
:

-Blob

Blob이란, Binary Large Object의 줄임말로, 같은 성질을 가지는 픽셀들이 연결되어있는 작은 집합이라고 할 수 있다.

사실 쓰레기 디텍션을 하기 위해서는 여러가지 방법이 있다.

1. SVM으로 여러 쓰레기를 학습시키기

-> 이 방법은 확실하지만, 달리는 차에서 쓰레기를 버리는 경우 쓰레기의 형태가 불분명하고 사용자마다 버리는 쓰레기가 천차만별이기 때문에 특정한 쓰레기를 버릴 것이라고 예측할 수는 없다. 또한 쓰레기 데이터셋이 그렇게 많지 않다.

2. 색깔로 쓰레기 디텍션 + 트래킹

-> 알다시피 쓰레기 색깔이 천차만별이라서 불가능하다.

3. Blob 검출

-> 쓰레기는 일정한 크기를 띌 것이고 쓰레기가 날라가는 모습을 blob으로 검출해보면 어떨까했다. 다만 담배꽁초처럼 매우 작은 쓰레기는 힘들 것이다

 

Blob검출은 매우 간단하다. OpenCV에 내장된 함수인 SimpleBlobDetector를 쓰면 된다.

그러나 도로 위는 다양한 환경/배경이기 때문에 잘 검출할 수 있게 전처리가 필요했다.

 

 

- Image preprocessing

1. Background Subtraction

배경제거는 매우 간단한 원리이다

말그대로 물체가 나타나기 전의 배경을 기억한 후에 현재 프레임에서 빼면된다.

그러면 배경만 사라지는 것이다

나는 MOG알고리즘을 이용한 createBackgroundSubtractorMOG2()라는 opencv 내장함수를 사용했다.

이 알고리즘은 Mixture Of Gaussian 기반이고, 각 픽셀에 적절한 가우시안 분포값을 선택한다는 것이다.

이 알고리즘의 특징은 조명 상태의 변화로 장면이 변하더라도 제대로 배경제거를 해준다고 한다.

그리고 그림자검출을 할지말지 선택할 수 있다(파라미터 detectShadow = True가 디폴트)

(우리 실험에서는 쓰레기의 크기가 워낙 작기때문에, 그림자를 제거하면 쓰레기의 크기도 줄어들수 있어서 일단 True로 하였다.)

 

이외에도 createBackgroundSubtractorGMG 가 있다.

 

2. Mathmatical Morphology : Erosion, Dilation, Opening, Closing

배경을 제거하고 나면 노이즈가 있을 수 있기 때문에 노이즈제거작업이 필요하다.

모폴로지 연산은 움직이는 객체 내부에서 움직이는 부분의 사전 정보를 사용하게 도와준다.

모폴로지 연산은 크게 두개의 인풋이 필요하다. 첫번째는 우리의 이미지, 두번째는 연산의 특성을 결정할 structuring element or kernel이다.

참고: https://docs.opencv.org/3.1.0/d9/d61/tutorial_py_morphological_ops.html

기본 이미지

-erode(침식), dilate(팽창)

 

erosion

 

erode는 모래사장에서 모래가 물에 조금씩 쓸려가서 침식되는 듯한 모습에서 따온 것이다. 

커널이 이미지를 통과하면서 커널 밑에 있는 모든 픽셀이 1일때만 1로 간주하고 그거 외에는 다 0으로 만든다.

 

 

 

 

 

 

 

 

dilate는 erode의 반대이다. 커널밑에 있는 픽셀 중 적어도 하나가 1이라면 1로 간주한다.

보통 노이즈 제거시에는 erosion->dilation순서로 진행한다. 그 이유는 먼저 작은 노이즈들을 erode하고 우리가 살리고 싶은 객체를 dilate시켜줘야 하기 때문이다.

 

 

 

 

-opening, closing

 

 

 

opening은 erosion -> dilation 순서로 실행한 것이다. 노이즈 제거 시 유용하다.

 

 

 

 

 

 

 

 

 

 

closing은 dilation-> erosion 순서로 실행한 것이다. 

전경에서 작은 검은 구멍들이 있을때 없애주기에 좋다.

 

 

 

 

 

 

 

 

 

 

 

3. Thresholding

Thresholding이란, 말그대로 임계값 가지고  필터링을 하는 작업이다.

즉, 픽셀값이 어떤 임계값보다 크면 a Value로 표현하고, 작으면 another Value으로 표현한다.

이때 이미지는 grayscale이여야 한다. 

cv2.threshold(img, 50, 255, cv2.THRESH_BINARY_INV)

내가 썼던 함수를 기반으로 파라미터를 설명하겠다.

먼저 grayscale의 이미지 img를 가지고,

50이라는 임계값을 기준으로

임계값보다 클 경우, 255(white)로 표현하게 한다. 즉 여기서는 하얀색으로 표현한다는 뜻.

그리고 마지막파라미터는

cv2.THRESH_BINARY, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO 등의 여러 옵션을 선택할 수 있는데

내가 선택한 옵션은 바로 흑백을 바꾸는 옵션이다.

이와 같은 옵션을 선택한 이유는 하얀색의 blob(=쓰레기)을 잡아내게 하기 위해서이다.

일단적인 THRESH_BINARY를 쓰면 검은색 blob을 잡아냄.

 

 

- Blob Detection

위에서 언급한 SimpleBlobDetector를 이용하여 블롭 검출을 함.

다만 쓰레기만 잡아내게 하기 위해서 parameter를 수정하였는데 그 내용은 다음과 같다.

 

    params = cv2.SimpleBlobDetector_Params()
#블롭으로 간주할 색상의 범위 설정
    params.minThreshold = 50;
    params.maxThreshold = 255;

# 블롭의 크기로 필터링할것인지 설정, 블롭으로 간주하고 싶은 크기 지정.(쓰레기라서 좀 크게 잡음)
    params.filterByArea = True
    params.minArea = 300
    params.maxArea = 1000


    #Circularity(둥근정도) filter
    params.filterByCircularity = False
    #Convexity(오목한지의 정도) filter
    params.filterByConvexity = False
    #Inertia filter(폭이 좁고 길쭉한지의 정도?) 
    params.filterByInertia = False

 

 

 

 

이를 돌린 결과는 다음과 같다.

 

*tiny YOLO 사용,  threshold = 1.0 -> 1.5로 바꿈(이유: too many detected rectangles)

rectangle color : blue -> white 바꿈 (이유: grayscale 및 binary image에서 잘보이게 하려고)

 

 

test1
test2

 

 

발전해야할 방향:

1. blob의 중심좌표와 rectangle의 좌표를 얻어내서 어떤 상황이 쓰레기가 차에서 튀어나오는 것인지 판단해야하는 알고리즘

2. 자동차의 rectangle이 카메라 진동때문에 있었다 없었다 하는데 이를 개선할 방법은?

3. 쓰레기가 만약 블롭으로 검출되지않을 여러 경우를 고려해봐야함.

Posted by 알 수 없는 사용자
:

1. HOG discriptor

장) 시간 효율이 좋다.

단) 인식률과 정확도가 매우 떨어짐. y-start 조절 필요

개선) window size가 작아 정확도가 떨어진다고 판단해서 위 아래 padding 후 resize 함. 마찬가지로 정확도 떨어짐

 

 

개선) color space를 YCrCb 대신 다른 걸 사용한다면 어떨까?

 

 

2. Haar cascade

장) 시간 효율 좋음

단) 차량 인식률은 좋으나 정확도가 매우 떨어짐(차량이 아닌걸 차량으로 인식)

개선) y-start 설정하면 정확도를 개선 할 수 있을거라 기대되지만 마찬가지로 조절이 필요함

 

 

3. YOLO

장) 정확도 높음

단) 작은 차량 인식율 떨어짐, 시간 효율 나쁨. 코드가 매우 무거워 카메라에 임베디드 할 수 있을지 의문

 

+) 지금 저 하얀색 차량이 쓰레기를 던질떄 차량으로 인식되어야하는데 하필이면 저때만 인식을 못하고있다.

실제상황에서도 이와 비슷한 상황이 분명히 존재할 것이다.

 

 

4. tiny-YOLO

장) 인식률과 정확도 모두 비교적 높음. 시간효율 좋음

단) 차량이 많은 경우 인식율 떨어짐. 

 

test 2 with loading file

 

test2 with real time

 

 

해상도 차이때문인지 모르겠지만( 내 추측으로는 비디오 로드과정에서 픽셀이 깨져서..?)

실시간으로 코드를 돌렸을때는 쓰레기를 던질때 차가 디텍션되고있다.

다만 정확도가 좀 떨어지고 있긴하다.

결국엔 우리는 실시간으로 코드를 돌려야하기때문에 tiny YOLO가 유력한 후보가 아닐까 싶다.

 

[비교]

시간효율 : Haar>Tiny-YOLO>HOG>>YOLO

정확도: YOLO>tiny-YOLO>Haar=>HOG (체감 정확도, 기준없음)

 

(20개 이미지로 측정,학습시간과 데이터 로드 시간 제외)

  HOG Haar tiny-YOLO YOLO
시간(sec/frame) 2.02 0.28 1.39 5.29
정확도        

 

[코드 출처]

HOG : https://github.com/uppala75/CarND-Vehicle-Detection

Haar : https://github.com/andrewssobral/vehicle_detection_haarcascades

YOLO :

Tiny-YOLO : https://github.com/windowsub0406/Vehicle-Detection-YOLO-ver

 

 

 

 

 

민동보 교수님 피드백 

 

hog 데이터셋 화질이 안좋음

동영상에서 프레임을 불러올 때 압축으로 인한 디코딩 문제 - raw data 사용하기 (ffm펙(?))

영상에서 박스 떨림 문제(박스가 생겼다 사라졌다 하는 문제)

tiny yolo not-car/car 두개만 트레이닝 시켜보기

delay 문제는 gpu 쓰면 해결될 것

Posted by somsomdah
:

1. HOG Discriptor

HOG(Histogram of Oriented Gradient) 는 Gradient(기울기, 주변 픽셀과의 값 차이)의 크기(Magnitude)와 방향(Orientation)을 기준으로 만들어진 Histogram이다. HOG discriptor는 이를 기준으로 물체의 특징을 설명한다. HOG discription을 수행하는 방법은 다음과 같다.

 

0) 전처리 과정으로 감마보정을 한다고 한다.

 

1) 각 픽셀의 gradient(기울기) 계산한다. gradient는 주변 픽셀과의 픽셀값 차이, 즉 픽셀값들의 변화량을 의미한다. 이를 계산할 때는 sobel mask를 사용할 수 있다. 이미지의 외각부분을 계산할 때에는 패딩을 해 주면 된다.

Sobel filter(kernel size==1)
Sobel filter 적용 결과

2) 각 gradient의 magnitude(크기)와 orientation(방향)을 계산한다(아래 식 참조 g는 magnitude, theta는 orientation).  gx는 x축방향 gradient, gy는 y축방향 gradient. 색상 이미지의 경우 각 channel 별로 수행한 후 channel의 갯수로 나눈다. 예를들어 rgb 의 경우 M=(Mr+Mg+Mb)/3이다. 각 픽셀에 해당하는 (g,theta) 순서쌍을 만들 수 있다.

 

 

3) 이미지를 8*8 cell로 나누어  2)에서 계산한 결과를 바탕으로 histogram을 생성한다. 먼저 theta(orientation 값)의 범위를 나눈 후 이에 해당하는 g(magnitude)를 전부 더한다. 즉, theta를 0~20`, 20~40', ..., 160~180'로 나눈 후(정 반대 방향을 같은 것으로 취급함, unsigned gradient) 각 범위에 해당하는 gradient를 누적한다. histogram의 x축은 theta 값(의 범위), y축은 각 theta에 해당하는 g(magnitude)의 합이 된다. 이 과정을 모든 셀에 대하여 수행한다. 각 셀 에서 만들어진 histogram을 9*1 벡터로 나타낼 수 있다.

 

 

하나의 cell에 대한 HOG 예시

4) 정규화 과정, 빛의 세기에 따라 픽셀 값이 변한다. 즉 같은 물체를 촬영했을지라도 빛이 적은 상태에서 찍었을 때 픽셀들의 값이 전체적으로 작아진다. 같은 이미지를 어둡다는 이유로 다른 물체로 분류할 수는 없으니 각 벡터의 원소의 합을 1로 만들어주는 normalizaton 과정을 수행한다. 각 셀 마다 정규화를 할 수 있지만 이웃한 4개의 셀(32*32)을 단위로 정규화를 하는 것이 효과적이라고 한다. 36*36 window를 만들어 8개 픽셀 단위로 이동시켜서 정규화를 진행한다. 이때 36*1 벡터가 여러개 만들어진다.

4) HOG feature vector를 만든다. 3)에서 생성한 36*1 벡터를 이어붙여 하나의 벡터를 만든다. HOG discriptor 는 64*128 로 resizing 된 이미지를 사용한다. 3)에서 window의 위치는 총 105개가 나올 수 있기 때문에 최종적으로 HOG feature vector는 105*36= 3780*1 크기의 벡터이다. 이 벡터로 물체의 특징을 표현할 수 있다는 것이다.

 

https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=1467360

https://www.learnopencv.com/histogram-of-oriented-gradients/

 

 

2. SVM (Support Vector Machine)

Support Vector Machine은 데이터를 분류하는 가장 적절한 초평면을 찾아내는 방법이다. 

위에서 언급한 HOG를 예시로 들어보자. HOG는 3780*1 크기의 벡터이다. 예를들어 차량인 것과 차량이 아닌 것의 이미지를 분류할 때, 차량 이미지의 HOG 벡터는 초공간(hyperspace, 4차원 이상의 벡터 공간) 속의 특정한 부분에 위치하는 경향을 띨 것이다. 또, 챠량이 아닌 이미지의 HOG 벡터 역시 역시 초공간 속의 특정 부분에 위치할 것이다.

 

SVM은 차량 이미지의 HOG 벡터들이 모여있는 곳과, 차량이 아닌 이미지의 HOG 벡터들이 모여있는 곳을 분류하는 가장 적절한 초평면을 찾아내는 방법이다. 이때, 가장 적절한 초평면이란, 초평면에서 가장 가까운 벡터까지의 거리를 가장 멀게 하는 경우를 말한다.

 

 

 

https://pdfs.semanticscholar.org/dbcc/b3ff4755a659e31f5b535cb6d96c8facb6b1.pdf

Posted by somsomdah
:

Car detection - YOLO

개발 일지 2019. 10. 5. 16:37 |

YOLO(You Only Look Once) 모델은 실시간으로 객체를 감지하고 인식하는 방법 중 하나이다.

 

YOLO 모델은 이미지를 448*448 로 리사이즈 한 후, CNN을 거쳐 객체를 검출하고 분류한다.

검출된 객체는 rectangle을 그려서 표시하고, 객체의 클래스는 확률값으로 볼 수도 있다.

이 모델은, 영상을 SxS grid로 나눈 뒤,

각 grid cell은 B개의 bounding box와 각 box에 대한 신뢰도를 추정한다.

bounding box 정보는 중심 위치 좌표 (x,y), 폭 w와 높이 h로 표현한다. w,h는 전체 폭과 높이의 비율값이라서 0과 1사이의 값이다.

신뢰도(Confidence Score)는 1이 객체가 있는 것이고 0은 객체가 없는 것이다.

YOLO모델이 출력하는 결과의 신뢰도 C는 물체일 확률 P(Object)와, 예측된 bounding box와 ground truth의 bounding box의 IoU(Interaction over Union)를 곱해준다.

(= IoU는 교집합/합집합 값을 구하는 것)

 

C = P(object) * IoU

 

학습할때는 각 grid cell에서 하나의 객체만 인식하도록 학습한다.

객체의 클래스의 종류가 K개라면, 특정 객체의 클래스 정보는 K개의 확률값으로 표현된다.

그렇게 하면 영상 하나에 대해 S x S x (5B+K) 크기의 데이터를 출력한다.

여기서 5는 x,y,w,h,c 다섯개의 변수를 말한다. c는 부류(class)

 

네트위크의 경우, GoogleNet의 변형한 구조이다. 

24개의 Convolution 과 2개의 fully connected로 구성되어 있다.

그리고 1x1 reduction layer를 여러번 적용했다.

 

Loss 함수 식

YOLO모델은 물체 영역과 인식을 동시에 하고 있기 때문에 위와같은 복잡한 식으로 loss를 계산한다.

 

YOLO는 기본적으로 초당 45개의 영상 프레임을 처리한다.

 

YOLO v2로 보다 최적한 모델이 나왔으며 그 외에도 YOLO fast와 tiny YOLO 등이 나와있다.

 

 


 

우리는 기학습된 욜로모델을 가지고 차량을 디텍션해보았다.

 

결과는 매우 우수했다.

멀리있는 차보다 가까이 있는 차가 인식이 더 잘 된다.

다만 단점은, YOLO가 무거운 네트워크이다보니 디텍션이 오래걸린다.

그리고 왜인지모르지만 저 하얀차가 우리가 디텍션하고싶은 차인데 정작에 저 차는 잘 안된다..왜일까?

 

 

 

YOLO 논문 한국어 번역 ver. : https://dhhwang89.tistory.com/51

 

Posted by 알 수 없는 사용자
: