brunch

You can make anything
by writing

C.S.Lewis

by 이승현 May 21. 2018

ML Kit for Firebase

Image Labeling

ML Kit for Firebase


Keynote를 통해서 구글의 전반적인 머신 러닝 기술들을 Android나 iOS 모바일 개발자들이 이용할 수 있도록 ML Kit라는 새로운 Firebase 도구를 공개했습니다.


Keynote 내내 AI와 머신 러닝 기술들을 결합한 자사 서비스에 대한 내용이 주를 이뤘는데, 그에 따른 새로운 모바일 SDK입니다.


#01 ML Kit


이미지에서 텍스트, 얼굴, 바코드, 라벨, 랜드마크를 인식하거나 TensorFlow를 이용한 커스텀하게 이용할 수 있는 API들을 제공하고 있습니다.


서버나 클라우드가 아닌, 클라이언트(Android, iOS) 레벨에서도 가볍게 머신 러닝 기술들을 이용할 수 있다는 점에서 다양한 활용법이 있을 거 같습니다.


#02 APIs


디바이스나 클라우드에서 이용할 수 있는 API가 제한되어 있는데, Image labeling이라는 API를 이용해서 데모 코드를 작성해 보겠습니다.


#03 on-device and Cloud




Image Labeling


ML Kit의 Image Labeling API를 이용해서 추가적인 metadata 없이도, 이미지의 entity를 인식할 수 있습니다.

즉, 인물, 사물, 장소, 활동 등을 인식할 수 있습니다.


#04 Image Labeling


머신 러닝 이전에는 크고 복잡한 규칙들을 이용해서, 이미지에서 entity들을 인식(계산)하고 있었습니다.

정확성은 규칙에 따라 상이하겠지만 무엇보다 이런 방법은 시간이 많이 걸리는 문제가 있습니다.


ML Kit의 Image Labeling API를 이용하면 알고리즘이 데이터를 기반으로 entity들을 인식(예측)하고 있습니다.

아래와 같이 정확성도 뛰어나고 시간도 덜 걸린다는 장점이 있습니다.

머신 러닝은 학습에 시간이 오래 걸리지, 예측하는 데는 시간이 오래 걸리지 않습니다.


#05 Accuracy




On-device


Image Labeling API는 디바이스와 클라우드로 나눠서 이용할 수 있습니다.

400개 이상만 인식하는 디바이스 API와는 달리 클라우드에서는 10,000개 이상을 인식하고 있습니다.

대신 유료네요...


디바이스 API를 이용해서 구현해 보겠습니다.


#06 on-device and Cloud




#01 Firebase 시작


아래 절차에 따라 Firebase를 시작합니다.

https://firebase.google.com/docs/android/setup




#02 ML Kit 연동


아래 절차에 따라 연동을 시작합니다.

https://firebase.google.com/docs/ml-kit/android/label-images


#07 app.gradle
#08 AndroidManifest.xml




#03 FirebaseVisionImage 생성


Image Labeling을 이용하기 위해 FirebaseVisionImage 객체를 생성해야 합니다.

Bitmap, File 경로, ByteArray, ByteBuffer, media.Image를 이용해서 만들 수 있습니다.


#09 FirebaseVisionImage




#04 FirebaseVisionLabelDetector 생성


이미지에서 FirebaseVisionLabel을 얻기 위해 FirebaseVisionLabelDetector 객체를 생성해야 합니다.


#10 FirebaseVisionLabelDetector


FirebaseVisionLabelDetectorOptions 객체를 통해 option을 설정할 수 있는데, 현재는 인식한 entity의 기본 정확성(confidence)을 설정할 수 있는 setConfidenceThreshold밖에 없습니다. 

0에서 1까지의 float 값으로, 1에 가까울수록 정확성이 높다는 의미입니다.

 

#11 FirebaseVisionLabelDetectorOptions




#05 FirebaseVisionLabel


리스너를 등록해 FirebaseVisionLabel을 얻어 올 수 있습니다.


#12 FirebaseVisionLabel


text와 entityId에 대한 정보는 아래 링크에서 볼 수 있습니다.

confidence는 0부터 1까지의 float 값으로 얻어온 이미지 entity의 정확성을 판단할 수 있습니다.


https://developers.google.com/knowledge-graph/




Result


아래 이미지를 디바이스 API를 이용해서 인식해 봤습니다.


text : Petal
confidence : 0.8117233
entityId : /m/016q19

text : Flower
confidence : 0.7630369
entityId : /m/0c9ph5


꽃잎(Petal)과 꽃(Flower)을 인식했는데 각각 81.17233%, 76.30369%의 정확성을 가지고 있습니다.

FirebaseVisionLabelDetectorOptions.setConfidenceThreshold(0.75f) 메서드를 통해 75% 이상의 정확성을 가진 결과만 얻었습니다.


5.25KB(242*136) 이미지 기준으로 처리 시간이 171 milliseconds가 걸렸습니다.

이미지 크기나 종류, 디바이스 상태에 따라 다르겠지만 다른 머신 러닝을 써본 적이 없어서 이게 빠른지 느린지 잘 모르겠네요.


#13 time




클라우드 API를 이용한 결과도 볼 수 있습니다.

디바이스 API와 같은 이미지인데도 결과가 조금 다르고, 인식하는 entity의 종류도 다양합니다.


https://cloud.google.com/vision/docs/drag-and-drop


#14 Cloud API




POOQ


자사 서비스인 POOQ에도 한번 적용해봤습니다.

영상의 entity들을 인식해서 해당 영상의 특징? 들을 살펴보려고 했습니다.


#15 POOQ


1. VOD 콘텐츠 재생

2. 백그라운드에서 재생 화면을 n초 단위로 이미지로 만듦

(Image Labeling은 영상이 아닌 이미지만 인식할 수 있습니다.)

3. 이미지들을 Image Labeling을 통해 인식

4. 인식한 결과들의 count를 리스트 형태로 보여줌

News 96
Screenshot 91
Mouth 79
Product 32
Muscle 28
Glasses 20
...


약 500개의 5.25KB(242*136) 이미지들을 인식했는데, 시간이 엄청 오래 걸리네요...

미우새 영상의 결과를 보니 김종국 때문인가 Muscle이 28번이나 인식된 거 같습니다.


도시 어부는 아래와 같이 나왔습니다.

낚시 프로라 그런지 보트가 많이 나왔네요.

Vehicle 168
Boat 99
Mouth 64
Team 56
Poster 40
Jacket 23
...


개밥 주는 남자는 아래와 같이 나왔습니다.

Dog 118
Leisure 37
Pet 35
Mouth 31
Cat 23
...


영상 전체를 클라이언트 레벨에서 Image Labeling으로 분석하기에는 시간이 오래 걸려서 좋지 않은 거 같습니다.

화면 하나하나 단위나 좀 더 좁은 범위에서 이용한다면 효율적으로 Image Labeling을 이용할 수 있을 거 같습니다.




이번에 추가된 ML Kit에는 Image Labeling 뿐만 아니라 텍스트, 랜드마크, 얼굴 감지 API도 있는데, 디바이스에서 무료로 쓸 수 있는 기능은 아직 한계가 있네요.

ex) 텍스트는 영어만 인식


카메라를 이용한 앱에서는 활용 분야가 많을 거 같지만, 그 외의 앱에서는 주로 이용하는 콘텐츠에 대한 분석이나 특정 콘텐츠들을 분류하는 실험실 같은 서브 기능에는 한번 써 볼만 한 거 같습니다.


그리고 조만간 새로운 API들(Smart Reply API 등)이 나올 예정이라고 하니, 주의 깊게 지켜보면 좋을 거 같습니다.



매거진의 이전글 Google I/O 2018
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari