質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

661閲覧

異なるクラスの同時検出

reiya_123

総合スコア57

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/12/18 20:32

前提

python3.8でyolov5を使用しています

実現したいこと

たとえば、条件分岐で写真に人とスーツケースが写っていたらバウンディングボックスを出力するのようなことをしたいと考えています。しかし、どうやら一度の認識で一個の物体しか認識していない?ようで同時に2つ以上のクラス検出ができません。
どのように解決したらよろしいでしょうか。
よろしくお願いいたします。

該当のソースコード

class YOLOV5: def yolov5(self): model_name='yolov5s.pt' model = torch.hub.load(os.getcwd()+'/YOLOv5/yolov5/', 'custom', source='local', path = model_name, force_reload = True) color = (255,0,0) RGB_image = cv2.imread("/home/limlab/YOLOv5/yolov5/test8.jpg") results = model(RGB_image) # 画像パスを設定し、物体検出を行う for *box, conf, cls in results.xyxy[0]: if conf > 0.5: s = model.names[int(cls)] print(s) if s == 'person' and s == "suitcase": #--- 枠描画 cv2.rectangle(RGB_image,(int(box[0]), int(box[1])),(int(box[2]), int(box[3])),color,thickness=2,) #--- 文字枠と文字列描画 cv2.rectangle(RGB_image, (int(box[0]), int(box[1])-20), (int(box[0])+len(s)*10, int(box[1])), color, -1) cv2.putText(RGB_image, s, (int(box[0]), int(box[1])-5), cv2.FONT_HERSHEY_PLAIN, 1, [225,255,255], 1, cv2.LINE_AA) cv2.imshow('color',RGB_image) if cv2.waitKey(0) & 0xff == 27:#ESCで終了 cv2.destroyAllWindows()

出力結果

person person suitcase person person

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2022/12/19 00:58

たとえば、 num_person = 0 num_suitcase = 0 for *box, conf, cls in results.xyxy[0]: if conf > 0.5: s = model.names[int(cls)] print(s) if s == 'person': num_person = num_person + 1 if s == "suitcase": num_suitcase = num_suitcase + 1 みたいに、「人」と「スーツケース」の数を数えます (上記はインデントが消えて見えるので、インデントをちゃんと入れてください) 次に、上記で数えた結果で、 「num_person」が「0」よりも大きい かつ 「num_suitcase」が「0」よりも大きい 場合のみ、質問のコードの > for *box, conf, cls in results.xyxy[0]: 以下に進みます なお、質問のコードから、can110さんの回答のように修正します 上記のようにしたら、どうでしょうか?
reiya_123

2022/12/19 01:35

ご返信ありがとうございます。 無事解決することができました。 ありがとうございました。
guest

回答2

0

ベストアンサー

python

1 num_person = 0 2 num_suitcase = 0 3 for *box, conf, cls in results.xyxy[0]: 4 if conf > 0.5: 5 s = model.names[int(cls)] 6 print(s) 7 if s == 'person': 8 num_person = num_person + 1 9 if s == "suitcase": 10 num_suitcase = num_suitcase + 1

みたいにして、「人」と「スーツケース」の数を数えます

 
次に、上記で数えた結果で、
「num_person」が「0」よりも大きい
かつ
「num_suitcase」が「0」よりも大きい
場合のみ、質問のコードの

python

1 for *box, conf, cls in results.xyxy[0]:

以下を実行します

 
なお、質問のコードから、can110さんの回答のように修正します

 
上記のようにしたら、

写真に人とスーツケースが写っていたらバウンディングボックスを出力する

ができると思います

投稿2022/12/19 08:13

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

yolov5については分かりませんが提示コードにおいて
if s == 'person' and s == "suitcase":は同時に成立することはありません。
if s == 'person' or s == "suitcase":の誤りかと思います。

投稿2022/12/19 00:17

can110

総合スコア38268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問