物体検出でのラベル表示方法について

こんにちは。
学習し終えた物体検出器(Faster R-CNNやYOLOv2)を動画像を用いて検証を行っております。その際に、検出した物体のラベルを動画像上に表示させたく以下のようにプログラムしたのですが、エラーが発生してしまいます。原因としては、物体が検出されないためラベルも検出されずエラーが起き動画がストップしてしまいます。
物体が検出された場合のみラベルを表示されるには、どのようにすれば宜しいでしょうか。
よろしくお願いいたします。
[bboxes, score, label] = detect(rcnn, videoFrame,'NumStrongestRegions', 50,'MaxSize',[106 106]);
[selectedBbox,selectedScore,index] = selectStrongestBbox(bboxes,score, 'RatioType','Min', ...
'OverlapThreshold',0.5);
idx = selectedScore > 0.90
videoFrame = insertObjectAnnotation(videoFrame,'rectangle',...
selectedBbox(idx,:), cellstr(label(idx)), 'color','r');
このコードを実行すると以下のようなエラーが発生してしまいます。
エラー: insertObjectAnnotation
LABELは空以外にする必要があります。
エラー: insertObjectAnnotation>checkLabel (line 300)
validateattributes(label,{'cell'}, {'nonempty', 'vector'}, ...
エラー: insertObjectAnnotation>validateAndParseInputs (line 180)
checkLabel(label);
エラー: insertObjectAnnotation (line 123)
validateAndParseInputs(I, shape, position, label, varargin{:});
エラー: RCNNVideoRead_2 (line 60)
videoFrame = insertObjectAnnotation(videoFrame,'rectangle',...

 Accepted Answer

Kenta
Kenta on 29 Sep 2020

0 votes

こんにちは、if size(bbox,1)>0
など、if文を作るとよいです。

9 Comments

HY
HY on 29 Sep 2020
ご回答ありがとうございます。
そちらも試しましたが何も検出されませんでした。
scoreだけで検出すれば8~9割で検出されているので検出はできていると思うのですが。
Kenta
Kenta on 29 Sep 2020
scoreというのはaverage precisionのことですか?全体では高い精度だけど、そのフレームではたまたま検出されなかったので、bbox=[] になってると思うのですがいかがでしょうか。
HY
HY on 29 Sep 2020
いいえ。selectedScoreを表示させるようにすれば物体が検出されスコアが表示されるという意味です。話がずれていましたら申し訳ありません。
多分一番最初のフレームで認識したい物体がなくエラーが出てしまっています。
先ほどのコードを入れるとエラーは発生しませんが、何も検出されずただ動画が流れます。また、通常より速いスピードで動画が流れるので検出器が反応されていないように感じます。
わかりにくい説明となってしまい申し訳ありません。
Kenta
Kenta on 29 Sep 2020
なるほど、失礼しました。詳しく説明いただきありがとうございます。
idx = selectedScore > 0.90
videoFrame = insertObjectAnnotation(videoFrame,'rectangle',...
selectedBbox(idx,:), cellstr(label(idx)), 'color','r')
ここの、idxが[ ]になってしまう場合がある、ということですかね?
そのため、insertObjectAnnotationがエラーを返す、ということですか?
HY
HY on 29 Sep 2020
多分そうだと思われます。cellstr(label(idx))が[]になっているかと...
Kenta
Kenta on 29 Sep 2020
なるほど、ちなみに、今回の意図はある信頼度以上の検出物体を可視化したいということですよね?ある画像があって、0.8のもの、0.85のものがあった場合、0.9には満たないのでそれはannotationのBOXを出せない→空の配列になるのでそのまま突破しようとするとエラーがでる→その場合は仕方がないのでif文で回避して、そのフレームはBOXなしで表示させる、という流れになると思っていたのですが、それとはまた別の考えがあるのでしょうか?
HY
HY on 29 Sep 2020
はい、信頼度の高い検出器で動画像認識を可視化しようとしてます。 自分もそのようになると思っているのですが、if文を使うと先程言ったようになってしまいます。 ちなみにif size(bbox,1)>0はどのような計算を行なっているのでしょうか?
Kenta
Kenta on 29 Sep 2020
idx = selectedScore > 0.90
videoFrame = insertObjectAnnotation(videoFrame,'rectangle',...
selectedBbox(idx,:), cellstr(label(idx)), 'color','r');
例えば、こちらの例にあわせると、if numel(find(idx==1)) > 0
とすれば、(またはsize(x,1)の形でも同じ意味)idxが1、つまりスコアが0.9以上のものがある場合IF以下の文を実行するという意味になります。例えば画像中に犬らしきものが3つあって、それが0.8, 0.85, 0.91というスコアで検出されたならば、numel(find(idx==1))の値は1になります。
そして、もし信頼度が0.9以上のものがなかった場合は、BBOXも空になって、そのあとでエラーになるので、この値が0 より大きい、ということが偽の場合はバウンディングボックスを出す工程がスキップされるのでエラーなく次のフレームに移ることができます。
HY
HY on 30 Sep 2020
詳しい説明ありがとうございます。 よく理解できました。 今日はできないのですが、もう一度試したいと思います。 大変ありがとうございました!!

Sign in to comment.

More Answers (0)

Asked:

HY
on 29 Sep 2020

Commented:

HY
on 30 Sep 2020

Community Treasure Hunt

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

Start Hunting!