OpenCV 얼굴 인식 실현

5736 단어 opencv얼굴 인식
주로 다음 과 같은 절차 가 있다.
1.얼굴 검사
2.얼굴 전처리
3.수 집 된 사람의 얼굴 훈련 기계 에서 알고리즘 배우 기
4.얼굴 인식
5.마무리 작업
얼굴 검출 알고리즘:
Haar 의 얼굴 감지 기 기본 사상 에 따 르 면 얼굴 정면 대부분 에 눈 이 있 는 곳 은 이마 와 볼 보다 어 두 워 야 하고 입 이 볼 보다 어 두 워 야 한 다 는 등의 상황 이 있다.이 는 보통 20 개의 비 교 를 통 해 검 측 된 대상 이 얼굴 인지 아 닌 지 를 결정 하 는데 실제로 수천 번 을 하 는 경우 가 많다.
LBP 기반 얼굴 감지 기의 기본 사상 은 Haar 기반 얼굴 감지 기와 유사 하지만 픽 셀 밝기 직사 도,예 를 들 어 가장자리,구석,평탄 한 지역 의 직사 도 를 비교 합 니 다.
이 두 가지 얼굴 감지 기 는 훈련 된 이미지 세트 를 통 해 얼굴 을 찾 을 수 있 으 며,이 이미지 세트 는 opencv 에 XML 파일 이 존재 하여 나중에 사용 할 수 있 습 니 다.
이러한 등급 별 분류 검 측 기 는 보통 적어도 1000 개의 독특한 얼굴 이미지 와 10000 개의 비 얼굴 이미 지 를 훈련 으로 사용 해 야 하 며,훈련 시간 은 보통 LBP 가 몇 시간 걸 립 니까?
Haar 일주일 걸 려 요.
프로젝트 의 핵심 코드 는 다음 과 같 습 니 다.

initDetectors
faceCascade.load(faceCascadeFilename);
eyeCascade1.load(eyeCascadeFilename1);
eyeCascade2.load(eyeCascadeFilename2);

initWebcam
videoCapture.open(cameraNumber);

cvtColor(img, gray, CV_BGR2GRAY);
//               ,         
resize(gray, inputImg, Size(scaledWidth, scaledHeight));
equalizeHist(inputImg, equalizedImg);
cascade.detectMultiScale(equalizedImg......);
얼굴 전처리:
실제 훈련(이미지 수집)과 테스트(카메라 이미지 에서 온)의 이미지 가 크게 다 를 수 있 습 니 다.(예 를 들 어 빛,사람의 얼굴 방위,표정 등)
결과 가 나 빠 지기 때문에 훈련 용 데이터 세트 가 중요 하 다.
얼굴 예 처 리 는 이런 문 제 를 줄 이 고 전체 얼굴 인식 시스템 의 신뢰성 을 높이 는 데 도움 이 된다.
사람의 얼굴 을 미리 처리 하 는 가장 간단 한 형식 은 equalizeHist()함수 로 직사 도 균형 을 잡 는 것 이다.이것 은 사람의 얼굴 이 그 단 계 를 검사 하 는 것 과 같다.
실제 검출 알고리즘 을 더욱 신뢰 할 수 있 도록 얼굴 특징 검출(예 를 들 어 눈,코,입,눈썹 검출)을 사용 하고 본 프로젝트 는 눈 검출 만 사용한다.
OpenCV 자체 훈련 된 눈 탐지 기 를 사용 합 니 다.예 를 들 어 정면 안면 검 사 를 마 친 후 한 사람의 얼굴 을 얻어 눈 검 측 기 를 이용 해 얼굴의 왼쪽 눈 구역 과 오른쪽 눈 구역 을 추출 하고 각 눈 구역 에 대해 직사 도 균형 을 맞춘다.
이 단계 에 관련 된 조작 은 다음 과 같은 내용 이 있다.
1.기하학 적 변환 과 재단
사람의 얼굴 을 맞 추 는 것 은 매우 중요 하 다.사람의 얼굴 을 회전 시 켜 눈 을 수평 으로 유지 하고 사람의 얼굴 을 확대 하여 눈 사이 의 거 리 를 똑 같이 한다.사람의 얼굴 을 평평 하 게 이동 시 켜 눈 을 항상 필요 한 높이 에서 수평 으로 가운데 로 한다.
얼굴 외곽 을 재단 하 다.
2.사람의 얼굴 왼쪽 과 오른쪽 에 각각 직사 도 를 사용 하여 균형 을 맞춘다.
3.매끈매끈 하 다
쌍무 필터 로 영상 소음 을 줄이다.
4.타원 마스크
남 은 머리 와 얼굴 이미지 배경 제거
프로젝트 의 핵심 코드 는 다음 과 같 습 니 다.

detectBothEyes(const Mat &face, CascadeClassifier &eyeCascade1, CascadeClassifier &eyeCascade2,
Point &leftEye, Point &rightEye, Rect *searchedLeftEye, Rect *searchedRightEye);
topLeftOfFace = face(Rect(leftX, topY, widthX, heightY));
//          
detectLargestObject(topLeftOfFace, eyeCascade1, leftEyeRect, topLeftOfFace.cols);
//    ,           
leftEye = Point(leftEyeRect.x + leftEyeRect.width/2, leftEyeRect.y + leftEyeRect.height/2);
//        ,           
Point2f eyesCenter = Point2f( (leftEye.x + rightEye.x) * 0.5f, (leftEye.y + rightEye.y) * 0.5f );
//    (Affine Warping)        
rot_mat = getRotationMatrix2D(eyesCenter, angle, scale);
//                          
warpAffine(gray, warped, rot_mat, warped.size());

//                  
equalizeHist(leftSide, leftSide);
equalizeHist(rightSide, rightSide);
//   ,       1/4   1/4      ,   2/4               。

//    
bilateralFilter(warped, filtered, 0, 20.0, 2.0);

//             
filtered.copyTo(dstImg, mask);
사람의 얼굴 수집 및 훈련:
좋 은 데이터 세트 는 사람의 얼굴 이 바 뀌 는 여러 가지 상황 을 포함해 야 하 며,이러한 변 화 는 훈련 집중 에 나타 날 수 있다.정면 얼굴 만 테스트 하면,완전히 정면 얼굴 이 있 는 이미 지 를 훈련 시 키 면 된다.
따라서 좋 은 훈련 집 에는 많은 실제 상황 이 담 겨 있어 야 한다.
이 항목 에서 수집 한 이미지 사이 에는 최소 1 초 간격 이 있 으 며,L2 범 수 를 기반 으로 한 상대 적 인 오류 평가 기준 을 사용 하여 두 픽 셀 간 의 유사 성 을 비교 합 니 다.

errorL2 = norm(A, B, CV_L2);
similarity = errorL2 / (double)(A.rows * A.cols);
신인 얼굴의 한도 값 을 수집 하 는 것 보다 이번 그림 을 수집 할 지 여 부 를 결정 한다.
많은 기술 로 더 많은 훈련 데 이 터 를 얻 을 수 있다.예 를 들 어 미 러 얼굴 을 사용 하고 무 작위 소음 을 넣 으 며 얼굴 이미 지 를 바 꾸 는 픽 셀,회전 등 이다.

//  
flip(preprocessedFace, mirroredFace, 1);
모든 사람 에 게 충분 한 얼굴 이미 지 를 수집 한 후,그 다음 에는 얼굴 인식 에 적합 한 기계 학습 알고리즘 을 선택 하여,이 를 통 해 수집 한 데 이 터 를 학습 하여 한 사람의 얼굴 인식 시스템 을 훈련 시 켜 야 한다.
얼굴 인식 알고리즘:
1.얼굴 특징,PCA 라 고도 함(주성 분 분석)
2.Fisher 얼굴,LDA 라 고도 함(선형 판별 분석)
3.부분 2 값 모드 직사 도(Local Binary Pattern Histograms,LBPH)
다른 얼굴 인식 알고리즘:www.face-rec.org/algorithms/
OpenCV 는 CV::Algorithm 류 를 제공 합 니 다.이 종 류 는 몇 가지 서로 다른 알고리즘 이 있 는데 그 중의 한 가지 알고리즘 으로 간단 하고 통용 되 는 얼굴 인식 을 완성 할 수 있 습 니 다.
OpenCV 의 contrib 템 플 릿 에는 위의 얼굴 인식 알고리즘 을 실현 하 는 FaceRecognizer 클래스 가 있 습 니 다.

initModule_contrib();
model = Algorithm::create<FaceRecognizer>(facerecAlgorithm);

model->train(preprocessedFaces, faceLabels);
이 코드 는 선택 한 얼굴 인식 훈련 알고리즘 전 체 를 실행 할 것 이다.
얼굴 인식:
1.얼굴 인식:얼굴 을 통 해 이 사람 을 인식 한다.
FaceRecognizer::predict()함 수 를 간단하게 호출 하여 사진 속 사람 을 식별 할 수 있 습 니 다.int identity = model->predict(preprocessedFace);문 제 는 주어진 사람 을 항상 예측 하 는 것 이다.
이 문 제 를 해결 하 는 방법 은 신뢰 도 기준 을 제정 하 는 것 이 고,신뢰 도가 너무 낮 으 면 판독 할 수 있 는 것 은 모 르 는 사람 이다.
2.얼굴 검증:이미지 에서 찾 고 싶 은 사람 이 있 는 지 검증
믿 을 만 한 지,아니면 시스템 이 모 르 는 사람 을 정확하게 식별 할 수 있 는 지 검증 하기 위해 서 는 얼굴 검증 이 필요 하 다.
여기 서 신뢰 도 를 계산 하 는 방법 은:
특징 벡터 와 특징 치 를 사용 하여 얼굴 그림 을 재 구성 한 다음 에 입력 한 이미지 와 재 구성 도 를 비교 합 니 다.한 사람 이 훈련 에 여러 장의 얼굴 그림 을 집중 시 키 면 특징 벡터 와 특징 을 사용한다.
값 을 재 구성 한 후에 아주 좋 은 효과 가 있어 야 한다.없 으 면 차이 가 매우 크 고 알 수 없 는 얼굴 일 수 있다 는 것 을 나타 낸다.
subspaceProject()함수 가 얼굴 이미 지 를 특징 공간 에 비 추고 subspaceReconstruct()함수 로 특징 공간 에서 이미 지 를 재 구성 합 니 다.
마무리:대화 식 GUI
OpenCV 함 수 를 이용 하면 일부 구성 요소,마우스 클릭 등 을 쉽게 그 릴 수 있다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기