画像認識やってみたい(Xamarinで既存のjarやsoを使う)

画像認識やってみたい!!
というわけで調べてみると、こんなのを発見。

www.gaprot.jp

なんか簡単そう。 とりあえずお得意のVisualStudioで作ってみよう。 →失敗しました。以下失敗の記録。

もらってくる

上記のページから

  • 画像認識ライブラリv2 for Android
  • 画像辞書作成ツールv2 for Windows

をダウンロード

画像辞書をつくる

「画像辞書作成ツールv2 for Windows」をダウンロード・展開して、DatasetCreater.exeを実行。
使い方は上記ページの通り。同梱の Tutorial にも書いてあるが、とても簡単。

プロジェクトの作成

VisualStudioで新規プロジェクトを作成。テンプレートは「Androidアプリ(Xamarin)」の「単一ビューアプリ」を選択。
今回はXamarin.Formsはパス。

jarを参照できるようにする

「画像認識ライブラリv2 for Android」は、jarファイルといくつかのsoファイル(共有ライブラリ)、aファイル(静的ライブラリ)で構成されている。
jarファイルをXamarinで参照できるようにするには、「Androidバインドライブラリ(Xamarin)」を作成するらしい。

docs.microsoft.com

少々日本語が不自由だが、jarファイルを追加することはできた。
soファイルは??

soファイルを埋め込む

以下の手順でOK

  1. Androidバインドライブラリ(Xamarin)」プロジェクトの下に、libフォルダを作成する。
  2. libフォルダに、「画像認識ライブラリv2 for Android」のarmeabiフォルダを中身ごとコピーする。
  3. 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エミュレータが使えないのは痛いが、仕方ない。

f:id:foohogehoge:20180901144256p:plain

いざ実行! しかし……

f:id:foohogehoge:20180901145012p:plain

oh....

  • .aファイルもEmbeddedNativeLibraryにしてみる
  • GPFineRecognizerではなくGPFastRecognizerにしてみる
  • 古いNexsus5でデバッグしてみる

等々試してみたが解決せず。 AndroidStudioを立ち上げる元気もないのでとりあえず投げる。