안드로이드 카메라 애플리케이션 OnePIC을 만들면서 필자가 겪었던 어려움들과 깨달음들에 대해서 포스팅 해보려고 한다.
이번 포스팅은 얼굴 감지를 하기 위해 시도한 여러가지 기술(API)들에 대해서 설명하고 결론적으로 선택한 얼굴 감지 API인 MLKit에 대해 설명하고자 한다.
Face Detection 을 할 수 있는 기술 (예상 + 조사)
기술 | 실행 결과 및 예상 | 가능성 |
TensorFlow Lite | face Detection(얼굴 감지) 모델만 찾을 수 있으면, 객체 감지 코드에 모델만 바꾸면 되서 코드 수정 필요 없음. 하지만 얼굴 감지 모델이 찾아지지 않아 직접 모델을 학습시켜야할 것 같음 | X |
OpenCV - Haar Cascade : 머신러닝 기반의 오브젝트 검출 알고리즘 | → 얼굴인식으로 잘 사용되는 기술 (CoMirror 얼굴인식도 이를 사용) 사각형 영역으로 구성되는 특징을 사용하기 때문에 픽셀을 직접 사용할 때보다 동작속도가 빠름 하지만, 얼굴 인식 측면에서 Google FaceTracker가 더 좋으므로 제외 (참고 : https://brunch.co.kr/@mystoryg/77) | △ |
Google FaceTracker | 더 이상 사용되지 않는 라이브러리 사용 불가능 공식 문서를 찾아보는데 해당 기능이 지원 중단되어 더이상 유지보수하지 않음 이 기능이 ML Kit 라이브러리에 포함된듯 함 ![]() | X |
ML Kit : 구글에서 제공하는 모바일 애플리케이션 개발을 위한 머신러닝 SDK | 머신러닝 모델을 애플리케이션에 통합할 수 있으며, 얼굴 인식, 텍스트 감지, 물체 추적 등 다양한 머신러닝 기능을 제공 + 예제도 많고, 실시간 얼굴 인식도 가능, 자료도 많고, 얼굴인식 option도 다양 ⇒ ML Kit 이용 결정 | O |
ML Kit 주요 기능
- 얼굴 특징 인식 및 찾기 → 일단 해당 기능만 사용
: 감지된 모든 얼굴의 눈, 귀, 뺨, 코, 입의 좌표를 가져옵니다. - 얼굴 특징의 윤곽 가져오기
: 감지된 얼굴과 눈, 눈썹, 입술, 코의 윤곽을 가져옵니다. - 얼굴 표정 인식
: 사람이 웃고 있는지 눈을 감고 있는지 판단합니다. - 비디오 프레임 전체에서 얼굴을 추적합니다.
: 각각의 고유한 감지된 얼굴에 대한 식별자를 가져옵니다. 식별자는 모든 호출에서 일관되므로 비디오 스트림의 특정 인물에 대해 이미지 조작을 수행할 수 있습니다. - 실시간으로 비디오 프레임 처리
: 얼굴 인식은 장치에서 수행되며 비디오 조작과 같은 실시간 애플리케이션에 사용할 수 있을 만큼 빠릅니다.
MLKit API 얼굴 감지 관련 모델 설치 방법
Android의 ML Kit 모델 설치 경로 | Google for Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English Android의 ML Kit 모델 설치 경로 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 기본적으로
developers.google.com
모든 MLKit 기능은 Google-trained machine learning models(기본 모델)을 이용한다.
이들의 경우는 API 모델 다운로드 사용법이 3가지 존재한다.
- Unbundled (번들하지 않음) : Google Play Service를 통해 모델을 다운 및 관리
- 더 작은 앱 크기, Google Play에 의해 자동 모델 업데이트를 원하면 Unbundled 권고
- Bundled (번들) : 빌드 시 앱에 정적으로 모델 연결
- 앱 설치 후 즉시 기능 사용 가능 , 네트워크 연결 없이 기능 작동을 원한다면 Bundled 권고
- Dynamically downloaded (동적 다운로드) : 요청 시 모델 다운로드
추가 정보
Unbundled | Bundled | Dynamically downloaded | |
모델 저장 위치 | Google Play 서비스에 상주하며 이 앱에서 사용하는 저장용량에 포함 X | 설치 후 앱별 저장소에 저장됨 | 모델 다운로드 후 앱별 저장소에 저장됨 |
앱 크기에 영향 | 앱 크기에 영향을 미치지 않음 | 앱 크기에 직접 기여 | 앱 크기에 영향을 미치지 않지만 앱별 저장소는 증가 |
모델 언제 업데이트 | 최신 버전이 출시되면 자동 업데이트 | 모델을 업데이트하려면 앱을 업데이트해야 함 | 모델을 업데이트하려면 앱을 업데이트해야 함 |
모델은 언제 다운로드 | 사용 전에 모델을 다운로드해야 함 | 앱 설치 시 모든 모델과 기능이 포함되므로 즉시 사용 가능 | 모델 다운로드, 업데이트,삭제는 RemoteModelManager API를 사용하여 수동으로 관리 |
모델 기기에서 언제 삭제 | 모델에 종속된 모든 앱이 제거된 경우에만 스토리지에서 모델 삭제 | 앱이 제거되면 앱별 저장소에서 모델이 삭제 | 앱이 제거되면 앱별 저장소에서 삭제 |
이 중에서 Face Detection일 경우, (1 :Unbundled), (2 :Bundled) 모델 다운로드 사용법만 이용 가능하다.
그래서 고민 끝에 우리는 앱 설치 후 기능 즉시 사용이 더 중요시 하기 때문에 Bundled 사용하기로 결정
BUT !
실행 결과 Bundled 모델이 Unbundled 모델보다 부정확 했다. → 그래서 그냥 Unbundled 모델 사용하기로 결정
MLKit API 얼굴 감지 관련 모델 설치 방법
1. face detector 설정
Android에서 ML Kit를 사용하여 얼굴 인식 | Google for Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English Android에서 ML Kit를 사용하여 얼굴 인식 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. ML
developers.google.com
faceDetectorOption함수를 이용하여 얼굴 인식을 윙한 분류 방식(option)에 변화를 줄 수 있음
다음과 같이 다양한 option들이 있다.

옵션 설정 코드는 다음과 같다.
val highAccuracyOpts = FaceDetectorOptions.Builder()
.setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_ACCURATE)
.setLandmarkMode(FaceDetectorOptions.LANDMARK_MODE_ALL)
.setClassificationMode(FaceDetectorOptions.CLASSIFICATION_MODE_ALL)
.build()
2. input Image 준비
InputImage | ML Kit | Google for Developers
InputImage Stay organized with collections Save and categorize content based on your preferences. Represents an image object. Nested Class Summary @interface InputImage.ImageFormat Accepted image format of vision APIs. Constant Summary Public Method Summ
developers.google.com
이미지에서 얼굴을 감지하려면, Input Image(Vision API의 허용되는 이미지 형식)로 변환해주어야함
- media Image, URI, ByteBuffer/ByteArray, Bitmap 이용해서 Input Image 제작 가능

3. FaceDetector 인스턴스 가져오기
val detector = FaceDetection.getClient(options)
4. 이미지 처리
val result = detector.process(image)
.addOnSuccessListener { faces ->
// Task completed successfully
// ...
}
.addOnFailureListener { e ->
// Task failed with an exception
// ...
}
'OnePIC (Android App) > 사진 편집 기능' 카테고리의 다른 글
Segmentation 이란? (0) | 2024.01.23 |
---|---|
[얼굴 변경 :Face Blending] 얼굴 잘라서 사진 위에 합성 (2) | 2023.12.26 |
[얼굴 변경 :Face Blending] 두 사진에서 동일 얼굴 찾기 (0) | 2023.12.26 |
[객체 감지] TensorFlow Lite(Android) 이용해서 객체 감지 (1) | 2023.12.20 |
[객체 감지] 공공 AI API 이용해서 객체 감지 (0) | 2023.12.20 |