일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 하이퍼바이저
- Bidirectional Associative Memory
- 패턴 인식
- 패턴인식
- hopfield network
- 물걸레자동세척로봇청소기
- 신경회로망
- Friendship
- 구글 앱 엔진
- 파이썬
- Google App Engine
- Python
- 동아리
- 빅데이터
- 멤버십
- 가상화
- 인공지능
- NarwalFreo
- 증강현실
- SSM
- 고려대학교
- 갤럭시탭S8울트라
- Neural Network
- 물걸레로봇청소기추천
- 삼성
- 신경망
- 삼성소프트웨어멤버십
- 나르왈프레오
- BAM
- 삼성전자 소프트웨어멤버십 SSM
- Today
- Total
정보공간_1
[4기 신촌 백재현] Luxand Face SDK를 사용하여 얼굴 유사도를 측정해보자 본문
[4기 신촌 백재현] Luxand Face SDK를 사용하여 얼굴 유사도를 측정해보자
알 수 없는 사용자 2013. 12. 5. 05:06안녕하세요 신촌멤버십 22-1기 백재현입니다.
이번에는 Luxand에서 나온 Face recognition(얼굴 인식)용 SDK인 Face SDK를 사용하여 얼굴의 유사도를 측정하는 방법에 대해 알아보도록 하겠습니다. 사용할 툴은 Visual Studio이며, C++을 사용하도록 하겠습니다.
기본적으로 '얼굴 매칭'은 영상처리에서도 어려운 분야로 OpenCV를 제대로 써보지 않은 사용자라면 쉽게 접근하기 힘들다고 생각하는 것이 보통입니다. 하지만 Face SDK를 사용한다면 누구나 쉽게 Face Recognition과 관련된 기능을 사용 할 수 있습니다.
위 그림은 얼굴 인식 프로그램으로 가장 대중화 돼있는 KT Hitel의 푸딩 얼굴인식 입니다. 얼굴 사진을 넣으면 ①얼굴 영역을 판별하여 ②가장 유사한 얼굴을 검색하여 알려줍니다.
위 기능을 Face SDK를 통하여 수행하기 위해 우선 Face SDK를 다운 받도록 하겠습니다.
http://www.luxand.com/download/
위의 페이지에서 다운 받아서 설치 할 수 있습니다. 기본적인 설치 과정과 Evaluation Key를 발급 받는 과정은 넘어가도록 하겠습니다.
1) 프로젝트에서 Face SDK를 사용하기 위한 초기 설정들
facesdk를 Visual C++에서 사용하기 위해서는 위의 세 파일이 필요합니다. 세 파일은 Face SDK 설치 경로 안에서 찾을 수 있습니다. 위 파일들을 프로젝트 소스파일이 있는 경로와 같은 폴더에 넣어 주신후 해당 sdk를 사용할 프로젝트의 속성에서 아래와 같이 파일을 추가해 줍니다.
이제 라이브러리가 정상적으로 import 되었기 때문에, SDK 사용을 위한 초기화를 해주어야 합니다.
사용할 소스파일의 상단에 #include "LuxandFaceSDK.h"를 써주신후 아래의 코드를 입력합니다.
발급 받은 키를 FSDK_ActivateLibrary(key)의 인자로 넣어 주신 후 FSDK_Initialize("")를 해주시면 Face SDK를 사용할 준비가 다 되었습니다.
2) 얼굴 인식 옵션 설정
첫번째로 알아야 할 함수는 FSDK_SetFaceDetectionParameters 입니다. 원형은 아래와 같습니다.
int FSDK_SetFaceDetectionParameters(bool HandleArbitraryRotations, bool DetermineFaceRotationAngle, int InternalResizeWidth);
HandleArbitaryRotations는 탐색할 얼굴의 각도의 수준을 설정합니다. true로 할 경우 정면에서 -30~30도까지 기울어진 얼굴을 탐색 할 수 있되 속도가 느려지며, false로 할 경우 -15~15도까지 기울어진 얼굴이 탐색 가능합니다. 사진 속에서 얼굴을 찾는 것이 가장 중요하기 때문에 반드시 선행 되어야 하는 옵션입니다.
DetermineFaceRotationAngle은 검출된 얼굴이 몇도나 틀어져 있는지에 대한 기록 여부를 결정합니다. true일 경우 구조체 TFacePosition에 기록 되어 FSDK_DetectFace를 통하여 얼굴이 틀어진 각도값을 가져올 수 있습니다. false일 경우 해당 값을 기록하지 않습니다.
InternalResizeWidth : 내부적으로 얼굴 검색을 위해 사진의 사이즈를 resize하게 되는데 이 때 얼마의 값으로 resize하는지를 결정합니다. 값이 클 경우 더 높은 수준으로 얼굴을 찾을 수 있지만 속도가 느려지며, 값이 작을 경우 얼굴 검출률이 낮아지지만 속도가 빨라집니다.
이번에는 얼굴 유사도를 측정하기 위한 것이기 때문에 FSDK_SetFaceDetectionParameters(false, false, 500) 정도로 주면 적당 할 것 같습니다.
3) 이미지를 로드하기
이미지의 로드는 FSDK_LoadImageFromFile를 사용하도록 하겠습니다. 해당 함수는 파일로 부터 이미지를 읽어와 HImage로 반환합니다.
원본 사진과 비교 대상 사진을 HImage imgOrg, imgComp로 선언하여 FSDK_LoadImageFromFile(&imgOrg, "원본.jpg");의 형태로 이미지를 로드 할 수 있습니다.
4) 이미지로 부터 얼굴 위치 검출
이제 HImage에 로드된 이미지 데이터로 부터 얼굴의 위치을 검출해야 합니다. 얼굴 검출에는 int FSDK_DetectFace(HImage Image, TFacePosition* FacePosition) 함수를 사용합니다.
TFacePosition ptOrg, ptComp를 선언하여 사용하시고, 해당 함수에 HImage와 TFacePosition의 포인터를 넣어 사용하시면 됩니다. 예를 들면 다음과 같이 사용 할 수 있습니다.
FSDK_DetectFace(imgOrg, &ptOrg);
사진에서 얼굴 검출에 성공 할 경우 리턴 값으로 FSDKE_OK 를 리턴하게 됩니다. 그 외에 실패하는 경우들에 대해서 FSDKE_FACE_NOT_FOUND, FSDKE_IMAGE_TOO_SMALL 등의 값을 리턴하게 됩니다.
5) 얼굴 사진과 검출된 얼굴의 위치로 부터 얼굴 정보 얻어오기
검출된 얼굴의 위치(TFacePosition)와 얼굴 사진(HImage)으로부터 얼굴의 정보(FaceTemplate)를 얻어 올 수 있습니다.
이에는 int FSDK_GetFaceTemplateInRegion(HImage Image, TFacePosition* FacePosition, FSDK_FaceTemplate* FaceTemplate); 함수를 사용합니다.
FSDK_FaceTemplate ftOrg를 선언하여 FSDK_GetFaceTemplateInRegion(imgOrg, &ptOrg, &ftOrg) 처럼 구현 할 수 있습니다.
얼굴 정보는 FSDK_FaceTemplate 구조체에 저장되어 리턴됩니다.
6) 두 사진속 얼굴의 유사도 비교
여기까지 잘 쫓아오셨다면, ftOrg와 ftComp에 얼굴의 정보가 담겨 있을 것입니다. 두 FaceTemplate을 이용하여 유사도를 비교하는 데에는 int FSDK_MatchFaces(FSDK_FaceTemplate* FaceTemplate1, FSDK_FaceTemplate* FaceTemplate2, float* Similarity)를 사용합니다.
FSDK_MatchFaces(&ftOrg, &ftComp, &similarity)와 같이 구현하면 similarity 변수에 두 얼굴의 유사도가 측정됩니다. 0~1까지의 값으로 리턴되며 0일 경우 '전혀 유사하지 않음', 1일 경우 '100% 유사함'입니다. 0.5일 경우 50%유사함으로 생각하시면 됩니다.
만약 푸딩 얼굴 인식과 같은 프로그램을 짜고 싶다면, 원본 이미지에는 본인의 사진을 넣고, 비교 대상 이미지에는 다른 연예인 얼굴들을 번갈아 가며 넣으면서 유사도가 가장 높은 연예인을 찾을 때 까지 이를 반복하면 되겠습니다. (물론 이는 정말 쉽게 짜는 방법이고 실제는 바이너리 서치 등을 통해 속도 최적화를 했겠죠?)
- 마무리
이상 Luxand Face SDK를 통하여 얼굴 유사도를 측정해 보는 방법을 알아 보았습니다. 아직 널리 알려진 SDK가 아니라서 한국에서는 사용자를 찾기 힘들지만, 누구나 쉽게 얼굴 매칭을 수행해 보기에 이만큼 간편한 SDK가 없다는 생각이 듭니다. 혹시 라이브러리 사용에 궁금한 점이 있다면 언제든지 질문 남겨주시기 바랍니다
감사합니다 :)
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[4기 전주 김재호] 안드로이드 소프트웨어 키보드#5 - 조합 (0) | 2013.12.05 |
---|---|
[4기 전주 김재호] 안드로이드 소프트웨어 키보드#4 - 이벤트 처리 (0) | 2013.12.05 |
[4기 대구 박병권] MySQL 데이터베이스 백업 및 복원 (2) | 2013.12.05 |
[4기 부산 오세빈] Meemoo!! (0) | 2013.12.05 |
[4기 부산 오세빈] 휴대폰은 어떻게 채널을 할당 받을까?! part 2/2 (0) | 2013.12.05 |