イメージラベラーを利用して目,口,歯を検出した時に文を表示する方法
2 次查看(过去 30 天)
显示 更早的评论
やりたい事は,目と口を認識したらhello worldと表示.ただし,歯があった場合動作しないプログラムの作成をしたいです.
イメージラベラーを利用して口と目と歯の認識は出来るようになったのですが,その認識した事を
どのような条件文として書いたらいいのかが分かりません.
このプログラムで学習させています.
pos_ins = emt10;
pos_dir = fullfile('C:\Users\tsu-p\Desktop\face');
addpath(pos_dir);
options = trainingOptions('sgdm', ...
'MiniBatchSize', 32, ...
'InitialLearnRate', 1e-6, ...
'MaxEpochs', 10);
moutheyercnn10 = trainRCNNObjectDetector(pos_ins, alexnet, options, 'NegativeOverlapRange', [0 0.3]);
このプログラムで画像の中の口と目と歯を認識して表示するプログラムです.
Imgfilename = strcat('C:\Users\tsu-p\Desktop\face\face8.jpg');
img = imread(Imgfilename);
[bboxes,score,label] = detect(moutheyercnn10,img,'MiniBatchSize',32);
detectedImg = insertObjectAnnotation(img, 'Rectangle', bboxes, cellstr(label));
figure
imshow(detectedImg);
分かる方がいらっしゃったら教えていただきたいです.
1 个评论
Atsushi Ueno
2021-5-10
>イメージラベラーを利用して口と目と歯の認識は出来るようになった
detectedImg = insertObjectAnnotation(img, 'Rectangle', bboxes, cellstr(label));
「オブジェクト認識枠(bboxes)に認識オブジェクト名(label)を表示させてimshowで図示する事ができた」
と言う事ですね
>その認識した事をどのような条件文として書いたらいいのか
は「認識オブジェクト名(label)に『目』『口』『歯』が含まれているか否かを判定する」
と言い換える事が出来ます
采纳的回答
Atsushi Ueno
2021-5-10
上記コメントに記入した通り「認識オブジェクト名(label)に『目』『口』『歯』が含まれているか否かを判定」しました
その結果を用いて、『目』『口』『歯』の組み合わせをif-else文で判断しました。
- この回答内容はdetect関数への入力画像が1枚の場合です
- ラベル名が不明なので"eye", "mouth", "tooth"と仮定します
eye = any(label == 'eye'); % eyeは目の検出結果で、trueかfalseの2値を持つブール型です
mouth = any(label == 'mouth'); % mouthは口の検出結果で、上記と同様です
tooth = any(label == 'tooth'); % toothは歯の検出結果で、上記と同様です
if (eye && mouth && tooth)
%disp(''); %目と口を認識しても、歯があった場合動作しない
elseif (eye && mouth)
disp('Hello world'); %上記以外で、目と口を認識したらhello worldと表示
end
【備考】ご存知かと思いますが、回答に必要だったMATLAB関数の仕様:Computer Vision Toolboxの『detect関数』の説明Detect objects using Faster R-CNN object detector - MATLAB detect - MathWorks 日本 です
detectionResults - 検出結果:検出結果は、Boxes、Score、Labelsの変数名を持つ3列のテーブルとして返されます
bboxes - 検出されたオブジェクトの位置
scores - 検出スコア
labels - バウンディングボックスのラベル:M行1列のカテゴリ配列|B行1列のセル配列
バウンディングボックスのラベルで,M行1列のカテゴリ配列またはB行1列のセル配列で返されます.Mは画像に含まれるラベルの数,Bは入力に画像の配列が含まれる場合,M-by-1カテゴリ配列の数を表します.入力検出器の学習時に,オブジェクトのラベル付けに使われるクラス名を定義します.オブジェクトクラスに使用されるラベルは,trainFasterRCNNObjectDetector関数を用いた学習時に定義されます.
2 个评论
Atsushi Ueno
2021-5-10
入力画像が複数枚の場合、detect関数の出力labelsが「M行1列のカテゴリ配列をB行1列のセル配列で包んだ形」になります。この場合、M*B行1列のセル配列に展開すれば回答内容と同じ形で判定できます(但し複数枚の画像のどれに含まれるかは判定できません)
eye = any(label == 'eye');
を
eye = any([label{:}] == 'eye');
にする
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!