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

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

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

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

Python 3.x

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

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

Q&A

解決済

1回答

3080閲覧

ONNXに変換したYOLOv5のバウンディングボックスの処理をPythonで記述したい

PJwnOI

総合スコア39

YOLO

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

Python 3.x

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

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

0グッド

1クリップ

投稿2021/12/23 01:04

編集2021/12/24 09:37

前提・実現したいこと

YOLOV5のカスタム学習モデルを使ってTensorFlow.jsで物体検出をやってみた
を参考にして,ONNXに変換したYOLOv5を用いて推論させた後,バウンディングボックスを表示させたいです.
推論まではできましたが,バウンディングボックスの処理が分かりません.
このリンクではJavaScriptで書かれていますが,Pythonで記述したいです.

PyTorchは使えないので,YOLOv5の元のコードをコピペすることはできません.

該当のソースコード

JavaScript

1var output = model.executeAsync(imageTensor).then(output=> { 2 const o0 = output[0].arraySync();###ここがわからない 3 4 const OBJECT_TH = 0.5; 5 const IOU_TH = 0.5; 6 const bairitu_w = 1008/640; 7 const bairitu_h = 756/640; 8 9 let a=0; 10 var list = new Array(); 11 12 for (let i = 0; i < o0[0].length; i++) { 13 if((o0[0][i][4]*o0[0][i][5])>OBJECT_TH){ 14 a = a+1; 15 const dx = o0[0][i][2]*bairitu_w/2; 16 const dy = o0[0][i][2]*bairitu_h/2; 17 18 var ary = new Array(); 19 ary.push(o0[0][i][0]*bairitu_w - dx); 20 ary.push(o0[0][i][1]*bairitu_h - dy); 21 ary.push(o0[0][i][2]*bairitu_w); 22 ary.push(o0[0][i][3]*bairitu_h); 23 ary.push(o0[0][i][4]*o0[0][i][5]); 24 25 list.push(ary); 26 } 27 } 28 29 list.sort(function(a,b){return(a[4] - b[4]);}); 30 31 for (let i = 0; i < list.length; i++) { 32 let aa = 0; 33 for(let j = i+1; j< list.length; j++) { 34 var iou = bbox_iou(list[i], list[j]); 35 if(iou > IOU_TH) { 36 aa = 1; 37 break; 38 } 39 } 40 } 41

試したこと(一部省略)

Python

1import cv2 2import onnx 3import onnxruntime 4import numpy as np 5import matplotlib.pyplot as plt 6from PIL import Image, ImageDraw 7 8# 推論を実行する 9for i in range(3): 10 output_name = session.get_outputs()[i+1].name 11 12 output[i] = session.run([output_name], {input_name: image_data})[0] 13 14###var output = model.executeAsync(imageTensor).then(output=> { 15 #const o0 = output[0].arraySync();###Pythonに書き換えたい 16 17o0 = [] # 18 19OBJECT_TH = 0.5 #閾値 20IOU_TH = 0.5 21W_RATIO = 1000/640 22H_RATIO = 756/640 23 24a = 0 25var_list = [] 26 27for i in range(len(o0)): 28 if o0[0][i][4] * o0[0][i][5] > OBJECT_TH: 29 a = a + 1 30 DX = o0[0][i][2] * W_RATIO / 2 31 DY = o0[0][i][2] * H_RATIO / 2 32 33 ary = [] 34 ary.append(o0[0][i][0] * W_RATIO - DX) 35 ary.append(o0[0][i][1] * H_RATIO - DY) 36 ary.append(o0[0][i][2] * W_RATIO) 37 ary.append(o0[0][i][3] * H_RATIO) 38 ary.append(o0[0][i][4] * o0[0][i][5]) 39 40 var_list.append(ary) 41 42var_list.sort(key=lambda x:x[4],reverse=True) 43 44for i in range(len(list)): 45 aa = 0 46 for j in range(i+1, len(list)): 47 iou = bbox_iou(var_list[i], var_list[j]) 48 if iou > IOU_TH: 49 aa = 1 50 break

追記

Python

1def main(): 2 3 img = get_image() 4 5 # リサイズ 6 image_data = preprocess(img) 7 image_size = np.array([img.size[1], img.size[0]], dtype=np.int32).reshape(1, 2) 8 9 # 学習済みモデルからセッションを作る 10 session = onnxruntime.InferenceSession('yolov5s.onnx') 11 12 # #元の画像の表示 13 # plt.imshow(img) 14 # plt.show() 15 16 #input output 名前取得 17 print("\n") 18 print("input:") 19 for session_input in session.get_inputs(): 20 input_name = session_input.name 21 input_name_img_shape = session_input.shape 22 print(session_input.name, session_input.shape, session_input.type) 23 24 25 print("\n") 26 # 出力のラベル名の確認 27 print("output:") 28 for session_output in session.get_outputs(): 29 print(session_output.name, session_output.shape, session_output.type)

を実行したところ,

terminal

1 2input: 3images [1, 3, 640, 640] tensor(float) 4 5 6output: 7output [1, 25200, 85] tensor(float) 8351 [1, 3, 80, 80, 85] tensor(float) 9420 [1, 3, 40, 40, 85] tensor(float) 10489 [1, 3, 20, 20, 85] tensor(float)

と出ました.

ここから

outputs_index = session.run([output_name_boxes, output_name_scores, output_name_indices], {input_name: image_data, input_name_img_shape: image_size})

に落とし込みたいのですが,どうすればよいか分かりません.

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

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

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

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

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

PJwnOI

2021/12/23 05:07

私は学習や推論ではなく,推論結果からバウンディングボックスの座標計算と画像に出力させたいのです. 貼っていただいたリンクはとても参考になりづらいです,すみません.
jbpb0

2021/12/23 08:53

> 推論結果からバウンディングボックスの座標計算と画像に出力させたい https://github.com/ultralytics/yolov5/blob/master/detect.py をながめると、上記の処理は https://github.com/ultralytics/yolov5/blob/master/utils/plots.py の「class Annotator:」の中で定義されてるのを使ってごにょごにょしてるので、そのあたりが参考になるかな、と思って紹介したのですが、求めてるものはそういうのではないようですね 失礼しました
PJwnOI

2021/12/23 09:02

そのリンクについては私も閲覧しましたが,ONNXで得られたデータをどうするのかがわからず,断念しました. また,PyTorchを使っている部分があるので難しいのです...
jbpb0

2021/12/23 10:44

https://cpp-learning.com/onnx-runtime_yolo/#ONNXRuntime_YoloV3py のコードは、ONNX Runtimeでの推論結果を、画像に重ね書きしてます PyTorchは使ってません yolo v3なので、v5とは細部で違いがあるかもしれませんが、下記に詳しく解説されてるので、それを参考にしながらv5に対応させるのは、それほど難しくはないように思います https://cpp-learning.com/wp-content/uploads/2019/07/ONNX-Runtime%E3%81%A8YoloV3%E3%81%A7%E7%89%A9%E4%BD%93%E6%A4%9C%E5%87%BA.html
PJwnOI

2021/12/24 02:06

ありがとうございます.ONNXで調べていましたが,onnxruntimeで調べるとよかったんですね. 後でやってみます.
guest

回答1

0

自己解決

YOLOv5のページを見て解決していただきました.

投稿2021/12/27 05:55

PJwnOI

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問