ailia Tech BLOG

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は下記からダウンロードしてインストールしてください。

Visual Studio 2019 for Windows および Mac のダウンロードダウンロード | IDE、Code、Team Foundation Server | Visual Studio Android、iOS、Windows、Web、クラウド向けのフル機能の統合開発環境 (IDE)…visualstudio.microsoft.com

gnumakeは下記からダウンロードして下さい。DownloadからComplete package, except sourcesのSetupをインストールした後、環境変数(Path)にインストール先のbinを登録し、コマンドプロンプトからmakeで実行できることを確認してください。

make for WindowsMake: GNU make utility to maintain groups of programs 3.81 Make is a tool which controls the generation of executables…gnuwin32.sourceforge.net

サンプルで使用する機械学習モデルをダウンロードするため、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のプロジェクトサンプルは下記からダウンロードすることができます。

ailia-ai/ailia-xcodeProject sample of ailia SDK for xcode Xcode 11.3 Download u2net_opset11.onnx in ./u2net folder. wget…github.com

Android

AndroidではAndroid NDKを使用します。Android NDKはr19cを推奨しています。Windowsの場合、Cygwinも必要です。

NDK のダウンロード | Android NDK | Android Developers開発プラットフォームに合った NDK パッケージを選択してください。 NDK の最新バージョンと以前のバージョンにおける変更点については、 NDK の変更履歴 をご覧ください。 現在利用可能な Mac NDK…developer.android.com

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から呼び出します。

サンプル: hello-jni | Android NDK | Android Developersこのサンプルでは、NDK を使用して開発された HelloJNI という小さなアプリについて紹介します。このサンプルは、NDK インストール ルート ディレクトリの下の samples/hello-jni/ ディレクトリにあります。 次の…developer.android.com

ailia SDKでは標準でJNIのAPIも提供しており、Javaから直接呼び出すことも可能です。また、Cのコードだけで.apkを作成する場合はnative-activityを使用することもできます。

サンプル: native-activity | Android NDK | Android Developersサンプル native-activity は、NDK のインストール ルートの下の samples/native-activity 内にあります。これは、Java ソースコードを含まない、純粋なネイティブ…developer.android.com

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++のコードサンプルは下記からもダウンロードすることができます。

ailia-ai/ailia-models-cppThe collection of pre-trained, state-of-the-art models for C++. ailia models (Python version) ailia SDK is a…github.com


アイリア株式会社はAIを実用化する会社として、クロスプラットフォームでGPUを使用した高速な推論を行うことができるailia SDKを開発しています。アイリア株式会社ではコンサルティングからモデル作成、SDKの提供、AIを利用したアプリ・システム開発、サポートまで、 AIに関するトータルソリューションを提供していますのでお気軽にお問い合わせください。

参考記事

ailia SDK チュートリアル(Python)ailia SDKをPythonで使用するチュートリアルです。Pythonを使用することで様々なモデルの動作を簡単に試すことができます。medium.com

ailia SDK チュートリアル(Unity)ailia SDKをUnityで使用するチュートリアルです。UnityPackageのインポートからアプリケーションのビルドまで解説します。medium.com