본문 바로가기

OnePIC (Android App)/사진 편집 기능

[얼굴 감지] MLKit를 활용한 얼굴 감지

반응형

 
안드로이드 카메라 애플리케이션 OnePIC을 만들면서 필자가 겪었던 어려움들과 깨달음들에 대해서 포스팅 해보려고 한다.
 
이번 포스팅은 얼굴 감지를 하기 위해 시도한 여러가지 기술(API)들에 대해서 설명하고 결론적으로 선택한 얼굴 감지 API인 MLKit에 대해 설명하고자 한다. 
 


Face Detection 을 할 수 있는 기술 (예상 + 조사)

기술실행 결과 및 예상가능성
TensorFlow Liteface 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가지 존재한다.

 

  1. Unbundled (번들하지 않음) : Google Play Service를 통해 모델을 다운 및 관리 
    • 더 작은 앱 크기, Google Play에 의해 자동 모델 업데이트를 원하면 Unbundled 권고
  2. Bundled (번들) : 빌드 시 앱에 정적으로 모델 연결
    • 앱 설치 후 즉시 기능 사용 가능 , 네트워크 연결 없이 기능 작동을 원한다면 Bundled 권고
  3. Dynamically downloaded (동적 다운로드) : 요청 시 모델 다운로드

 

추가 정보

 

 UnbundledBundledDynamically 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 
        // ... 
	}

 

반응형