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

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

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

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

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5793閲覧

物体検出(yolov3)で検出範囲の指定に関して

mojyagorio

総合スコア17

YOLO

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

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2020/04/23 04:34

編集2020/04/23 04:54

yoloV3を改造して、物体検出を実際の用途に使用しようと考えております。
物体検出する際に、カメラや動画なりを読み込ませて検出することは、容易かと思いますが。
videocaptureで表示しているものに対して、指定した範囲のみの物体検出するためには、どこを弄ればよいのかピンときません。
要は、検出用に読み込んでいる画像のROIを指定してやりたいというところです。

用途例:画像のある範囲に車が来た時だけ検知するなど。

以上
よろしくお願いいたします。

Python

1 2ef detect_video(yolo, video_path, output_path=""): 3 import cv2 4 vid = cv2.VideoCapture(video_path) 5 if not vid.isOpened(): 6 raise IOError("Couldn't open webcam or video") 7 video_FourCC = int(vid.get(cv2.CAP_PROP_FOURCC)) 8 video_fps = vid.get(cv2.CAP_PROP_FPS) 9 video_size = (int(vid.get(cv2.CAP_PROP_FRAME_WIDTH)), 10 int(vid.get(cv2.CAP_PROP_FRAME_HEIGHT))) 11 isOutput = True if output_path != "" else False 12 if isOutput: 13 print("!!! TYPE:", type(output_path), type(video_FourCC), type(video_fps), type(video_size)) 14 out = cv2.VideoWriter(output_path, video_FourCC, video_fps, video_size) 15 accum_time = 0 16 curr_fps = 0 17 fps = "FPS: ??" 18 prev_time = timer() 19 while True: 20 return_value, frame = vid.read() 21 image = Image.fromarray(frame) 22 image = yolo.detect_image(image) 23 result = np.asarray(image) 24 curr_time = timer() 25 exec_time = curr_time - prev_time 26 prev_time = curr_time 27 accum_time = accum_time + exec_time 28 curr_fps = curr_fps + 1 29 if accum_time > 1: 30 accum_time = accum_time - 1 31 fps = "FPS: " + str(curr_fps) 32 curr_fps = 0 33 cv2.putText(result, text=fps, org=(3, 15), fontFace=cv2.FONT_HERSHEY_SIMPLEX, 34 fontScale=0.50, color=(255, 0, 0), thickness=2) 35 cv2.namedWindow("result", cv2.WINDOW_NORMAL) 36 cv2.imshow("result", result) 37 if isOutput: 38 out.write(result) 39 if cv2.waitKey(1) & 0xFF == ord('q'): 40 break 41 yolo.close_session() 42 43 44 45 46

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

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

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

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

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

fana

2020/04/23 04:41

問題点が何なのかよくわかりませんが,「ある範囲」だけの部分画像を検出器に与えるのでは何かがダメなのでしょうか?
mojyagorio

2020/04/23 04:52

説明が悪く申し訳ございません。仰る通りです。 現在のコードが検出してきたものをそのまま検出器に渡しており、 抜粋して渡す部分をどこに記載してやればよいのかわかっておりません。 video_size = (int(vid.get(cv2.CAP_PROP_FRAME_WIDTH)), int(vid.get(cv2.CAP_PROP_FRAME_HEIGHT))) このあたりのコードを変更すればとも思いますが、 例えば検出したいエリアが、3か所あった場合に、 3か所のROIを切ってやるために6点ほど指定してあげる必要があると思います。 そのあたりの指定がピンときません。
guest

回答1

0

ベストアンサー

指定した範囲のみの物体検出するためには、どこを弄ればよいのかピンときません。

検出範囲を切り取って渡すやり方だと、1フレームあたり複数回の検出をしなければならないのでその分遅くなります。例えば、範囲が1枚の画像に3つあるのだとすると、1フレームあたり3回推論しなければならなくなるので、約3倍遅くなります。

検出は元の画像サイズで行い、出てきた検出結果の座標を見て、指定範囲内に含まれるものだけ最終的な検出結果とすればよいと思います。

  • いずれかの ROI の内部にある矩形 → そのまま
  • いずれかの ROI と重なっている矩形 → その ROI と矩形の共通部分をとる
  • どの ROI にも重なっていない矩形 → 除外

投稿2020/04/23 09:53

編集2020/04/23 09:54
tiitoi

総合スコア21956

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

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

mojyagorio

2020/04/23 23:32

ご回答ありがとうございます。 その発想は、ありませんでした。 非常に参考になります。 その方向で進めようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問