이미지를 feature vector로 변환하는것은, 이를 머신러닝 알고리즘에 적용하기 전에 하는 전처리 단계중 하나이다. 즉, image data를 가지고 ml 알고리즘에 넣기전에 전처리 하는 것은 전형적인 일이며, 그래야 알고리즘이 동작한다.
위와 같은 과정을 거치는 이유는 image를 feature vector로 나타내는 것이 더 효율적이기 때문이다.
이때 자주 사용하는 기법은 HOG , BoW가 존재한다.
Histogram of Oriented Gradients ( 기울기를 지향하는 히스토그램? )
Bag-of-Words
만약 20 X 20 pixel image가 있다면 opencv에서는 이를 길이가 400인 1D vector(feature)로 표현한다.
하지만, 위의 과정은 각각의 pixel에 대해서 나타내며, ml알고리즘에서 매번 feedback받기에는 비 효율적이며, 특히 input feature data의 길이가 크면 클수록 더욱이 효율이 감소한다.
서론에서는 feature가 많아질수록 효율이 감소한다고 했다.
그러면 우리는 이러한 input data에 대해서 feature( 혹은 차원)을 줄여야한다.
그래서 우리는 필요한 feature들이 뽑아내기 위해서 HOG나 Bow와 같은 기법을 사용한다.
이미지에서 기울기란?
이미지의 색상 or 밝기 변화율을 나타내는 벡터이다.
기울기는 수평,수직으로 나뉜다.
Gx가 수평이라면, 이미지의 가로 방향으로 픽셀값의 변화율을 계산한다.
sobel kernel을 가지고 계산함
기울기가 작으면 주변 픽셀과 유사하다는것. 기울기가 크면 주변과 차이가 난다는것
Gy가 수직이라면, 이미지의 세로 방향으로 픽셀 값의 변화율을 계산한다.
이것두 sobel kernel로 계산...
기울기의 크기는 G = √(Gx² + Gy²) 로 계산됨
기울기의 방향은 θ = arctan(Gy/Gx)로 계산됨
그래프1
HOG
국소적인 기울기 방향을 분석해서 feature를 추출하는 기법
과정
1. 기울기 계산
이미지에서 pixel간의 밝기 차이를 계산해서 edge와 텍스처 정보를 추출한다.
일반적으로 sobel 연산자 를 사용 얻은 sobel filter를 사용해서, 각 픽셀의 기울기 값을 계산
기울기 값에는 크기와 방향이 존재
기울기의 크기는 경계의 강도를 의미. graident magnitude
기울기의 방향은 경계의 방향을 나타냄. gradient direction
2. 이미지를 작은 구역cell로 나눈다.
ex) 8x8 pixel크기의 cell
각 cell에서 위에서 계산한 기울기 방향 정보를 히스토그램 형태로 표현함
3. 히스토그램 계산
각 cell에서 계산된 gradient direction을 여러개의 방향bin으로 나누고, 해당 0° ~ 20°, 20° ~ 40°, ..., 160° ~ 180°로 9개의 방향 bin을 사용할 수 있습니다. 를 누적해서 히스토그램을 만든다.
여러 bin으로 나눈다???
그래프1을 보면 기울기의 각도는 총 0~180˚으로 나올것이다. 그러면 예를 들어서 0° ~ 20°, 20° ~ 40°, ..., 160° ~ 180°로 한다면 총 9개의 방향 bin을 만들 것이다.
graident magnitude를 누적한다???
각 pixel의graident magnitude를 해당되는 gradient direction의 bin에 누적시킨다. 즉, 기울기의 크기는 히스토그램 값의 가중치로 이용되는거임. ( 맞는 bin이 없다면 인접한 bin에게 비례적으로 분배함)
ex) 특정 픽셀이 45° 방향이고 기울기 크기가 10이라면, 40° ~ 60° bin에 10을 더한다.
결과적으로 각 cell에서 방향bin에 따른 히스토그램이 생성된다.
4. 여러 cell을 묶어서 block을 만든다.
ex) 2x2 cell을 하나의 블록으로 묶음. 즉, 4개의 cell을 하나의 block으로 만드는 것.
5. block을 가지고 정규화(normalization)를 시켜서 밝기 변화의 영향을 제거한다.
정규화를 통해서 이미지의 명암 차이에 더 강건해짐
6. 특징 vector 생성
모든 block에서 계산된 히스토그램을 하나의 feature vector로 만든다. 이것이 ml의 input data로 사용됨.
하나의 feature vector로 만든다???
여러 block에서 계산된 값들을 하나의 긴 vector로 이어 붙인다는 것.
ex) 이 미지에 4개의 블록이 있고 각 블록에 대해 계산된 히스토그램이 9개 값이라면, 그 히스토그램은 4×9 = 36개의 값을 가질 것. 즉, 36차원의 벡터가 만들어짐. 이것이 HOG의 feature vector이다.
feature vector는 이미지의 크기 , cell의 크기 , block의 크기 , bin의 개수에 따라 달라진다.
장점: 조명 변화에 강건함, 계산 효율적. 경계기반 특징을 사용하니 객체 검출 성능이 좋다.
단점: 복잡한 배경에 약함.
활용 : 사람 검출 , 얼굴 검출 , 객체 추적
입력된 이미지 목록에 대해 각 이미지의 HOG 특징 벡터 를 계산하여 하나의 특징 벡터 배열 을 반환
HOGDescriptor함수
객체( 특히 사람 )을 탐지하는데 사용되는 HOG를 구현한 클래스
이는 이미지의 특징을 추출하고, 이를 바탕으로 물체를 탐지함
cv2.HOGDescriptor
winSize 탐지 윈도우 크기
blockSize 윈도우를 나누는 블록의 크기. HOG 특징이 계산되는 기본 단위를 설정함
blockStride 블록을 이동시키는 간격. 블록 간 겹침을 조절함.
cellSize 블록을 구성하는 셀의 크기.
nbins 각 셀의 방향 히스토그램에서 사용하는 방향bin의 개수
derivAperture 경사도를 계산할때 사용하는 Sobel 필터의 커널 크기. default = 1
winSigma 가우시안 smoothing에 사용하는 표준편차. default = -1
L2HysThreshold 정규화 수행시 사용하는 임계값. default = 0.2