c++多类别nms
2023-12-26 18:59:26
static __device__ float box_iou(
float aleft, float atop, float aright, float abottom,
float bleft, float btop, float bright, float bbottom)
{
float cleft = max(aleft, bleft);
float ctop = max(atop, btop);
float cright = min(aright, bright);
float cbottom = min(abottom, bbottom);
float c_area = max(cright - cleft, 0.0f) * max(cbottom - ctop, 0.0f);
if (c_area == 0.0f)
return 0.0f;
float a_area = max(0.0f, aright - aleft) * max(0.0f, abottom - atop);
float b_area = max(0.0f, bright - bleft) * max(0.0f, bbottom - btop);
return c_area / (a_area + b_area - c_area);
}
static __global__ void nms_kernel(float *bboxes, int max_objects, float threshold, ObjectDetectType_e detect_type)
{
int position = (blockDim.x * blockIdx.x + threadIdx.x);
int count = min((int)*bboxes, max_objects);
if (position >= count)
return;
// left, top, right, bottom, confidence, class, keepflag
int COMMON_BOX_ELEMENT;
if (detect_type == DETECT_FACE ) {
COMMON_BOX_ELEMENT = FACE_BOX_ELEMENT;
}else if(detect_type == DETECT_PLATE){
COMMON_BOX_ELEMENT = PLATE_BOX_ELEMENT;
}else{
COMMON_BOX_ELEMENT = NUM_BOX_ELEMENT;
}
float *pcurrent = bboxes + 1 + position * COMMON_BOX_ELEMENT;
for (int i = 0; i < count; ++i)
{
float *pitem = bboxes + 1 + i * COMMON_BOX_ELEMENT;
if (i == position || pcurrent[5] != pitem[5])
continue;
if (pitem[4] >= pcurrent[4])
{
if (pitem[4] == pcurrent[4] && i < position)
continue;
float iou = box_iou(
pcurrent[0], pcurrent[1], pcurrent[2], pcurrent[3],
pitem[0], pitem[1], pitem[2], pitem[3]);
if (iou > threshold)
{
pcurrent[6] = 0; // 1=keep, 0=ignore
return;
}
}
}
}
文章来源:https://blog.csdn.net/weixin_41012399/article/details/135227261
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!