ACFオブジェクト検​出器を用いたリアルタ​イム検出について

現在、以下のリンクについて実行しています。
しかしこれを、webカメラから取り込んだ画像で行いたく、プログラムの作成を行っております。
どのようにしたらよいかご教授お願い致します。

4 Comments

Kenta
Kenta on 13 Dec 2019
こんにちは、ウェブカメラで行いたいのは、学習のほうではなく、推論のほうのみ、ということで正しいでしょうか。
推論の場合であれば、リンクのI=imread('...')のところをwebcameraからの画像に変更すれば可能です。
具体的には、下のリンクにあるように、
cam = webcam(2);
I = snapshot(cam);
とすれば、ウェブカメラからの画像をインプットとして扱えます。
目的がつかみ切れていないので、もしこれで不十分であれば、適宜補足いただけると幸いです。よろしくお願いいたします。
Sato
Sato on 21 Dec 2019
ご返信ありがとうございます(遅くなり申し訳ございません。)
行いたいのは、その通りで、ウェブカメラから取り込んだリアルタイムの画像(映像)で、機械学習(ACFObjectdetector)を用いて推論を行いたい、ということです。説明不足で申し訳ありませんでした。
とりあえずアドバイス通りにやってみようと思います。
また質問させて頂くかもしれませんが、宜しくお願い致します。
Kenta
Kenta on 21 Dec 2019
こんにちは、返信ありがとうございます。
「リアルタイム」を何fpsと定義するかは、場合によると思うのですが、ウェブからメラの関数の設定でフレームレートも変えることができます。また問題があればご報告ください。よろしくお願いいたします。
Sato
Sato on 23 Dec 2019
度々の質問となり申し訳ございません。
I = imread('stopSignTest.jpg');
bboxes = detect(acfDetector,I);
annotation = acfDetector.ModelName;
I = insertObjectAnnotation(I,'rectangle',bboxes,annotation);
figure
imshow(I)
のプログラムの中で、
cam = webcam(2);
I = snapshot(cam);
と変更すれば大丈夫かと思い実行したところ、
エラー: webcam (line 116)
Error initializing media source.
エラー: program3 (line 1)
cam = webcam(3);
というエラーが出てしまいました。webカメラ用のツールボックスはインストールしてあるのですが....
どのようにしたら良いでしょうか。
また、別途の質問となってしまいますが、
サンプルデータをテストする上の行までで、学習を行っていると思いますが、毎回学習させると時間がかかると思うので、プログラム下部の推論だけを行いたいと思うのですが、可能なのでしょうか。
恐縮ですが、教えて頂けると大変助かります。

Sign in to comment.

 Accepted Answer

Kenta
Kenta on 23 Dec 2019
Edited: Kenta on 23 Dec 2019

0 votes

こんにちは、まずはwebカメラとうまく連携しているのか知りたいです。webカメラをPCに接続したうえで、
cam=webcam
と試してもらえますか。camという変数には、PCのカメラとwebカメラの情報が格納されていると思います。
もう1点の質問に関しても、その状況で使える学習器を別で(事前に)作ってしまって、その学習器をどんどん新たな画像にあてはめていくイメージ、と認識しているのですが、そうであれば可能と思います。

15 Comments

Sato
Sato on 24 Dec 2019
Edited: Sato on 24 Dec 2019
ご返信ありがとうございます。
cam = webcam 
としたところ、
(cam=webcam(3)ともしました)
エラー: webcam (line 116)
Error. The format exposed by the webcam is not supported.
が出てしまいました。
ちなみにですが、webcamlistで表示させた際にはリストの方に表示されましたが、使おうとすると使えません...
(関係があるのかが初心者なためよく分からないのですが、.bmp形式の画像をカメラから読込みたいです...)
どのようにしたら良いでしょうか。
Kenta
Kenta on 24 Dec 2019
丁寧に教えていただきありがとうございます。
すいません、
camlist=webcamlist
として、返した情報を教えてもらえますか?
cam=webcam(1)
cam2=webcam(2)
また、カメラをPCにつないだうえで、上の2つも実行してもらえますか?
さらに、お使いのカメラは、MATLABのハードウェアサポートがされていますでしょうか?
いろいろ聞いてすいません。よろしくお願いいたします。
Kenta
Kenta on 25 Dec 2019
申し訳ありません。調べてみたんですが、私の知識不足で決定的な解決案が見つかりませんでした。
上のURLで、お使いのカメラを見てみたんですが、すぐには見当たらず、サポートしてないからダメなのかと思いました。
しかし、「Image Acquisition Toolboxのアプリでプレビューした場合、正常にプレビューできております。」とおっしゃっていたので、一応MATLABでも読めるということなのでしょうか。
ただ、PCのカメラ画像が読めないのは、カメラ以外に問題があるのかもしれないと思いました。それに関してもsurfaceをお使いのようで、surfaceだと若干webcamの接続が面倒とネットにも書いていたので結局どれが問題なのか私にはわからなかった次第です。
アプリで読み込んだとき、その操作をコード生成とかできないでしょうか。
Kenta
Kenta on 25 Dec 2019
Edited: Kenta on 25 Dec 2019
返信ありがとうございます。いえいえ、こちらもなかなか有効打を提案できずすいません。
確認させてください。このコードをコマンドに打てば、カメラ画像が表示されるということでしょうか?それだと
im=snapshot(vid);
とすればいいのではないかと思ったのですがいかがでしょうか。
Sato
Sato on 25 Dec 2019
ご回答ありがとうございます。
はい、コマンドウインドウで上記のコードを実行したところ、リアルタイムのカメラ画像が表示されました。
アドバイスを頂いたと思うのですが、
im=snaphot(vid);
はリンクのどちらに入力したら良いでしょうか(初歩的な基礎知識不足で申し訳ございません)。
また、snapshotをどこかで定義する必要があると思いますが、そちらについても教えて頂けると助かります。
お手数をおかけしますが、宜しくお願い致します。
Kenta
Kenta on 25 Dec 2019
I = imread('stopSignTest.jpg');
のところを、
I=snapshot(vid);
とすればいいのではないでしょうか。snapshot自体がある種の関数になっていて、
vid = videoinput('winvideo', 3, 'YUY2_640x480');
src = getselectedsource(vid);
vid.FramesPerTrigger = 1;
と、あらかじめ宣言しておいたら適宜webcameraから画像を読み取れるのではないかと思います。ただ、ループにして、連続的に画像を読み取ったり、うまく物体検出するために画像をリサイズ、またはその他の前処理をするなど、いろいろとやることがあるかもしれません。
Sato
Sato on 25 Dec 2019
非常にご丁寧に教えていただきありがとうございます。 お手数をおかけします…
また試させて頂きます。
宜しくお願い致します。
Sato
Sato on 26 Dec 2019
Edited: Sato on 26 Dec 2019
度々の質問となり申し訳ありません。
上のコードを実行したところ、
関数としてスクリプト snapshot を実行しようとしています:
エラー: snapshot (line 15)
I = snapshot(vid);
が表示されてしまいました。
ファイル名を別のsnapshot.m以外でやったところ、関数として認識されなかったため、snapshot.mにしたところ、このようになってしまいました。
恐らく
にあるように
which -all snapshot
を行ったところパスが表示されていたので、関数自体は認識されているのかと思うのですが.....
宜しくお願い致します。
<追記>
vid(ビデオ)でのinputになるので、調べてみたところ、getsnapshotを用いたところ、画像1枚だけ表示されました。
Kenta
Kenta on 26 Dec 2019
こんにちは、教えていただきありがとうございます。
snapshotではなかったのですね。失礼しました。
figure;
for i = 1:20
snapshot = getsnapshot(vid);
imshow(snapshot)
pause(.5)
end
などと打てば、連続的に画像が表示されませんかね?
Sato
Sato on 26 Dec 2019
Edited: Sato on 26 Dec 2019
いえいえ、こちらこそありがとうございます。
ある程度連続的には表示されましたが、ビデオをそのまま取り込んだ時のようにスムーズに表示されるではなく、遅延があったので、何か改良が必要だと思いました。
ところで、話が戻ってしまい申し訳ないのですが、
にて、データを学習させ、推論結果の表示を行うと思いますが、
この先の学習器作成し、取り入れた画像(カメラから)からどんどん推論を行っていくプロセスを行いたいと思います。ただ、その手順のリンクなどが見つからないのですが、ご存知でしょうか。
宜しくお願い致します。
Kenta
Kenta on 26 Dec 2019
pause(.5)
これは、各フレーム間で0.5秒まつという意味です。そのため最低0.5秒遅延がうまれます。
見やすくするためと思い書いていました。説明不足ですいません。
これをなくすか、この秒数を小さくするとよりスムーズになると思います。
手順のリンクというのは、ラベリングをして、学習をさせるプロセスも含めてということですよね。推論はこの例の通りdetect関数でできるのでOKと思います。
考えないといけないのが、この例のようなACFの検出か、YOLOなどの深層学習ベースの検出をするかですね。わかりやすく、このままACFでやるなら、イメージラベラーでラベリング、そのアプリ上でgroundTrunthファイルが得られるので、あとはこの例に沿ってやればできると思います。
Kenta
Kenta on 26 Dec 2019
丁寧にありがとうございます。
ご質問の意味がわかりました。はい、可能です。
save acfDetector acfDetector
として、同じパスにacfDetectorを保存します。
そして、
load acfDetector
figure
annotation = acfDetector.ModelName;
for i = 1:2000
I = getsnapshot(vid);
bboxes = detect(acfDetector,I);
I = insertObjectAnnotation(I,'rectangle',bboxes,annotation);
imshow(I)
pause(.01)
end
とすればよいです。これで、一度作った検出器をロードして、検出のみを実行できます。
「に関してはループ内に入れるべきでしょうか。」の件は、外でよいです。
Sato
Sato on 27 Dec 2019
ご回答ありがとうございます。
試してみたところ、ロード出来ました。ありがとうございます。
ただ、別の問題が2点発生してしまい、
1つめとしては、
A timeout occurred during GETSNAPSHOT
というエラーがでてしまい、数回画像を遅延を発生させながらも連続的に表示後に、止まってしまう(getsnapshotが機能不可なる)
2つめとしては、
I = getsnapshot(vid);
の読込みが、通常の読込みよりも遅く遅延してしまう
ということが発生しております...
なにか有効な手法をご存知でしょうか。
宜しくお願い致します。
Kenta
Kenta on 27 Dec 2019
ご返信ありがとうございます。回答の前に、はじめのご質問とは異なってきているので
本件は、解決済みとしていただき、あらたに質問をしていただけますか。
その方がより詳しい回答者さまが反応してくれたり、今後似た疑問をもつ方が参考にできると思います。
Sato
Sato on 27 Dec 2019
何度もありがとうございました。
承知致しました。
大変助かりました。

Sign in to comment.

More Answers (0)

Categories

Find more on MATLAB Support Package for IP Cameras in Help Center and File Exchange

Products

Release

R2019a

Asked:

on 12 Dec 2019

Commented:

on 27 Dec 2019

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!