业务场景
一张抓拍图片中有多个个目标,一个主目标,多个关联目标。
前端智能设备在检测目标时,由于设备软件设计或者检测算法局限性,同一张抓拍图片中的多个目标不会关联性的通知给后端服务。这样后端业务如果想实现主目标对应哪些关联目标的话,就不好实现。
为此需要在后端通过智能检测算法,再次对抓拍图片中的目标进行检测并记录检测目标和关联目标的坐标位置。
约束
由于前后端检测算法不一样,会导致对抓拍图片中主目标坐标检测有细微的出入。如何确定抓拍图片中哪个是主目标,哪些是关联目标,则是后端需要解决的问题。
知识点
通过查资料发现做目标检测中有个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