前提・実現したいこと
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})
に落とし込みたいのですが,どうすればよいか分かりません.
回答1件
あなたの回答
tips
プレビュー