더북(TheBook)

이렇게 만들어진 blob 블롭 객체는 1×3×300×300 형태의 4차원 행렬이며, net 객체에 입력으로 사용됩니다.

net.setInput(blob);
Mat res = net.forward();

앞 소스 코드에 의해 생성되는 res 행렬은 1×1×N×7 크기의 4차원 행렬로 구성됩니다. 처음 두 개 차원 크기는 항상 1이고, 네 번째 차원 크기는 항상 7입니다. 세 번째 차원 크기 N은 검출된 얼굴 후보 영역 개수를 의미하며, SSD 기반 얼굴 검출 네트워크는 최대 200개까지의 후보 영역을 검출합니다. 출력으로 나온 N개의 얼굴 후보 영역 중에서 얼굴일 확률이 높은 영역만 최종 얼굴 영역으로 선택합니다. res 행렬에서의 1, 2차원 크기는 항상 1이므로 res 행렬의 3, 4차원만 이용하여 새로운 2차원 행렬을 구성하여 사용하는 것이 간편합니다. 다음은 4차원의 res 행렬을 2차원 행렬 detect로 변환하는 소스 코드입니다.

Mat detect(res.size[2], res.size[3], CV_32FC1, res.ptr<float>());

앞 코드에 의해 생성되는 detect 행렬은 N×7 크기의 2차원 행렬이고, 타입은 CV_32FC1입니다. 이 행렬의 0번과 1번 열에는 항상 0과 1이 저장됩니다. 2번째 열에는 얼굴 신뢰도(confidence)가 저장됩니다. 신뢰도는 0부터 1 사이의 실수로 저장되며, 얼굴일 가능성이 높으면 1에 가까운 값이 저장됩니다. detect 행렬의 3번부터 6번 열에는 얼굴 영역 사각형 좌측 상단 꼭지점 좌표 (x1, y1)과 우측 하단 꼭지점 좌표 (x2, y2)가 차례대로 저장됩니다. 이때 사각형 좌표는 영상의 가로와 세로 크기를 1로 정규화하여 저장된 좌표이며, 실제 픽셀 좌표는 영상의 가로 및 세로 크기를 곱해서 계산해야 합니다. detect 행렬의 각 행은 얼굴 신뢰도가 높은 순서부터 내림차순 정렬되어 있습니다. 그러므로 detect 행렬에서 매 행을 읽고, 이 중 얼굴 신뢰도가 특정 임계값보다 큰 경우에 대해서만 얼굴이라고 간주합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.