Intel NCStick用TinyYOLOのソース読んでみた(その3)
109行目
重なったボックス情報を削除するためのマスク情報配列を取得する。
パラメータは
box_list
: バウンティングボックスの座標/サイズ情報のセットの配列box_list
の配列構成はこんな感じ。
[
[X座標, Y座標, 幅, 高さ],
[X座標, Y座標, 幅, 高さ],
・・・
]
出力は
重なったボックス情報を削除するためのマスク情報配列。
閾値を超えたスコアの数 の dtype.bool型の1次元配列。
出力の配列の構成はこんな感じ。
[ True, True, False, False, True, ・・・]
def get_duplicate_box_mask(box_list):
113行目
重なっていると判断する重なり比率の閾値
max_iou = 0.35
115行目
重なり判断済みフラグを1で初期化
dtype=’bool’ で良い気がするが…そうすれば最後のboolへの変換処理が不要になるのに…
box_mask = np.ones(len(box_list))
117行目
総当たりチェックを行うためのループ処理
重なり判断済みフラグが0なら既に重なりBOXとして削除済みなのでスキップ
for i in range(len(box_list)):
if box_mask[i] == 0: continue
for j in range(i + 1, len(box_list)):
120行目
2つのBOXの重なり比率を計算し、max_iou
より大きければ重なっていると判断する。
if get_intersection_over_union(box_list[i], box_list[j]) > max_iou:
box_mask[j] = 0.0
123行目
重なり判断済みフラグをbool型に変換したものを返す
filter_iou_mask = np.array(box_mask > 0.0, dtype='bool')
return filter_iou_mask
163行目
パラメータで与えられる2つのBOXの重なり比率を計算する
パラメータは
box_1
: ボックス1の座標/サイズ情報box_2
: ボックス2の座標/サイズ情報各パラメータの配列構成は
box[0]
: ボックスのX座標(中心, pixel単位)box[1]
: ボックスのY座標(中心, pixel単位)box[2]
: ボックスの幅(pixel単位)box[3]
: ボックスの高さ(pixel単位)なお、座標系は X座標は左端が原点、Y座標は上端が原点
def get_intersection_over_union(box_1, box_2):
166行目
box_1 の右端座標 と box_2 の 右端座標 の小さい方 の座標 から
box_1 の左端座標 と box_2 の 左端座標 の大きい方 の座標を引く
⇒ 重なっている部分の幅
intersection_dim_1 = min(box_1[0]+0.5*box_1[2],box_2[0]+0.5*box_2[2])-\
max(box_1[0]-0.5*box_1[2],box_2[0]-0.5*box_2[2])
170行目
box_1 の下端座標 と box_2 の下端座標 の小さい方 の座標 から
box_1 の上端座標 と box_2 の上端座標 の大きい方 の座標を引く
⇒ 重なっている部分の高さ
intersection_dim_2 = min(box_1[1]+0.5*box_1[3],box_2[1]+0.5*box_2[3])-\
max(box_1[1]-0.5*box_1[3],box_2[1]-0.5*box_2[3])
173行目
重なっている部分の幅と高さのどちらかが負数
⇒ 重なっている部分はないので、その面積は0
if intersection_dim_1 < 0 or intersection_dim_2 < 0 :
# no intersection area
intersection_area = 0
176行目
重なっている部分の幅と高さのどちらかが正数
⇒ 重なっている部分の面積を計算
else :
# intersection area is product of intersection dimensions
intersection_area = intersection_dim_1*intersection_dim_2
183行目
box_1とbox_2の合計面積を計算(box_1の面積 + box_2の面積 - 重なっている部分の面積)
union_area = box_1[2]*box_1[3] + box_2[2]*box_2[3] - intersection_area;
186行目
box_1とbox_2の合計面積のうち、重なっている部分の比率を返す。
iou = intersection_area / union_area
return iou