前提・実現したいこと
下に記載するコードを合わせて各行のiou値を比較して一定範囲内なら同じID似直すというプログラムを作りたい
該当のソースコード
python
1import pandas as pd 2import csv 3 4def iou(a, b): 5 # a, bは矩形を表すリストで、a=[xmin, xmax, ymin, ymax] 6 ax_mn, ay_mn, ax_mx, ay_mx = a[2], a[3], a[4], a[5] 7 bx_mn, by_mn, bx_mx, by_mx = b[2], b[3], b[4], b[5] 8 9 a_area = (ax_mx - ax_mn + 1) * (ay_mx - ay_mn + 1) 10 b_area = (bx_mx - bx_mn + 1) * (by_mx - by_mn + 1) 11 12 abx_mn = max(ax_mn, bx_mn) 13 aby_mn = max(ay_mn, by_mn) 14 abx_mx = min(ax_mx, bx_mx) 15 aby_mx = min(ay_mx, by_mx) 16 w = max(0, abx_mx - abx_mn + 1) 17 h = max(0, aby_mx - aby_mn + 1) 18 intersect = w*h 19 20 iou = intersect / (a_area + b_area - intersect) 21 return iou 22 23def check_ID(IDs, data): 24 for k in IDs:#IDsから登録済みIDを一つずつ呼び出し 25 if iou(k, data) <= 0.8:#diffで差分の取得 26 return k[0] 27 return False 28 29 30IDs = list()#今までに出てきたIDをkey, それに付随する数値をvalueにして格納する 31with open('out1.csv', 'r', encoding='UTF-8') as f: 32 reader = csv.reader(f) 33 with open('inp.txt','w', encoding='UTF-8', newline="") as i: 34 writer = csv.writer(i) 35 for data in reader: 36 if "ID:" in data[0]:#一要素目がID番号なら 37 result = check_ID(IDs, data)#重複判定 38 if result: 39 #ヒットすれば、resultに IDが入っているので、dataを書き換える 40 data[0] = result 41 else: 42 IDs.append(data) #IDsにまるごと登録 これをelseでなくてに出せば全部登録になります。 43 writer.writerow(data)#csv形式で書き込み
試したこと
上のプログラムは各業の座標値を比較して指定した範囲内なら同じID番号にするというプログラムです
下のプログラムはiou値の計算をするプログラムですこれらを合わせて各行のiou値を出しそれを決められた範囲内なら同じIDにするという感じにしたいです
補足情報(FW/ツールのバージョンなど)
iouの計算式はこのサイトから抜粋いたしました
https://aipy2020.hatenablog.com/entry/IoU