안드로이드 스튜디오

5.7 TensorFlow.Lite Mobile IOT MNIST APP 코드 예제

coding art 2020. 4. 8. 21:37
728x90

 

구글 홈페이지에서 제공하는 TensorFlow Lite Mobile IOT Kotlin 예제 Digit Classifier 가 아닌 유사한 Java 예제를 살펴보자. 출처는 다음과 같다.

MNIST with TensorFlow Lite on Android

https://github.com/nex3z/tflite-mnist-android

스텝1 다운받아서 압축을 해제하고 사용자들에게 코드 내용 파악 차원에서 제공된 적절한 지침을 그대로 따라 해 보았더니 성공적으로 실행이 이루어졌다. 주어진 지침의 내용은 이미 Digit Classifier에서 거론 했듯이 TensorFlow에서 학습 결과물인 mnist.tflite 파일을 assets 폴더에 넣고 아울러 build.gradle(Module.app)에서 다음과 같은 내용을 확인하는 정도이다. 거의 같은 내용으로 볼 수 있다.

스텝2 activity_main.xml에서 Default 레이아웃을 살펴보자. TableLayout 이 사용되는데 이는 HTML Table과 비슷한 용법인 듯하다. 손 글씨를 써넣기 위한 드로우잉 공간은 com.nex3z.fingerpaintview.FingerPaintView 에 의해 200dp X 200dp로 설정된다. 개별 앱별로 사용하는 드로우잉 라이브러리가 다른 듯하다. DIgit Classifier 에서는 com.divyanshu.draw.widget.DrawView가 사용되었으며 DrawingFun 사례에서는 com.example.drawingfun.DrawingView가 사용되었다.

스탭3 MainActivity 헤더 영역에 import 되는 라이브러리를 살펴보자. 최근의 안드로이드 스튜디오에서는 androidx.appcompat.AppCompatActivity가 주로 사용되나 그래픽 지원을 위한 com.nex3z.finger∙∙∙ 때문에 구 버전으로 보이는android.support.v7.app.AppCompatActivity이 사용되고 있다.

한편 버터나이프(Butter Knife) 라이브러리는 작고 간단하며 경량화 특성이 있어 개발자에게 아주 도움이 된다. 임의의 오브젝트, views OnClickListener를 대상으로 유용한 코드 작성을 가능케 해준다. 예를 들면 findViewById@Bind()로 그리고 setonClickListener에 의한 call들을 @onClick()으로 대체하여 코드를 클린하고 더욱 이해하기 쉽도록 만들어 준다.

한편 butterKnife 는 외부에서 지원하는 라이브러리이므로 build.gradle(Modeul)dependencies에 그랙 지원 finger-paint-view 및 머신 러닝 지원 tensorflow-lite 와 함께 등록할 필요가 있다.

MainActivy 코드 구조는 비교적 단순한 편이다. @onCreate에 이어 손 글씨 작성 완료 후 detect 버튼 클릭이 OnDetectClick에 의해 검출되면 bitmap 데이터를 ByteBuffer 로 변환하여 Background에서 mnist.tflite에 의해 머신 러닝이 이루어지고 clear버튼이 클릭되면 드로우잉 화면이 초기화되고 다시 손 글씨를 써 넣게 된다. 구글 예제에서는 손 글씨를 쓰고 ACTION_UP 이 캐치되면 인식률이 계산 되었는데 이 예제에서는 ACTION_UP 캐치 작업이 없는 대신 DETECT 버튼을 클릭하는 것으로 대체하였다.

onDetectCkick을 살펴보면 bitmap 데이터를 Bitmap으로 내 보낸 후 클라스 Classifier를 불러 인스턴스를 계산한다.

클래스 Classifier에서 입력 이미지 데이터의 shape 값을 계산하고 Bitmap 입력 데이터를 ByteBuffer 로 변환하여 머신 러닝을 실행한다.

첨부된 코드를 다운하여 압축 해제 후  AndroidStudioProjects 폴더에 넣고 android를 오픈하여 실행해 보자.

android.zip

 

 

 

android.zip
0.49MB