TensorflowをiOSで試してみた　その２

まずは、Tensorflowで用意されているサンプルを動かしてみるところから始めたかったのですが。

ビルドの時に、OSのアップデートの関係の問題が起こっているようで(2016/10/13)、詰まってしまったので、うまくできた方法を記述します。

以下、参考にしたページ
Tensorflowのビルド
[TensorFlowにiOSサポートが追加されたそうなので試してみた](http://qiita.com/shu223/items/ce190ea6669b2636a8a7#%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9)
[Tensorflow iOS Examples](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/ios_examples/)

ビルドエラーの解決
[Building TensorFlow for iOS failed on macOS Sierra and xCode 8.0 #4640](https://github.com/tensorflow/tensorflow/issues/4640)
[Temporary workaround for ios examples on macOS Sierra. Works on devic…](https://github.com/alphamule/tensorflow/commit/672da4fef637c5511fd2cf78a4ac8e710d0efbda?diff=split)

##アプリをビルドする

まず、[github](https://github.com/tensorflow/tensorflow)からソースコードをダウンロードします。


ソースを置いた場所に移動してから、シェルスクリプトを実行して、必要な依存ライブラリを取得します。

```ruby:command
cd tensorflow-master
tensorflow/contrib/makefile/download_dependencies.sh
```

protobufをインストール

```ruby:command
cd tensorflow/contrib/makefile/downloads/protobuf/
./autogen.sh
./configure
make
sudo make install
```

ここで、macOS sierra, Xcode8環境下でサンプルを動かしたい方は、
``compile_ios_protobuf.sh``
``compile_ios_tensorflow.sh``
に少し修正を加える必要があります。

まず、``compile_ios_protobuf.sh``に修正を加えます。
（tensorflow/contrib/makefile の下にあります）

```ruby:compile_ios_protobuf.sh
make -j ${JOBS_COUNT}
make install

#make distclean
#./configure \
#--build=x86_64-apple-${OSX_VERSION} \
#--host=x86_64-apple-${OSX_VERSION} \
#--disable-shared \
#--enable-cross-compile \
#--with-protoc="${PROTOC_PATH}" \
#--prefix=${LIBDIR}/iossim_x86_64 \
#--exec-prefix=${LIBDIR}/iossim_x86_64 \
#"CFLAGS=${CFLAGS} \
#-mios-simulator-version-min=${MIN_SDK_VERSION} \
#-arch x86_64 \
#-isysroot ${IPHONESIMULATOR_SYSROOT}" \
#"CXX=${CXX}" \
#"CXXFLAGS=${CXXFLAGS} \
#-mios-simulator-version-min=${MIN_SDK_VERSION} \
#-arch x86_64 \
#-isysroot \
#${IPHONESIMULATOR_SYSROOT}" \
#LDFLAGS="-arch x86_64 \
#-mios-simulator-version-min=${MIN_SDK_VERSION} \
#${LDFLAGS} \
#-L${IPHONESIMULATOR_SYSROOT}/usr/lib/ \
#-L${IPHONESIMULATOR_SYSROOT}/usr/lib/system" \
#"LIBS=${LIBS}"
#make -j ${JOBS_COUNT}
#make install

make distclean
./configure \

```

まず、上記のように、**100行目から126行目までを全てコメントアウト**します。



```ruby:compile_ios_protobuf.sh
lipo \
${LIBDIR}/iossim_386/lib/libprotobuf.a \
${LIBDIR}/ios_arm7/lib/libprotobuf.a \
${LIBDIR}/ios_arm7s/lib/libprotobuf.a \
${LIBDIR}/ios_arm64/lib/libprotobuf.a \
-create \
-output ${LIBDIR}/libprotobuf.a
```

続いて、**201行目を削除**し（コメントアウトではなく！）、上記のコードと同じにします。




```ruby:compile_ios_protobuf.sh
lipo \
${LIBDIR}/iossim_386/lib/libprotobuf-lite.a \
${LIBDIR}/ios_arm7/lib/libprotobuf-lite.a \
${LIBDIR}/ios_arm7s/lib/libprotobuf-lite.a \
${LIBDIR}/ios_arm64/lib/libprotobuf-lite.a \
-create \
-output ${LIBDIR}/libprotobuf-lite.a
```

最後に、**210行目を削除**し（コメントアウトではなく！）、上記と同じコードにします。

これで、``compile_ios_protobuf.sh``の修正は終了です。
続いて、``compile_ios_tensorflow.sh``を修正します。

```ruby:compile_ios_tensorflow.sh
  exit 1
fi

#make -f tensorflow/contrib/makefile/Makefile \
#TARGET=IOS IOS_ARCH=X86_64 LIB_NAME=${LIB_PREFIX}-x86_64.a OPTFLAGS="$1" $2 $3
#if [ $? -ne 0 ]
#then
# echo "x86_64 compilation failed."
# exit 1
#fi

lipo \
${LIBDIR}/ios_ARMV7/${LIB_PREFIX}-armv7.a \
```

上記のように、**75行目から81行目までをコメントアウト**する。

```ruby:compile_ios_tensorflow.sh
lipo \
${LIBDIR}/ios_ARMV7/${LIB_PREFIX}-armv7.a \
${LIBDIR}/ios_ARMV7S/${LIB_PREFIX}-armv7s.a \
${LIBDIR}/ios_ARM64/${LIB_PREFIX}-arm64.a \
${LIBDIR}/ios_I386/${LIB_PREFIX}-i386.a \
-create \
-output ${LIBDIR}/${LIB_PREFIX}.a

```

続いて、**88行目を削除**し、上記のコードになるようにします。

以上で修正は終了です。

iOS用のビルドを開始します。

```ruby:command
cd ../../../../..
tensorflow/contrib/makefile/compile_ios_protobuf.sh
```

最後に以下のコマンドを実行します。

```ruby:command
tensorflow/contrib/makefile/compile_ios_tensorflow.sh
```


#実機で動かしてみる
用意されているサンプルは二つです。
``tensorflow/contrib/ios_examples``にあります。
cameraアプリ： カメラに写っているものが何なのか判断しています。
simpleアプリ：　アプリの中に入っている画像がどんな画像か判断しています。（写真変更は、アプリからは不可）

両方とも、[inception v1](https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip)のデータをダウンロードし、アプリに追加する必要があります。``data``フォルダの配下におきます。

cameraアプリ動作
<img width="375" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/68056/70dbfb96-6c3e-2155-5914-17f837d6b7d0.png">



ちなみに、Pepperのうなだれている格好は"Hand Blower"として認識されました。
<img width="375" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/68056/f87f0314-1ee2-6a10-4213-26af0b4bf038.png">


Hand Blowerとは、こんなものでした。似ているような。似ていないような。
![3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/68056/a65bf15b-c95f-74da-c5d7-531fd19ff914.jpeg)


simpleアプリ動作
<img width="375" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/68056/5b93a9d5-bfcc-3371-c9d4-85fdb2204657.png">

以下のおじさんの写真を見て、どんなものか判断しています。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/68056/3a6c698e-7d7d-6ebc-a72c-6d4760e30d8e.png)

このおじさんがどのように判断されたかというと...
47% 　military uniform
12% 　mortarboard
10% 　academic gown
でした。