画像認識やってみたい(Xamarinで既存のjarやsoを使う)
画像認識やってみたい!!
というわけで調べてみると、こんなのを発見。
なんか簡単そう。 とりあえずお得意のVisualStudioで作ってみよう。 →失敗しました。以下失敗の記録。
もらってくる
上記のページから
をダウンロード
画像辞書をつくる
「画像辞書作成ツールv2 for Windows」をダウンロード・展開して、DatasetCreater.exeを実行。
使い方は上記ページの通り。同梱の Tutorial にも書いてあるが、とても簡単。
プロジェクトの作成
VisualStudioで新規プロジェクトを作成。テンプレートは「Androidアプリ(Xamarin)」の「単一ビューアプリ」を選択。
今回はXamarin.Formsはパス。
jarを参照できるようにする
「画像認識ライブラリv2 for Android」は、jarファイルといくつかのsoファイル(共有ライブラリ)、aファイル(静的ライブラリ)で構成されている。
jarファイルをXamarinで参照できるようにするには、「Androidバインドライブラリ(Xamarin)」を作成するらしい。
少々日本語が不自由だが、jarファイルを追加することはできた。
soファイルは??
soファイルを埋め込む
以下の手順でOK
- 「Androidバインドライブラリ(Xamarin)」プロジェクトの下に、libフォルダを作成する。
- libフォルダに、「画像認識ライブラリv2 for Android」のarmeabiフォルダを中身ごとコピーする。
- VisualStudioで、armeabiフォルダ下の全ファイルについてビルドアクションを「EmbeddedNativeLibrary」に変更する。
ここで、.DS_Store は .thumbnail 的なファイルであるため無視してよい。
.aファイルは通常.soファイルに含まれるためこれも無視してよい。。。はず。
Xamarinからバインドライブラリを使う
「Androidアプリ(Xamarin)」プロジェクトから「Androidバインドライブラリ(Xamarin)」プロジェクトを参照すればOK。
あとは、「画像認識ライブラリVer.2.0 | ギャップロ」のサンプルのように実装すればよい。
バインドライブラリでインターフェイスが自動変換されているためコピペでは動かないが、オブジェクトブラウザでカバーできる。
getXXX が XXX というプロパティになっていたり、someFunc 関数が SomeFunc 関数に変換されている程度の相違しかない。
これは素敵な機能!
ABIを変更する
「画像認識ライブラリv2 for Android」に含まれていたsoファイルは、armeabiにしか対応していない(と思う)。
アーキテクチャがarm64のスマホで実行するとファイルがないエラーが発生する。ちょっとハマった。
CPUアーキテクチャは一般的に下位互換性があるので、対応アーキテクチャをarmeabiに限定しても動くはず。
下図のように「Androidアプリ(Xamarin)」プロジェクトのプロパティから「サポートされているアーキテクチャ」をarmeabiのみに変更する。
x86のエミュレータが使えないのは痛いが、仕方ない。
いざ実行! しかし……
oh....
- .aファイルもEmbeddedNativeLibraryにしてみる
- GPFineRecognizerではなくGPFastRecognizerにしてみる
- 古いNexsus5でデバッグしてみる
等々試してみたが解決せず。 AndroidStudioを立ち上げる元気もないのでとりあえず投げる。