見出し画像

1.openFrameworksで物体検知とOSC通信

openFrameworks(以下oF)で物体検知(Object Detection)を動かし、その結果をOSC通信で送る方法です。
※自分は卒業制作ではオリジナルのモデルを作成しましたが、それはまた別の記事で書こうと思ってます。この記事では、元々用意されているモデルを使用する方針で書いています。

物体検知

物体検知には以下のaddonを使用します。
https://github.com/TetsuakiBaba/ofxOpenCvDnnObjectDetection
これをoFのaddonのフォルダー内にcloneします。
cloneのやり方はこのサイトを参考にすればできると思います。https://docs.github.com/ja/github/creating-cloning-and-archiving-repositories/cloning-a-repository

このaddonの中のExamplesに、osc_senderというのがあるので、その中のxcodeprojectを開きます。

addon/ofxOpenCvDnnObjectDetection/Examples/osc_sender/osc_sender.xcodeproj

詳しいコードの内容は、下で記述します。
コード以外で私が詰まったところを先に記しておきます。(当たり前といえば当たり前なんですが…)

gitからcloneしてきたもののままでは動かないので、binの中を整理します。

osc_sender/bin/data/dnn

この中に"coco.txt"と"voc.txt"と"yolov3-tiny.cfg.1"というのがあります。

スクリーンショット 2021-02-10 15.29.29

これらの名前がofApp::setup()内のdetector.setup()のなかに書いてある名前と一致してないといけません。(当たり前)

スクリーンショット 2021-02-10 15.24.43

物体検知を動かすには、cfgファイルとweightsファイルと、ラベルの名前が書かれたtxtファイルが必要です。なので、"coco.txt"はそのままで大丈夫です。"voc.txt"は必要ないです。"yolov3-tiny.cfg.1"は、最後の".1"を消し、ofApp::setup()内の22行目のところを直します。
weightsファイルはここからダウンロードできます。

これで多分動きます。頑張れ。

あとは問題ないと思いますが、ざっくりコード内でやっていることを言うと、ofApp:update()の中で、カメラ画像が更新されたらdetectorも更新するという処理をやっていることと、

スクリーンショット 2021-08-10 11.50.23

ofApp::draw()の中で、バウンディングボックスを描画しています。

スクリーンショット 2021-08-10 11.50.42

バウンディングボックスを描画するかどうかは、物体検知を行ったときの自信度によって変化します。その自信度の閾値はofApp::setup()内の

スクリーンショット 2021-08-10 11.56.05

この値(いま0.6となっている)で変えることができます。この値によって、どれくらい物体検知の結果を描画するかを指定できます。
よくわからないと思いますが、とりあえず動かしてみてください。

OSC通信

コードが自分で読める人・OSC通信をやったことがある人は飛ばしてください。
receiverについては、Touchdesignerの記事の方で紹介します。

ざっくりとした説明になりますが、大事なところはまずofApp::setup()内のホストとポートの指定です。

スクリーンショット 2021-08-10 11.30.03

今回はlocalhostで、ポート番号を12345にしています。ポート番号は1024以降ならなんでもよかったはず。この値はTouchDesignerのreceiverでも使用します。
OSC通信の肝の部分は、ofApp::update()内のメッセージを送る部分です。

スクリーンショット 2021-08-10 11.30.45

ここで物体検知の結果を送信しています。
(60行目から)アドレス、ラベル番号、ラベルの名前、bouding boxのx座標、y座標、bounding boxの幅、高さを送信しています。

この記事が気に入ったらサポートをしてみませんか?