ailia SDK チュートリアル(C++)

Kazuki Kyakuno
axinc
Published in
13 min readJan 13, 2020

--

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に関するトータルソリューションを提供していますのでお気軽にお問い合わせください。

--

--

Kazuki Kyakuno
axinc

CTO — ax Inc. , Managing Director — AXELL