我們先考慮一維的情況:令 \(a = [x_1,x_2], b = [y_1, y_2]\),若想要 \(a\) 與 \(b\) 有交集,需要滿足如下情況:
簡言之,要保證 \(a\) 和 \(b\) 的最大值中最小的那個減去它們中的最小值中最大的那個即可獲得公共部分,**實現如下:
class anchor:
def __init__(self, base_size=16):
self.base_size = base_size # 滑動視窗的大小
if not base_size:
raise valueerror("invalid base_size: {}.".format(base_size))
self._anchor = np.array([1, 1, self.base_size, self.base_size]) - 1
@property
def anchor(self):
return self._anchor
@anchor.setter
def anchor(self, new_anchor):
self._anchor = new_anchor
@property
def w(self):
'''錨框的寬度
'''return self.anchor[2] - self.anchor[0] + 1
@property
def h(self):
'''錨框的高度
'''return self.anchor[3] - self.anchor[1] + 1
@property
def size(self):
'''錨框的面積
'''return self.w * self.h
@property
def _whctrs(self):
"""return x center, and y center for an anchor (window). 錨框的中心座標
"""x_ctr = self.anchor[0] + 0.5 * (self.w - 1)
y_ctr = self.anchor[1] + 0.5 * (self.h - 1)
return np.array([x_ctr, y_ctr])
@staticmethod
def _coordinate(aspect, ctr):
'''依據寬高組合計算錨框的座標
'''k = (aspect - 1) / 2
return np.concatenate([ctr - k, ctr + k], axis=1)
先建立乙個可以用來做運算的計算器,然後在此基礎上計算二維的 iou,即
def iou(anchor, anchor1):
a = anchor()
b = anchor()
a.anchor = anchor
b.anchor = anchor1
t = np.stack([a.anchor, b.anchor])
xmin, ymin, xmax, ymax = np.split(t, 4, axis=1)
w = xmax.min() - xmin.max()
h = ymax.min() - ymin.max()
i = w * h
u = a.size + b.size - i
return i / u
下面舉一例子,並視覺化:
最終結果為:
0.8151364126804707
目標檢測IOU計算
iou是交並比 intersection over union 是目標檢測中使用的乙個概念是產生的候選框 candidate bound 與原標記框 ground truth bound 的交疊率,即它們的交集與並集的比值。最理想情況是完全重疊,即比值為1。在多目標跟蹤中,用來判別跟蹤框和目標檢測框...
目標檢測中IoU計算
1.含義 iou即交並比 intersection over union 是真實的目標框ground truth與演算法 出來的目標框prediction之間差距的衡量指標。計算公式 iou a b a b 一般來說,iou值越大,說明 的越準確,通常取0.5作為閾值。2.python程式實現 de...
目標檢測之 IoU
iou 作為目標檢測演算法效能 map 計算的乙個非常重要的函式 但縱觀 iou 計算的介紹知識,都是直接給出 給出計算方法,沒有人徹底地分析過其中的邏輯,故本人書寫該篇部落格來介紹下其中的邏輯。iou 的全稱為交並比 intersection over union 通過這個名稱我們大概可以猜到 i...