業務場景
一張抓拍圖片中有多個個目標,一個主目標,多個關聯目標。
前端智能設備在檢測目標時,由於設備軟件設計或者檢測算法侷限性,同一張抓拍圖片中的多個目標不會關聯性的通知給後端服務。這樣後端業務如果想實現主目標對應哪些關聯目標的話,就不好實現。
爲此需要在後端通過智能檢測算法,再次對抓拍圖片中的目標進行檢測並記錄檢測目標和關聯目標的座標位置。
約束
由於前後端檢測算法不一樣,會導致對抓拍圖片中主目標座標檢測有細微的出入。如何確定抓拍圖片中哪個是主目標,哪些是關聯目標,則是後端需要解決的問題。
知識點
通過查資料發現做目標檢測中有個IOU的概念可以解決上述業務需求。
所謂的IOU(intersect over union)叫:交併比。指目標預測框和真實框的交集和並集的比例。
即
IOU = A與B的交集面積 / A的面積 + B的面積 - A與B交集的面積。
如果座標完全重合,那IOU就是1,一般算法測試的數據集結果中如果IOU >= 0.5 就可以表示兩個座標指向相同的目標了。
更詳細的關於IOU的知識可自行去查,此處不深究。
實現
先看個圖,目標矩陣A和目標矩陣B。
我們分別用p1與p2表示矩形A的左下角和右上角,用p3和p4表示矩形B的左下角和右上角。考慮兩個矩形不重疊的情況:
(p1.x > p4.x) || (p2.x < p3.x) || (p1.y > p4.y) || (p2.y < p3.y)
僞代碼:
struct RectAnale{
int x //X座標
int y; /Y座標
int w; //矩形寬
int h; //矩形高
};
int calculateOverlapArea(RectAnale rect1, RectAnale rect2)
{
//1.判斷下座標的合法值
//2.計算交集面積
int p1_x = rect1.x, p1_y = rect1.y;//第1個矩陣左下角
int p2_x = p1_x + rect1.h, p2_y = p1_y + rect1.w;//第1個矩陣右上角
int p3_x = rect2.x, p3_y = rect2.y;//第2個矩陣左下角
int p4_x = p3_x + rect2.h, p4_y = p3_y + rect2.w;//第2個矩陣右上角
//2-1.矩形若不相交,面積則爲0
if (p1_x > p4_x || p2_x < p3_x || p1_y > p4_y || p2_y < p3_y)
{
return 0;
}
//長 = 右上角最小x - 左下角最大x
//寬 = 右上角最小y - 左下角最大y
int Len = min(p2_x, p4_x) - max(p1_x, p3_x);
int Wid = min(p2_y, p4_y) - max(p1_y, p3_y);
return Len * Wid;
}
int iou()
{
RectAnale rect1;
RectAnale rect2;
int nOverlapArea = calculateOverlapArea(rect1, rect2);
if(nOverlapArea = 0)
{
return 0
}
int nIOU = nOverlapArea / (rect1.h*rect1.w + rect2.h*rect1.w - nOverlapArea);
return nIOU;
}
參考:
https://blog.csdn.net/qq_31758759/article/details/83024574