opencv 3/C++HOG 특징 추출 방식

HOG 특징
HOG(Histograms of Oriented Gradients)경사도 방향 직사 도
경사도 정 보 를 이용 하여 이미지 목표 의 가장자리 정 보 를 반영 하고 국부 경사도 의 크기 를 통 해 이미지 국부 적 인 외관 과 모양 특징 화 를 할 수 있 습 니 다.논문Histograms of Oriented Gradients for Human Detection에서 제시 되 었 습 니 다.
HOG 특징의 추출 과정 은:
Gamma 귀 일화;
경사도 계산 하기;
구분 셀
블록 으로 조합 하여 블록 직사 도 통계 하기;
경사도 직사 도 귀 일 화;
HOG 특징 수집.
Gamma 정규 화:
이미지 색상 에 대해 Gamma 를 획일 화 처리 하여 국부 음영 과 배경 요소 의 영향 을 낮 춥 니 다.
계산 경사도:
차분 을 통 해 그림 이 수평 방향 과 수직 방향 에 있 는 사다 리 를 계산 합 니 다.

그리고 각 픽 셀 점 의 경사도 의 진폭 과 방향 을 얻 습 니 다:

구분 셀
전체 창 을 크기 가 같 고 서로 겹 치지 않 는 세포 단위 cell 로 나 누 기(예 를 들 어 8)×8 픽 셀),각 cell 의 경사도 크기 와 방향 을 계산 한 후,각 픽 셀 의 경사도 방향 을 0-180 o 0-180 o 구간(방향 없 음:0-180,방향 있 음:0-360)에서 평균 9 개의 bins 로 나 누고,각 cell 내의 픽 셀 은 진폭 으로 가중치 를 표시 하여 그 가 있 는 경사도 직사 도 에 가중 투 표를 한다.
9bins:

그림 과 같이 서로 다른 수량의 bins 에서 의 오류 율:

블록 으로 조합 하여 블록 직사 도 를 통계 합 니 다.
장 2×2 개의 인접 한 cell 구성 크기 는 16 이다.×16 의 픽 셀 블록 은 Block 입 니 다.블록 크기 의 미끄럼 창 을 왼쪽 에서 오른쪽으로 위 에서 아래로 미 끄 러 뜨리 고 경사도 방향 직사 도 벡터 를 구 합 니 다.

그림 과 같이 크기 가 다른 cell 과 크기 가 다른 block 작용 에서 의 효과 비교:

경사도 직사 도 귀 일 화
저 자 는 L2-norm,L1-norm,L1-sqrt 등 귀 일화 방법 을 비교 해 보 니 모두 비표 준 데이터 보다 현저하게 개선 되 었 다.그 중에서 L2-norm 과 L1-sqrt 가 가장 효과 가 좋 고 L1-norm 의 검출 효 과 는 L2-norm 과 L1-sqrt 보다 5%낮다.

그림 과 같이 서로 다른 귀 일화 방법의 효과 비교:

이렇게 귀 일 화 를 통 해 빛,그림자 와 가장 자 리 를 한층 더 압축 할 수 있다.
HOG 특징 수집
각 cell 내의 경사도 방향 이 9 개의 bins 로 나 뉘 어 있 기 때문에 각 세포 단원 의 HOG 특징 벡터 길 이 는 9 이다.

이렇게 크기 는 128 입 니 다.×64 크기 의 그림,8*8 픽 셀 을 사용 한 sell,2×셀 2 개 로 구 성 된 16.×16 픽 셀 의 block,8 픽 셀 의 block 이동 보폭 을 사용 하여 창 block 의 수량 을 측정 합 니 다((128-16)/8+1)×((64-16)/8+1)=15×7.HOG 특징 설명자 의 위 수 는 15 이다.×7×4×9.

HOG 의 단점:
속도 가 느 리 고 실시 간성 이 떨어진다.차단 문 제 를 처리 하기 어렵다.
OpenCV 응용 프로그램
HOG 를 이용 하여 행인 검 사 를 할 때 두 가지 용법 이 있 습 니 다.
1.HOG 특징+SVM 분류 기 를 이용 하여 행인 검 사 를 실시한다.
2.HOG+SVM 을 이용 하여 자신 을 훈련 시 키 는 XML 파일.
첫 번 째 방법 으로 HOG 특징 을 SVM 분류 기 와 결합 하여 행인 검 사 를 실시 하고 간단 한 예 를 들 면:

#include <opencv2/opencv.hpp>
#include <opencv2/objdetect.hpp>
using namespace std;
using namespace cv;

int main()
{
 Mat src, dst;
 src = imread("E:/image/image/passerby.jpg",1);
 if (src.empty())
 {
 printf("can not load the image...
"); return -1; } dst = src.clone(); vector<Rect> findrects, findrect; HOGDescriptor HOG; //SVM HOG.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); // HOG.detectMultiScale(src, findrects, 0, Size(4,4), Size(0,0), 1.05, 2); // rects , rect for(int i=0; i < findrects.size(); i++) { Rect rect = findrects[i]; int j=0; for(; j < findrects.size(); j++) if(j != i && (rect & findrects[j]) == rect) break; if( j == findrects.size()) findrect.push_back(rect); } // for(int i=0; i<findrect.size(); i++) { RNG rng(i); Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255)); rectangle(dst, findrect[i].tl(), findrect[i].br(), color, 2); } imshow("src",src); imshow("dst",dst); waitKey(); return 0; }


이상 의 opencv 3/C++HOG 특징 추출 방식 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저희 도 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기