Linuxボクの実力ではもうできないと思ってました。this.今回の完成形。Zavierにインストールしたopenframeworksでyoloを実行させているところです。Xavier.YOLOをopenFrameworks(以下OF)で実行できるofxDarknetというaddonが存在します。WindowsとMacのみ。他にLinux用のofxDarknetもあるのですが、母艦でもXavierでも上手くインストールできません。1週間以上トライしてなんとか動かしたらimagenetでも10fpsまで行きませんでした。肝心のYOLOが動かない。やってるうちに分かったのは、このaddonはTinyYOLOしか動かない(yolo9000も動くらしいが9000クラスもあるため。スピード的にリアルタイムは不可能)ことが判明。GPU演算に16bit浮動小数点が指定できないので、Xavierには全く向かないことが分かってきました。こちらはYOLOを利用して、何か作りたいわけですから、これジャーなーと言うことで、10日目で諦めました。Darknetのファイル構成など少しずつ分かってきたので、いくらかスキルアップにはなった模様。OFにOpenCV3.4をリンクして、これに入っているYOLOを使う方法もありますが、Darknetと比較すればかなり遅くなると思われます。Darknet.さーて、どうするか?。InferrenceをOFに組み込んだときのことを思い出しました。Object)を取り込む方法。これだと多少手間は必要ですが、本来のスピードと性能は維持されることになります。標準Darknetでは16bit浮動小数点指定と、.soファイルが作れませんが、これだと作れます。!ヒントはダウンロードしたDarknetフォルダにあるMakefileと、2つのyoloサンプルsrc/console_dll.cpp、src/yolo_v2_class.hppにありました。これらのファイル中でOpenCVに関連する部分を取り除いていくと、画像認識に必要な関数は4つだけである事が分かります。weightとcfg、クラス名ファイルを読み込む3つの関数。それに画像と、認識基準係数を指定して見つかっただけのバウンディングボックス座標とクラス番号等が戻ってくる関数です。OFの動画データをDarknet画像入力データimage_tに変換する部分が最大の山で、今回OpenCVを使っているのはこの部分だけとなります。変換に作者の書いたソースを使いましたが、OFのデータからわざわざcv::Matに変換しなくても(つまりOpenCVを使わなくても)良さそうな感じ。care,横取り作戦開始。start.Xavierの場合、内部eMMCは容量が少ないので、必ず外付けHDDかSSDまたは内蔵SDカードでインストール作業を行う必要があります。上記サイトからダウンロードした圧縮ファイルを展開して、フォルダ名をとりあえずdarknet-XXXとし、Darknetをビルドします。ソースを見るとOpenCVを使ってるのは画像処理部分ですが、OpenCVに関わる余計なライブラリの指定や、OFと競合が発生する可能性(ofxDarknetの問題点)があります。OFにはofxCVというOpenCVのaddonがあるのでこれが利用できます。OpenCVを使わない設定にすることが必要。darknet-XXXに入り、Makefileの中身を以下のように修正します。61最終的にdarknet.soが出来ていることを確認します。今回は/usr等に移動せず、この場所のまま利用することにします。同じ場所にコピーしてここではDarknet_TESTとしました。file上図のように81行目付近と110行目付近(書き込みはどこでも良いのですが)2カ所付け足します。/media/nvidia/TX2/XAVIEL/darknet-XXX/darknet.so※SOファイルの場所は自分の環境に合わせて下さい。リンクファイルを作ります。今回は下図のようにsrc1としました。リンク先はDarknetフォルダにあるsrcフォルダです。2つのフォルダをコピー(Darknetフォルダにあるcfgとdataフォルダです)さらにweightファイルをダウンロードしてコピーします。今回はyolov2.weightsとyolov3.weightsの2つを入れておけば良いと思います。ホームページに書いてあります。(確かDarknetインストール時に自動でダウンロードされたような....)また、dataフォルダの中にcooperBlac.ttfフォントファイルをコピーしておきます。(of/examples/graphics/fontShapesExample/bin/dataに入ってる)最終的にbinの中身は以下のようになります。余計なweightsファイルが入ってますが気にしない。src以下よりmain.cpp、ofApp.h、ofApp.cppを上書きして下さい。ソースは雑ですがご勘弁を....。DetectNet部分をマルチスレッドにする。最初の手順は面倒ですが、2回目からはフォルダ毎コピーすれば、新しいプログラムが作成できます。これだけでハイスピードYOLOが動くとは思いませんでした。認識部分は別スレッドで動かしているので、画像そのもののスピードは落ちず、OF上60fpsを維持しています(画像スピードはカメラに依存)。認識スピードは前回の記事に書いたモノとほぼ同じです。実用レベルのスピードでした!!。.......今回はyolov2.weightを使用。height=608にした場合。今回はyolov2.weightを使用。height=416にした場合。Tiny-yoloだとここまで認識しません。far.メインスレッドがほぼ60fpsなので認識内容を元にまだまだ別の複雑な処理が可能になります。これはCフレームワークに乗せることの醍醐味ではないでしょうか?OFのほとんどのaddonが実行できることになります。YOLOの学習作業は、過去の記事で試していますがこれは、あくまでも母艦Ubuntuを使った場合です。Ubuntu.これがXavier内で簡単な学習ができるとなると、アマチュアでも同一機種内で、どこでも学習と認識の応用が出来ることになります。今回はYOLOの実現だけですが、Darknetにはまだまだ実用的なexampleがたくさんあります。