<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          目標檢測之 IoU

          共 3049字,需瀏覽 7分鐘

           ·

          2021-03-10 04:04

          IoU 作為目標檢測算法性能 mAP 計算的一個非常重要的函數(shù)。

          但縱觀 IoU 計算的介紹知識,都是直接給出代碼,給出計算方法,沒有人徹底地分析過其中的邏輯,故本人書寫該篇博客來介紹下其中的邏輯。

          1. IoU的簡介及原理解析

          IoU 的全稱為交并比(Intersection over Union),通過這個名稱我們大概可以猜到 IoU 的計算方法。IoU 計算的是 “預測的邊框” 和 “真實的邊框” 的交集和并集的比值。

          開始計算之前,我們首先進行分析下交集和并集到底應該怎么計算:我們首先需要計算交集,然后并集通過兩個邊框的面積的和減去交集部分即為并集,因此 IoU 的計算的難點在于交集的計算。

          為了計算交集,你腦子里首先想到的方法應該是:考慮兩個邊框的相對位置,然后按照相對位置(左上,左下,右上,右下,包含,互不相交)分情況討論,來計算交集。

          上圖就是你的直覺,這樣想沒有錯。但計算一個交集,就要分多種情況討論,要是程序真的按照這邏輯編寫就太搞笑了。因此對這個問題進行進一步地研究顯得十分有必要。

          讓我們重新思考一下兩個框交集的計算。兩個框交集的計算的實質(zhì)是兩個集合交集的計算,因此我們可以將兩個框的交集的計算簡化為:

          通過簡化,我們可以清晰地看到,交集計算的關鍵是交集上下界點(圖中藍點)的計算。

          我們假設集合 A 為 [x 1 x_{1}x1,x 2 x_{2}x2],集合 B 為 [y 1 y_{1}y1y 2 y_{2}y2]。然后我們來求AB交集的上下界限。

          交集計算的邏輯

          • 交集下界 z 1 z_{1}z1max ( x 1 , y 1 ) \text{max}(x_{1}, y_{1})max(x1,y1)

          • 交集上界 z 2 z_{2}z2min ( x 2 , y 2 ) \text{min}(x_{2}, y_{2})min(x2,y2)

          • 如果 z 2 ? z 1 z_{2}-z_{1}z2?z1 小于0,則說明集合 A 和集合 B 沒有交集。

          下面使用Python來實現(xiàn)兩個一維集合的 IoU 的計算:

          def iou(set_a, set_b):
          '''
          一維 iou 的計算
          '''

          x1, x2 = set_a # (left, right)
          y1, y2 = set_b # (left, right)

          low = max(x1, y1)
          high = min(x2, y2)
          # intersection
          if high-low<0:
          inter = 0
          else:
          inter = high-low
          # union
          union = (x2 - x1) + (y2 - y1) - inter
          # iou
          iou = inter / union
          return iou
          • 1

          • 2

          • 3

          • 4

          • 5

          • 6

          • 7

          • 8

          • 9

          • 10

          • 11

          • 12

          • 13

          • 14

          • 15

          • 16

          • 17

          • 18

          • 19

          上面,我們計算了兩個一維集合的 iou,將上面的程序進行擴展,即可得到兩個框 IoU 計算的程序。

          def iou(box1, box2):
          '''
          兩個框(二維)的 iou 計算

          注意:邊框以左上為原點

          box:[top, left, bottom, right]
          '''

          in_h = min(box1[2], box2[2]) - max(box1[0], box2[0])
          in_w = min(box1[3], box2[3]) - max(box1[1], box2[1])
          inter = 0 if in_h<0 or in_w<0 else in_h*in_w
          union = (box1[2] - box1[0]) * (box1[3] - box1[1]) + \
          (box2[2] - box2[0]) * (box2[3] - box2[1]) - inter
          iou = inter / union
          return iou
          • 1

          • 2

          • 3

          • 4

          • 5

          • 6

          • 7

          • 8

          • 9

          • 10

          • 11

          • 12

          • 13

          • 14

          • 15

          2. 基于TensorFlow的IoU實現(xiàn)

          上節(jié)介紹了IoU,及其的計算,下面我們給出其在 TensorFlow 上的實現(xiàn):

          import tensorflow as tf

          def IoU_calculator(x, y, w, h, l_x, l_y, l_w, l_h):
          """calaulate IoU
          Args:
          x: net predicted x
          y: net predicted y
          w: net predicted width
          h: net predicted height
          l_x: label x
          l_y: label y
          l_w: label width
          l_h: label height

          Returns:
          IoU
          """


          # convert to coner
          x_max = x + w/2
          y_max = y + h/2
          x_min = x - w/2
          y_min = y - h/2

          l_x_max = l_x + l_w/2
          l_y_max = l_y + l_h/2
          l_x_min = l_x - l_w/2
          l_y_min = l_y - l_h/2
          # calculate the inter
          inter_x_max = tf.minimum(x_max, l_x_max)
          inter_x_min = tf.maximum(x_min, l_x_min)

          inter_y_max = tf.minimum(y_max, l_y_max)
          inter_y_min = tf.maximum(y_min, l_y_min)

          inter_w = inter_x_max - inter_x_min
          inter_h = inter_y_max - inter_y_min

          inter = tf.cond(tf.logical_or(tf.less_equal(inter_w,0), tf.less_equal(inter_h,0)),
          lambda:tf.cast(0,tf.float32),
          lambda:tf.multiply(inter_w,inter_h))
          # calculate the union
          union = w*h + l_w*l_h - inter

          IoU = inter / union
          return IoU


          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲天堂有码无码视频 | 北条麻妃在线无码 | 婷婷亚洲国产 | 黄色一a电影 | 欧美波多野结衣 |