人体检测框和人脸框匹配问题

背景

  • 需要知道照片中人的位置及相应的人脸的位置。使用人体检测器和人脸检测器。
  • 使用人脸检测器,方便做后续的人脸识别和表情识别等

步骤:

  1. 计算所有人体检测框和人脸框的iou
  2. 计算iou_loss。iou_loss = 1 - iou
  3. 通过匈牙利算法得到人脸框和人体框之间的匹配关系。匈牙利算法使得分配问题的和最小

代码实现

### 计算人脸框和人体框间的iou
def iou_match_grid(bbox1, bbox2):
    ### bbox1,bbox2的表示形式为[xmin,ymin,xmax,ymax]
    bbox1 = np.array(bbox1)
    bbox2 = np.array(bbox2)
    bbox1 = bbox1[:, :4]
    bbox2 = bbox2[:, :4]

    M = bbox1.shape[0]
    N = bbox2.shape[0]

    bbox1 = np.expand_dims(bbox1, axis=1) ## [M,1,4]
    bbox1 = np.repeat(bbox1, N, axis=1) ## [M,N,4]

    bbox2 = np.expand_dims(bbox2, axis=0) ## [1,N,4]
    bbox2 = np.repeat(bbox2, M, axis=0) ## [M,N,4]

    xmin = np.max([bbox1[:, :, 0], bbox2[:, :, 0]], axis=0) ## 重合框的左边界
    ymin = np.max([bbox1[:, :, 1], bbox2[:, :, 1]], axis=0)## 重合框的上边界
    xmax = np.min([bbox1[:, :, 2], bbox2[:, :, 2]], axis=0)## 重合框的右边界
    ymax = np.min([bbox1[:, :, 3], bbox2[:, :, 3]], axis=0)## 重合框的下边界

    w = xmax - xmin
    h = ymax - ymin
    w = np.maximum(w, 0) ## 调整没有重叠框的宽高为0
    h = np.maximum(h, 0)

    area1 = ((bbox1[:, :, 2] - bbox1[:, :, 0]) * (bbox1[:, :, 3] - bbox1[:, :, 1]))
    area2 = ((bbox2[:, :, 2] - bbox2[:, :, 0]) * (bbox2[:, :, 3] - bbox2[:, :, 1]))

    inter = w * h ## 重合的面积
    iou = inter / (area1 + area2 - inter)
    return iou
### 计算iou
ious = iou_match_grid(human_bboxes, faces_bboxes)
## 计算iou loss
ious_loss = 1 - ious
## 通过是iou的和最小的方式匹配人体和人脸框
row_ind, col_ind = linear_sum_assignment(ious_loss) 
row_ind是匹配上的人体检测框的索引
col_ind是相应的人脸框的索引
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值