본문 바로가기

지식생활/A.I.

텐서플로우(Tensorflow) 안드로이드 카메라 예제 빌드해보기

## 텐서플로우 안드로이드 카메라 예제 빌드하기


## 텐서플로우 파일 다운로드

$ cd /home/tensorflow

 $ git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git


## 바젤 다운받아서 설치 (스크롤 내려서 버전 맞는거 선택)


# https://github.com/bazelbuild/bazel/releases

 $ chmod +x bazel-0.4.5-installer-linux-x86_64.sh

 $ ./bazel-0.4.5-installer-linux-x86_64.sh --user


## 그럼 bin 폴더가 생성됩니다.

## PATH 를 설정합니다. 

$ vi ~/.bashrc

 $ export PATH:$PATH:/home/tensorflow/bin

 $ source .bashrc


## SDK 설치 (릴리스 노트에서 버전 확인) 26.0.2

https://developer.android.com/studio/index.html


## NDK 설치 (caffe2 있는 내용이라 넘어감)

## 밑에도 설명하지만 현재(2017.05) ndk 12b 이상이면 문제 생길 수 있다고 함


## PATH 확인

/home/tensorflow/tools/bin  # sdk

 /home/tensorflow/android-ndk-r14b # ndk

 /home/tensorflow/bin # bazel



# 빌드

$ cd /home/tensorflow/tensorflow

$ bazel build -c opt //tensorflow/examples/android:tensorflow_demo


## error 발생시 대처 방법

## /home/tensorflow/tensorflow/WORKSPACE sdk랑 ndk 버전에 맞게 수정 필요

ERROR: /home/tensorflow/tensorflow/WORKSPACE:20:1: no such package '@androidsdk//'

: com.google.devtools.build.lib.skyframe.InconsistentFilesystemException: Inconsistent filesystem operations. 

/home/tensorflow/tools/platforms is no longer an existing directory. Did you delete it during the build? The results of the build are not guaranteed to be correct. You should probably run 'blaze clean' and investigate the filesystem inconsistency (likely due to filesytem updates concurrent with the build) and referenced by '//external:android/sdk'.


android_sdk_repository(

    name = "androidsdk",

    api_level = 25,

    build_tools_version = "25.0.2",

    path = "/home/tensorflow/Android/Sdk"

)


## sdk  경로 재설정 

## android-studio 설치해서 실행 (~/Android/Sdk 설정)

## ~/Android/Sdk/platforms 밑에 폴더명으로 버전 예상

 /home/tensorflow/Android/Sdk


ERROR: /home/tensorflow/tensorflow/tensorflow/core/kernels/BUILD:4325:1: 

C++ compilation of rule '//tensorflow/core/kernels:android_tensorflow_kernels' failed: 

clang failed: error executing command 

external/androidndk/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -gcc-toolchain external/androidndk/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 -fpic -ffunction-sections ... (remaining 73 argument(s) skipped): com.google.devtools.build.lib.shell.BadExitStatusException: Process exited with status 1.


## /home/tensorflow/android-ndk-r14b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang

## Android NDK r12b is recommended (higher may cause issues with Bazel) 

## NDK 권장 버전 12b 높을 수록 문제가 있을 수 있다고 함.

NDK URL : http://developer.android.com/ndk/index.html


### WORKSPACE 최종 수정사항

android_sdk_repository(

    name = "androidsdk",

    api_level = 25,

    build_tools_version = "25.0.2",

    path = "/home/tensorflow/Android/Sdk"

)

#

# Android NDK r12b is recommended (higher may cause issues with Bazel)

android_ndk_repository(

    name="androidndk",

    path="/home/tensorflow/android-ndk-r12b",

    api_level=14)

   bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so


## 파일 수정 (선택사항)

$ vi /tensorflow/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java

private static final int INPUT_SIZE = 299;

private static final int IMAGE_MEAN = 128;

private static final float IMAGE_STD = 128;

private static final String INPUT_NAME = "Mul";

private static final String OUTPUT_NAME = "final_result";

private static final String MODEL_FILE = "file:///android_asset/stripped_graph.pb";

private static final String LABEL_FILE = "file:///android_asset/retrained_labels.txt";



## 다시 빌드

$ cd /home/tensorflow/tensorflow

 $ bazel build -c opt //tensorflow/examples/android:tensorflow_demo

## 빌드 완료되면 apk 파일을 찾기 쉬운곳에 복사


## 장치 연결 확인

$ lsusb 

 Bus 002 Device 034: ID 18d1:4e42 Google Inc. Nexus 7 (debug)


## android-studio 설치 폴더 밑에 /home/tensorflow/Android/Sdk/platform-tools 여기로 가서 adb 실행

$ ./adb devices  ## 디바이스 확인

 $ ./adb install -r -g tensorflow_demo.apk

 ## adb 패스설정이 안되어 있으면 절대경로 설정

/home/tensorflow/tensorflow/bazel-bin/tensorflow/examples/android/tensorflow_demo.apk

   

### 디바이스 장치 연결이 안될때

$ adb devices 

????????????    no permissions  ## 이런 문구가 발생하면


## 디바이스 장치 인식시키기

$ vi /etc/udev/rules.d/51-android.rules 

SUBSYSTEM=="usb", ATTR{idVendor}=="1004는", MODE="0666", GROUP="plugdev" 

$ sudo service udev restart

## ATTR은 lsusb로 확인한 부분 작성 

18d1은 google, 

1004는 LG, 

17ef는 Lenovo

## lsusb 명령어가 없다면

$ sudo apt-get install sysinfo

$ sudo apt-get install hardinfo

 

   

### 장치에 설치

$ adb install -r tensorflow_demo.apk   


## 퍼센트 올라가면서 진행됨.

$ adb install -r tensorflow_demo.apk 

adb install -r bazel-bin/tensorflow/examples/android/tensorflow_demo.apk

tensorflow_demo.apk: 1 file pushed. 1.3 MB/s (149700252 bytes in 112.042s)

pkg: /data/local/tmp/tensorflow_demo.apk

Success 


## 업로드가 완료되면 디바이스에 3개의 앱이 생긴다