Android Things : TensorFlow 예제


Android Things 홈페이지의 글만 번역을 하다가 너무 지루해서 예제 하나를 돌려보기로 했다.
기왕지사 돌리는 것, 조금은 있어보이는 것으로 돌려보자 하고 TensorFlow 예제를 돌려보기로 했다.
뭐, 내가 하는 일이 늘 그렇듯이 한번에 잘 되지는 않았다. 몇가지 실수와 실행 결과를 살펴보도록 하겠다.


TensorFlow 예제를 위한 준비


Android Thinsg의 TensorFlow 예제는 다음 링크에서 다운로드 받을 수 있다.


https://github.com/androidthings/sample-tensorflow-imageclassifier


이 예제는 대기 상태에서 LED가 점등되고 버튼을 누르면 카메라로 이미지를 촬영하여 촬영된 이미지를
TensorFlow의 모델로 전달하게 된다. 그러면 TensorFlow에서 이 이미지를 분석하여 그 결과를 logcat이나
모니터가 연결된 경우 모니터로 출력으 해주는 것이다. 스피커가 연결된 경우 결과 문자열을 읽어(text-to-speech)
스피커로도 출력을 해주나 이 부분은 성공하지 못했다.


그밖의 준비사항 및 회로 연결은 위 링크를 참고하시기 바란다.


기본적으로 라즈베리 파이3에 Android Things를 설치한 상태여야 하며 Android Studio에서 인식할 수 있도록
개발PC와 USB로 연결이 되어있어야 한다. 물론 TensorFlow 예제 실행을 위해 네트워크도 연결이 되어있어야 한다.
로그캣으로도 결과를 확인할 수 있다고는 하나 모니터가 연결된 경우 촬영된 이미지와 함께 결과 분석을 함께 볼 수
있어 더 좋다.


몇가지 실수


우선 회로를 구성할 때 사용한 빵판이 미니 빵판으로 전원부가 별도로 없는 빵판이었다. 그 생각을 미처 못하고 전원과
GND를 가로로 나란히 연결했다가 몽창 태워먹을 뻔했다…-.- 다행히 예전에 4족보행 로봇 만들 때 짧게 잘라놓은
기존 빵판의 전원부 조각이 있어서 이를 이용하여 전원을 연결하였더니 정상적으로 회로가 작동하였다.


다음으로 발생한 문제는 Android Studio를 통해 정상적으로 앱을 설치하였는데 대략 다음과 같은 오류가 발생을
하였다.

05-20 17:48:47.254 1771-1771/com.example.androidthings.button E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.androidthings.button, PID: 1771
java.lang.IllegalAccessError: Method 'void com.google.android.things.userdriver.InputDriver$Builder.<init>(int)' is inaccessible to class 'com.google.android.things.contrib.driver.button.ButtonInputDriver' (declaration of 'com.google.android.things.contrib.driver.button.ButtonInputDriver' appears in /data/app/com.example.androidthings.button-1/base.apk)
   at com.google.android.things.contrib.driver.button.ButtonInputDriver.build(ButtonInputDriver.java:98)
   at com.google.android.things.contrib.driver.button.ButtonInputDriver.register(ButtonInputDriver.java:82)
   at com.example.androidthings.button.ButtonActivity.onCreate(ButtonActivity.java:64)
   at android.app.Activity.performCreate(Activity.java:6662)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
   at android.app.ActivityThread.-wrap12(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6077)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)


이 문제는 아래 링크에서 확인할 수 있엇는데 결론은 Android Things Developer Preview의 최신 버전을 
사용하라는 것이었다(링크한 페이지에서는 DP4 버전이 언급되어있지만 현재 최종 버전은 DP4.1 이다).


https://github.com/androidthings/sample-button/issues/1


여기까지 다 조치를 하였고 이제 세 번째 문제에 봉착을 하게 된다. 바로 아래와 같은 오류가 발생한 것이다.

Android things Cannot capture image. Camera not initialized.


내용을 보면 알겠지만 카메라를 사용할 수 없다는 메시지였다. 확인해보니 카메라를 라즈베리파이에 연결하는데
뒤집어서 연결을 하였다. 접촉 핀이 있는 부분이 랜 포트 반대 방향으로 향해야 하는데 랜포트 방향으로
꽂아버렸던 것이다. 암튼 간단하게 바로 꽂아서 이 부분도 통과~


그리고 드디어 Run!!!


TesorFlow 샘플 실행


우선 처음 실행을 하게 되면 다음과 같이 2단계의 승인 과정을 거치게 된다.


모두 Allow를 선택하면 아래 이미지와 같은 상태로 stand by하게 된다. 이 상태에서 회로도에 있는 푸시 버튼을
클릭하게 되면 LED가 잠깐 꺼지고 카메라 촬영이 진행되며 모니터에 촬영된 이미지와 함께 분석 내용이 파란 
영역에 표시된다.


간단하게 책상 위에 이것 저것 놓고 촬영을 해보았는데 결과는 영 신통치 않다. 일단 카메라가 8MP로 해상도가 낮아
결과물의 품질도 좋지 않고 그래서 그런지 제대로 맞추는 것이 없다…-.- 이 예제의 소개에 보면 예제에 쓰인
TesorFlow의 학습이 Google의 시작 모델을 통해 이루어졌다는 것으로 봐서 초기 제품의 한계라고 봐야 할 것
같다.


가장 충격적인 사실은 내가 샤워 캡을 닮았다는 것이다…ㅠ.ㅠ


테스트 결과는 아래와 같다.


몇가지 팁


사실상 Android Things 플랫폼을 설치해보고 실제로 응용 앱은 처음 설치를 해보았다.
그러다보니 이 설치된 앱을 어떻게 종료하거나 실행시키는지 또는 어떻게 삭제하는지를 전혀 몰랐다.
그래서 간단하게 구글링한 결과를 정리한다.


  • 앱 종료 : 만일 키보드가 연결되어있다면 esc 키를 누르면 앱이 종료된다. 커맨드라인 상에서는 다음과 같이
    명령어를 입력한다.
    adb shell am force-stop <package-name>
    		
  • 앱 실행 : 커맨드라인에 다음과 같이 입력한다(TesorFlow 예제 기준).
    adb shell am start -n com.example.androidthings.imageclassifier/.ImageClassifierActivity
    		
  • 앱 삭제 : 커맨드라인에 다음과 같이 입력한다.
    adb uninstall <package name>
    		


일단 이정도만으로도 기본적인 사용은 가능하다.


정리


아직 소스는 분석해보지 않았고 그냥 라즈베리파이에 앱을 설치해서 기동해본 것 뿐이다. 개발자가 직접
학습을 진행할 수 있는지 등의 여부는 아직 확인을 못했다. 일단 이 첫 결과만 놓고 보면 아직은 갈 길이
멀다는 생각이 든다. 시간 나는대로 소스도 좀 들여다 봐야 할 것 같다. 그래도 심심풀이 땅콩으로는 꽤
괜찮았다.





블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요