Edited at

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

More than 1 year has passed since last update.

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

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

以下、参考にしたページ

Tensorflowのビルド

TensorFlowにiOSサポートが追加されたそうなので試してみた

Tensorflow iOS Examples

ビルドエラーの解決

Building TensorFlow for iOS failed on macOS Sierra and xCode 8.0 #4640

Temporary workaround for ios examples on macOS Sierra. Works on devic…


アプリをビルドする

まず、githubからソースコードをダウンロードします。

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


command

cd tensorflow-master

tensorflow/contrib/makefile/download_dependencies.sh

protobufをインストール


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 の下にあります)


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行目までを全てコメントアウトします。


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行目を削除し(コメントアウトではなく!)、上記のコードと同じにします。


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を修正します。


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行目までをコメントアウトする。


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用のビルドを開始します。


command

cd ../../../../..

tensorflow/contrib/makefile/compile_ios_protobuf.sh

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


command

tensorflow/contrib/makefile/compile_ios_tensorflow.sh



実機で動かしてみる

用意されているサンプルは二つです。

tensorflow/contrib/ios_examplesにあります。

cameraアプリ: カメラに写っているものが何なのか判断しています。

simpleアプリ: アプリの中に入っている画像がどんな画像か判断しています。(写真変更は、アプリからは不可)

両方とも、inception v1のデータをダウンロードし、アプリに追加する必要があります。dataフォルダの配下におきます。

cameraアプリ動作

1.png

ちなみに、Pepperのうなだれている格好は"Hand Blower"として認識されました。

2.png

Hand Blowerとは、こんなものでした。似ているような。似ていないような。

3.jpeg

simpleアプリ動作

4.png

以下のおじさんの写真を見て、どんなものか判断しています。

5.png

このおじさんがどのように判断されたかというと...

47%  military uniform

12%  mortarboard

10%  academic gown

でした。