딥러닝을 이용한 얼굴 검출 예제 프로그램은 컴퓨터에 연결된 카메라로부터 들어오는 매 프레임마다 얼굴을 검출하고, 검출된 얼굴 위치에 사각형을 그리는 방식으로 만들어 보겠습니다. 카메라로부터 매 프레임을 받아 오기 전에 먼저 Net 객체를 생성해야 합니다. 카페에서 학습된 모델 파일과 구성 파일을 이용하여 Net 객체를 생성하려면 다음과 같이 코드를 작성합니다.
const String model = "res10_300x300_ssd_iter_140000_fp16.caffemodel"; const String config = "deploy.prototxt"; Net net = readNet(model, config);
만약 카페 대신 텐서플로에서 훈련된 데이터 파일을 사용하고 싶다면 model과 config 변수 내용을 다음과 같이 변경하여 네트워크를 불러옵니다.
const String model = "opencv_face_detector_uint8.pb"; const String config = "opencv_face_detector.pbtxt"; Net net = readNet(model, config);
앞 코드에서 사용한 각각의 모델 파일과 구성 파일은 프로그램 실행 폴더에 함께 있어야 합니다. 그러므로 <OPENCV-SRC>/samples/dnn/face_detector 폴더에서 미리 사용할 모델 파일과 구성 파일을 프로젝트 폴더 또는 실행 파일이 있는 위치에 복사하기 바랍니다.
Net 객체가 정상적으로 생성되었다면 이제 카메라 장치를 열어서 매 프레임을 받아 옵니다. 매 프레임을 Mat 타입의 변수 frame에 저장하였다고 가정하고, frame 영상으로부터 네트워크 입력으로 전달할 블롭 객체를 생성해야 합니다. SSD 기본 네트워크 구조에서 입력 영상 크기는 300×300이고, 영상 평균값으로 Scalar(104, 177, 123)을 사용하였으므로 blobFromImage() 함수 인자는 다음과 같이 설정합니다.
Mat blob = blobFromImage(frame, 1, Size(300, 300), Scalar(104, 177, 123));