OpenCVの3.3をUbuntu 16.04 にインストールできたので、新しく公式サポートになったDNN ( Deep Neural Network )のデモをいくつか動かしてみました。
私の見たところでは、結構説明が雑なので「すぐさまスパっと動かしてプログラムを読んで理解できる」とはなっていませんでした。
OpenCVのDNNの扱い
まだ全機能を見たわけではありませんが、OpenCVはNet型を導入し、Net::forward() メソッドを実行することで入力画像を認識します。OpenCVはImporter型を使って、.caffemodelファイル(学習済みネットワーク)と.prototxt(ネットワーク構造)の2つのファイルからNet型インスタンスを作り出します。
DNN対応は正式なものですので、OpenCVのworldライブラリをリンクすればDNN機能を含めてビルド可能です。
サンプルの置き場所
DNNのサンプルプログラムの置き場所は opencv-3.3.0/samples/dnn です。これに与える .prototxt ファイルはopencv-3.3.0/samples/data/dnn に置かれています。
GoogLeNetデモ
GoogLeNet は、入力画像を認識して認識結果をラベルづけするネットワークです。
ソースコードはcaffe_googlenet.cppです。このファイルはビルドに必要なすべてのコードを含んでいますので、このファイルだけビルドすれば実行ファイルができます。必要な入力ファイル名はソースコードにハードコードされています。OpenCVのsamples/data/dnnから以下のファイルをコピーして、実行ディレクトリにおいてください。
- synset_words.txt
- bvlc_googlenet.prototxt
- space_shuttle.jpg
また、 http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel から .caffemodel ファイルをダウンロードして実行ディレクトリに置きます。
引数無しで実行すれば、スペースシャトル(実はソ連製)が認識されます。ファイル名が spece_shuttle.jpg で認識できたというのも、多少変ですので他の写真も認識するか試すといいでしょう。コマンドラインから写真の名前を引数とシて渡せば認識できます。
fcn_semsegmデモ
画面の領域を特徴量に応じて塗り分けるデモです。
ソースコードはfcn_semsegm.cppです。このファイルはビルドに必要なすべてのコードを含んでいますので、このファイルだけビルドすれば実行ファイルができます。必要な入力ファイル名はソースコードにハードコードされています。OpenCVのsamples/data/dnnから以下のファイルをコピーして、実行ディレクトリにおいてください。
- pascal-classes.txt
- fcn8s-heavy-pascal.prototxt
- rgb.jpg
また、https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/voc-fcn8s/caffemodel-urlから .caffemodel ファイルのURL取得し、ファイルをダウンロードして実行ディレクトリに置きます。
引数無しで実行すれば、サクリングの写真が自転車等のオブジェクトに応じて塗り分けられます。写真では人が薄青、自転車が緑で塗られています。
ssd-object-detection デモ
画面の中にある物体を抽出し、その物体に対して認識をかけるデモです。
ソースコードはssd_object_detection.cppです。このファイルはビルドに必要なすべてのコードを含んでいますので、このファイルだけビルドすれば実行ファイルができます。必要な入力ファイル名は引数で渡します。OpenCVのsamples/data/dnnから以下のファイルをコピーして、実行ディレクトリにおいてください。
- rgb.jpg
また、https://github.com/weiliu89/caffe/tree/ssd#modelsからPascal VOC カテゴリに移動し、 07+12の SSD300リンクをクリックします。ダウンロードしたファイルからcaffemodelとdeploy.prototxtを実行ディレクトリに置きます。
このプログラムを走らせるには引数が必要です。
ssd-object-detection --proto=deploy.prototxt --model=VGG_VOC0712_SSD_300x300_iter_120000.caffemodel --image=rgb.jpg
実行に成功すると、検出されたオブジェクトが四角で囲まれて表示されます。また、コンソールにはオブジェクトごとに認識したクラス(オブジェクトの種類)、確からしさ、座標が表示されます。クラスは数字なのでわかりにくいですね。
まったくの初心者です
教えてください
GoogLeNetデモでcaffe_googlenet.cppをビルドすると記載されておりますが
g++で実行すれば良いのでしょうか?
可能であれば具体的なコマンドを教えてほしいです
私はスクリーンショットにあるように、Eclipseのマネージド・プロジェクトを作ってそこにソースを登録していきました。OpenCVのworld ライブラリをリンクしないと動作しないです。