>  기사  >  백엔드 개발  >  OpenCV에서 Python으로 구현한 얼굴 인식 예제에 대한 자세한 설명

OpenCV에서 Python으로 구현한 얼굴 인식 예제에 대한 자세한 설명

Y2J
Y2J원래의
2017-04-27 11:27:244882검색

이 글에서는 opencv를 사용하여 Python에서 얼굴 인식을 구현하는 것과 관련된 정보를 주로 소개합니다. 매우 좋은 참조 값을 가지고 있습니다. 아래 에디터로 살펴보겠습니다

주요 단계는 다음과 같습니다.

1. 얼굴 인식

2. 얼굴 전처리

3. 수집된 얼굴로 머신러닝 알고리즘 훈련

4. 얼굴 인식

5. 마무리 작업

얼굴 인식 알고리즘 :

Haar 기반 얼굴 검출기의 기본 개념은 얼굴 전면의 대부분의 영역에서 눈이 위치한 영역이 이마와 뺨보다 어두워야 하며, 입은 뺨보다 더 어두워야 합니다. 감지된 객체가 얼굴인지 여부를 결정하기 위해 일반적으로 약 20번의 비교를 수행하며 실제로는 수천 번 수행되는 경우가 많습니다.

LBP 기반 얼굴 감지기의 기본 아이디어는 Haar 기반 얼굴 감지기와 유사하지만 픽셀 밝기 히스토그램, 예를 들어 가장자리, 모서리, 평면 영역의 히스토그램을 비교합니다.

이 두 얼굴 감지기는 이후 사용을 위해 opencv의 XML 파일에 저장되는 대규모 이미지 세트를 학습하여 얼굴을 찾을 수 있습니다.

이러한 계단식 분류 탐지기에는 일반적으로 훈련을 위해 최소 1,000개의 고유 얼굴 이미지와 10,000개의 비얼굴 이미지가 필요합니다. 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. Eigenface, PCA(Principal Component Analysis)라고도 합니다

2. LDA(선형 판별 분석)라고도 하는 피셔 얼굴

3. 히스토그램(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 기능을 사용하면 일부 구성 요소 그리기, 마우스 클릭 등을 쉽게 할 수 있습니다.

위 내용은 OpenCV에서 Python으로 구현한 얼굴 인식 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.