객체검출과 관련있는 딥러닝 모델을 가져와서 OpenCV에서 실행하는 방법에 대해서 알아본다.
이번시간에는 딥러닝으로 얼굴을 검출하는 방법에 대해서 알아본다.
OpenCV DNN 얼굴 검출 예제
- OpenCV 예제에서 DNN 모듈을 사용한 얼굴 검출 기능을 지원
> SSD ( Single Shot MultiBox Detector ) 기반 얼굴 검출 네트워크
> opencv/samples/dnn/face_detector at master · opencv/opencv · GitHub
GitHub - opencv/opencv: Open Source Computer Vision Library
Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.
github.com
위 사이트를 보면 Face_Detector 라는 폴더까지 만들어져있는 것을 볼 수 있다.
- 기존의 Haar-Cascade 방법보다 속도 & 정확도 면에서 더 좋은 성능을 나타냄
위 표는 기존의 Haar Cascade 방법과 Deep Learning 과의 얼굴인식 성능을 비교한 표인데
1. Size on disk : 기존의 Haar Cascade 방법은 학습되어있는 xml 파일이라는 것을 가져와서 실행을 하는데 528KB의 사이즈밖에 않된다. 그에 반해 Deep Learning 은 10MB , 5MB 의 xml 파일대비 대용량의 사이즈를 갖는다.
2. Efficiency : Haar Cascade방법은 Detection Box를 점점 키워가면서 얼굴을 검출하게되는데 그렇기때문에 얼굴검출까지의 시간이 30ms정도가 나오는데 반해 Deep Learning은 9.34ms로 약 3배정도 빨리 검출할 수 있다.
3. Performance ( 정확도 ) : Haar Cascade 는 0.609 , 0.149 의 값을 가지고 Deep Learning 은 0.797, 0.173인 것으로 보아
Deep Learning이 Haar Cascade보다 높은 정확도를 갖고있다고 볼 수 있다.
그리고 Haar Cascade같은 경우는 얼굴에 가려짐이 있거나 정면 얼굴이 아닌 경우 얼굴인식을 잘 하지 못한다.
그에 반해 Deep Learning 같은 경우는 얼굴이 조금 가려져있다고 해도 훈련이 잘 되어있어 인식을 할 수 있다.
SSD ( Single Shot MultiBox Detector ) ( W. Liu, et. al, 2016 )
- 동시대 다른 객체 검출 알고리즘과 비교하여 성능과 속도 두 가지를 모두 만족시킨 알고리즘
> Faster R-CNN : 73.2mAP, 7FPS ( 성능은 좋으나 속도가 느림 )
> YOLOv1 : 63.4mAP, 45FPS ( 속도는 빠르나 성능이 상대적으로 떨어짐 )
=> SSD : 74.3mAP, 59FPS
OpenCV Face 검출 모델 & 설정 파일 다운로드
- 모델파일
> OpenCV 제공 스크립트 사용 방법
https://github.com/opencv/opencv/tree/master/samples/dnn/face_detector 에서 파일 다운로드 후
download_weights.py 파일 실행
위 3개파일 다운로드 ( Raw 다른이름으로 저장 ), 원래는 4개의 파일인데 ( 스크립트 pyhone 파일 포함 )..
* 현재는 OpenCV에서 모델파일을 다운로드 받을 수 있는 스크립트를 제공하지 않기때문에
다른 곳에서 구글링하여 구해야함.
- 구성 파일 다운로드
https://github.com/opencv/opencv/tree/master/samples/dnn/face_detector 에서 deploy.prototxt, opencv_face_detector.pbtxt 파일 다운로드
- 다운로드 받은 파일을 실행폴더 \ opencv_face_dector \ 폴더에 저장
이후의 방법으로는
여기까지 다운로드해서 해당 파일들을 옮겨주고나서 cmd 창을 실행시켜준다.
( 폴더 경로부분을 클릭하여 경로를 지운 뒤 cmd 를 입력해주면 실행된다.
그러면 아래 이미지처럼 2개의 파일이 현재 폴더에 저장되게 된다.
위 방법 이외의 방법으로 모델파일을 직접 다운로드 받아도 무관하다.
> 모델 파일 직접 다운로드
Caffe ( FP16 ) https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180205_fp16/res10_300x300_ssd_iter_140000_fp16.caffemodel
TensorFlow ( uint8 )
https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180220_uint8/opencv_face_detector_uint8.pb
- 구성 파일 다운로드
OpenCV DNN 얼굴 검출 ( SDD ) 입력
- Size : ( 300, 300 ) resize
- Scale : 1 ( 0 ~ 255 )
- Mean : ( 104, 177, 123 )
- RGB : false
OpenCV DNN 얼굴 검출 ( SSD ) 입력
- out.shape = ( 1, 1, 200, 7 ) 앞의 1,1 은 큰 의미는 없고 뒤 200, 7 이 사용해야하는 부분
- detect = out [ 0, 0, :, : ] * 위 1,1을 무시하기 위해 사용하는 방법이다.
c : Confidence 값 ( 얼굴일 확률 )
x1, y1, x2, y2 : 얼굴을 인식했을 때의 바운딩 박스 좌표 ( 좌측상단, 우측 하단 )
그런데 바운딩박스의 범위가 0~1 사이로 Nomalize 되어있음.
그래서 실제 들어오는 영상의 좌표를 추출하기 위해서는 실제 입력 영상의 Width값과 Height값을
x,1 y1, x2, y2에 곱해줘야한다.
코드리뷰
위에서 model 과 config는 Caffe 에서 학습된 모델을 사용한 것을 볼 수 있다.
그리고 카메라를 Open해서 웹캠으로 실제 얼굴이 검출되는지 확인할 수 있다.
이 외에서는 기존 DeepLearning 파일을 로드해서 사용하는 것과 다르지 않다.
하지만 위에서도 설명했듯이 detect = [ 0, 0, :, : ] 으로 얼굴 인식 확률과 바운딩 박스를 추출해내는 부분이 다르다.
사진을 캡쳐할 때 마다 confidence를 확인하여 해당 Confidence가 0.5 미만일때는 얼굴을 검출하지 않고
0.5 초과일때는 얼굴로 검출되어 detect값에서 검출된 바운딩박스에 영상의 Width, Height를 곱해줘서 실제 얼굴을 표시한다.
* 여기서 주의깊게 봐야할 부분은 네트워크의 입려과 출력을 어떻게 설정해야하는지에 대한 부분인데
OpenCV에서 제공하는 얼굴검출은 예제들이 많이 나와있어서 해당 부분들을 검색해서 참고하면 좋을 것 같다.
'Program > 딥러닝' 카테고리의 다른 글
[Open CV] 딥러닝활용 _ OpenPose 포즈 인식 (0) | 2022.07.31 |
---|---|
[Open CV] 딥러닝활용 _ YOLOv3 객체 검출 (0) | 2022.07.26 |
[Open CV] 딥러닝 _ 실전코딩 ( 한글 손글씨 인식 ) (0) | 2022.07.24 |
[Open CV] 딥러닝 _ GoogLeNet 영상 인식 (0) | 2022.07.22 |
[Open CV] 딥러닝 _ MNIST 학습 모델 사용하기 (0) | 2022.07.21 |