void CascadeClassifier::detectMultiScale(
const Mat& image,
vector<Rect>& objects,
double scaleFactor=1.1,
int minNeighbors=3,
int flags=0,
Size minSize=Size(),
Size maxSize=Size() )
실시간으로 읽어낸 image
는 camera.read()
를 통해서 받아내게 되고, 이는 Mat
형식의 image
를 배출해 내는데, 여기에는 원본에서 grayscale image
를 넣어야 한다.
정확도를 높이기 위해서는 해당 상황에 일정하고 적절한 얼굴인식의 표본이 필요하다. 여러가지 조건을 수정해 보려고 한다.
scaleFactor
수정하기scaleFactor
는 이전의 자료에서도 말했듯이, 이미지 피라미드를 생성하는 크기를 의미한다고 했다.scaleFactor = 1/(Detect_Time*Accuracy)
#Detect_Time과 Accuracy는 scaleFacotr가 커질 수록 작아지고,
#작을 수록 커지는 반비례한 관계를 가진다.
따라서 scaleFactor
을 줄였더니, 사람과의 관계를 조금 더 잘 파악하는 것을 알 수 있었다.
minNeighbor
늘리기minNeighbor
을 0으로 만들면 다음과 같은 현상이 일어난다.최소 Neighbor값
을 정해주지 않아서 그렇다. 1로만 설정해도 이런 현상을 없앨 수 있다. 그러나 너무 값이 작게 되면, 얼굴이 아닌 값도 얼굴로 오해하고 얼굴로 인식할 수 있다.minNeighbor
값을 증가시켜야 한다. 근데 이때 위험한 점은 이 값을 너무 높이게 되면, 검출 모델이 너무 까다로워져 얼굴인데도 얼굴로 인식을 못할 수도 있다.고정된 데이터 생성후 훈련
얼굴인식을 할 때 현재 진행중인 프로젝트처럼, 고정된 자리에서만 얼굴인식을 한다면, 해당 고정된 장소에서 얼굴 표본을 뜨고 학습시키는 것이 정확도에 영향을 준다.
장소마다 밝기나 명암등이 다르기 때문이다. 실제로 랩실에서 이용했던 훈련모델을 이용해서 집에서 다시 인식을 해보니 인식이 안된다는 경고문이 발생하였다.
프로젝트에 맞는 얼굴 크기를 인식하기위해 min,maxSize
를 변화
우리는 랩실에서 이 기능을 이용할 것인데, 잘못하면 여러사람을 인식할 때 관리자가 아닌 의도치 않게 작게 나온 실습실의 사람들을 인식할 수도 있을 것이다. 따라서 크기를 거의 정해주어, 작은 사이즈의 사람들은 얼굴을 검출해 내지 못하도록 설정해야 한다.
표본의 개수
표본의 개수를 적당히 설정해야 한다. 너무 많이 설정하면 훈련할 데이터가 많아서 오래걸리기 때문이다. 또한 데이터가 적으면, 얼굴이 멀어졌을 경우 아래의 사진처럼 얼굴을 인식할 수 없게 된다.
해당 아래의 사진은 표본을 4개로 훈련했을 때 발생한 현상이다.
가까이에서 훈련한 데이터 만큼 다가갔을 때 그제서야 인식하는 모습을 보였다.
의외로 FaceRecognizer.train
에서는 정확도를 조절할 수 있는 옵션이 없고 images와 id만 넣을 수 있도록 parameter
가 설정되어 있어서, 훈련을 통해서 정확도를 높일 수 있는 방법은 찾기가 힘들었다.
혹여나 안다면 댓글에 꼭 알려주시기 바랍니다..