はじめに
OpenCV for Unityには色々なサンプルが入っており、その中にYOLOを使ったものがあります。
YOLOとは画像認識のアルゴリズムで、比較的処理が高速なことが知られています。
OpenCV for Unityに含まれているYOLOのデモは以下の2つで、WebGLでのデモページからも試すことが出来ます。
- YoloObjectDetectionExample
- 画像を使ったYOLOのデモ
- YoloObjectDetectionWebCamTextureExample
- Webカメラを使ったYOLOのデモ
また、このデモをiPhone XSで動かした動画が以下になります。
iPhoneでYOLOです pic.twitter.com/zrqRHj4mpE
— Nakaji Kohki (@kohki_nakaji) 2018年10月26日
OpenCV for UnityはiOSを始めとして様々なプラットフォームに対応したアセットなのですが、2018/10/26現在の環境で動かすためにはいくつかの手順が必要でしたので、記しておきたいと思います。
手順
予めOpenCV for Unityをプロジェクトにインポートしておきます。
YOLOを使うためには、まずモデルデータをインポートする必要があります。ライセンスの関係でOpenCVForUnityのパッケージ自体には入っていないので、別途リポジトリからダウンロードしてきます。
必要なファイル以下の3つです。
- https://github.com/pjreddie/darknet/tree/master/data/coco.names
- https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg
- https://pjreddie.com/media/files/yolov3-tiny.weights
-
https://github.com/pjreddie/darknet/blob/master/data/person.jpg
- (YoloObjectDetectionExampleのみ必要)
これを、Assets/StreamingAssets/dnn
以下に置いておく必要があります。
OpenCVForUnityの直下にあるStreamingAssets
に雛形があるので、フォルダ毎Assets
直下に移動させると良いと思います。
ちなみにですが、StreamingAssets/dnn
以下にあるドキュメントではcoco.names
の記述が抜けているのと、実行時のファイル参照エラーメッセージでは指定されているyoloのバージョンが異なっていました。罠っぽい…。
ここまでやると、エディタ上で実行ができる状態になります。
OpenCVForUnity/Examples/MainModules/dnn/YoloExample
以下にあるシーンを再生してみてください。
iPhoneで再生するためにはもう一つ手順が必要です。
iOSで実行した場合Utils.cs
のstring getFilePath (string filepath, bool refresh = false)
という関数内にあるFile.Exists (destPath)
がtrueを返してくれない事象を確認しました。そのため、モデルデータを読み込めず、正常に実行されません。
対処としては、ファイルの存在チェックを行わずにpathを返すようにすれば良いです。
if (File.Exists (destPath)) {
return destPath;
} else {
return String.Empty;
}
return destPath;
この状態でビルドすれば冒頭の動画のように実行出来ると思います。