ailia SDK チュートリアル(C++)
ailia SDKをC++で使用するチュートリアルです。ailia SDKを利用することでC++を使用したディープラーニングの推論をGPUを使用して高速に行うことができます。ailia SDKについて詳しくはこちらをご覧ください。
C++ APIの概要
ailia SDKのコアはC++で実装されており、C++ APIを使用して機械学習モデルをクロスプラットフォームで実行することができます。ailia SDKにはC++から各種のAPIを使用するサンプルが含まれています。以降、サンプルのビルドと実行の方法を解説します。
ライセンスファイルの配置
評価版の場合、Windowsの場合はailia.dllと同じフォルダ、Macの場合は~/Library/SHALO/にライセンスファイルを配置してください。
Macの場合、Finderのメニューの「移動」から、「フォルダの場所を入力」で~/Libraryを指定して移動後、SHALOフォルダを作成し、そこにライセンスファイルを配置します。
ライセンスファイルが存在しない状態でサンプルを実行した場合、エラー(AILIA_STATUS_LICENSE_NOT_FOUND = -20)が発生します。Linux、Jetson、RaspberryPiの場合はライセンスファイルは不要です。
各プラットフォームでのサンプルの実行
Mac
Macで使用するにはXcodeとXcodeコマンドラインツールのインストールが必要です。XcodeはAppStoreから、Xcodeコマンドラインツールは下記のコマンドでインストールします。
xcode-select install
サンプルで使用する機械学習モデルをダウンロードするため、samples/modelsフォルダに移動し、download_model.shを実行します。
ダウンロード前のsamples/modelsフォルダです。
download_model.shをTerminalで実行します。ダウンロード後のsamples/modelsフォルダです。
次に、ailiaのコアライブラリであるlibrary/mac/libailia.dylibとlibrary/mac/libailia_blas.dylibをsamples/cppフォルダにコピーします。
サンプルプログラムでは画像読み込みにOpenCVを使用しています。そこで、brew を使用してOpenCVをインストールします。OpenCVは3と4に対応しています。
brew install opencv
サンプルプログラムでは、/usr/local/libにOpenCVがインストールされていることを期待していますが、環境によっては異なるパスにインストールされ、下記のようなエラーが出ることがあります。
clang: error: no such file or directory: ‘/usr/local/lib/libopencv_core.dylib’
clang: error: no such file or directory: ‘/usr/local/lib/libopencv_imgproc.dylib’
clang: error: no such file or directory: ‘/usr/local/lib/libopencv_imgcodecs.dylib’
その場合、下記のコマンドでOpenCVのパスを調べて、Makefileに記載されているパスを書き換えてください。
find / -name=”opencv*”
例えば、/usr/local/Cellar/opencv/4.2.0_1にOpenCVが見つかった場合は、Makefileの内容を下記のように書き換えます。
samples/cppフォルダで下記のコマンドを実行してビルドします。
export OSTYPE=Mac
make
makeに成功すると下記のようになります。
下記のコマンドで物体識別を実行します。
./ailia_classifier ../images/clock.jpg
実行結果は下記となります。
Prototxt : ../models/keras-vgg16/VGG16.prototxt
Caffemodel : ../models/keras-vgg16/VGG16.caffemodel
ColorRange : 1
ColorFormat : 0
Prob : 0.773837 Class : analog clock
Prob : 0.179676 Class : wall clock
Prob : 0.030096 Class : stopwatch, stop watch
Prob : 0.005507 Class : barometer
Prob : 0.002026 Class : magnetic compass
Windows
Windowsで使用するにはVisual Studio 2015以降とgnumakeのインストールが必要です。
Visual Studioは下記からダウンロードしてインストールしてください。
gnumakeは下記からダウンロードして下さい。DownloadからComplete package, except sourcesのSetupをインストールした後、環境変数(Path)にインストール先のbinを登録し、コマンドプロンプトからmakeで実行できることを確認してください。
サンプルで使用する機械学習モデルをダウンロードするため、samples/modelsフォルダのdownload_model.batを実行します。
次に、samples/cppフォルダにlibrary/windows/x64ファイルにあるdllとlibをコピーします。
Windowsの場合は、GDI+経由で画像を読み込むため、OpenCVのインストールは不要です。
VS2015 x64 NativeTools コマンドプロンプトを起動して、samples/cppフォルダに移動します。
下記のコマンドでビルドを行います。
set OSTYPE=Windows
make
下記のコマンドで物体識別を実行します。
./ailia_classifier.exe ../images/clock.jpg
Linux
Linuxではclangを使用します。ailia SDKの推奨環境であるUbuntu 18.04LTSではclangは標準でインストールされています。
ailia SDKのサンプルの実行にはOpenCVとunzipが必要なため、下記のコマンドでインストールします。
apt install libopencv-dev
apt install unzip
samples/modelsフォルダのdownload_model.shを実行します。
./download_model.sh
samples/cppフォルダにlibrary/linuxフォルダのsoをコピーします。
samples/cppフォルダでexport OSTYPE=Linuxを実行した後、makeを実行します。
export OSTYPE=Linux
make
下記のコマンドで物体識別を実行します。
./ailia_classifier ../images/clock.jpg
iOS
iOSではXcodeを使用します。Xcodeで新規のiOSプロジェクトを作成したあと、プロジェクトにlibrary/iosフォルダにあるlibailia.aを登録します。
ビルドセッティングのFrameworksにAccelerate.framework、Metal.framework、MetalPerformanceShaders.frameworkを登録します。
ailia SDKはC言語のインタフェースであるため、ObjectiveCからC言語を呼び出すため、ailia SDKを呼び出すファイルの拡張子を.mmに設定します。
学習済みモデルはSupporting Filesに登録します。登録した学習済みモデルへのパスはpathForResourceで取得することができます。
以降、ailiaPredict APIを呼び出すことで推論を行うことができます。
Xcodeのプロジェクトサンプルは下記からダウンロードすることができます。
Android
AndroidではAndroid NDKを使用します。Android NDKはr19cを推奨しています。Windowsの場合、Cygwinも必要です。
Android NDKでailia SDKを使用するには、library/androidフォルダにあるlibailia-VER-libc++_static.aをリンクします。VERにはライブラリのバージョンが入ります。
Application.mkには以下のような設定を行います。API LEVELは16以降が必要です。また、APP_STLはc++_staticに設定する必要があります。
Android.mkには以下のような設定を行うことでライブラリをリンクします。
推論を行うコードはmain.cppに記載します。学習済みモデルはネットワーク経由などで事前にSDカードに転送します。
ビルドを行うと.soが生成されるため、これをJNI経由でJavaから呼び出します。
ailia SDKでは標準でJNIのAPIも提供しており、Javaから直接呼び出すことも可能です。また、Cのコードだけで.apkを作成する場合はnative-activityを使用することもできます。
GPUを使用する
ailiaはデフォルトではCPUで実行されます。GPUで実行する場合は、ailiaCreateの引数に与えられている、AILIA_ENVIRONMENT_ID_AUTOをデバイスのenv_idに置き換えます。例えば、Jetsonでは2(env_id=2)を指定すると、GPU実行になります。
C++からデバイスを列挙して、デバイスに紐づけられたenv_idを取得する方法は、samples/cpp/ailia_environment.cppを参照してください。
C++のコードサンプル集
C++のコードサンプルは下記からもダウンロードすることができます。
ax株式会社はAIを実用化する会社として、クロスプラットフォームでGPUを使用した高速な推論を行うことができるailia SDKを開発しています。ax株式会社ではコンサルティングからモデル作成、SDKの提供、AIを利用したアプリ・システム開発、サポートまで、 AIに関するトータルソリューションを提供していますのでお気軽にお問い合わせください。