前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >YOLOv6 人脸Landmark检测

YOLOv6 人脸Landmark检测

作者头像
OpenCV学堂
发布2023-08-22 13:21:49
2500
发布2023-08-22 13:21:49
举报
文章被收录于专栏:贾志刚-OpenCV学堂

微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识

YOLOv6人脸检测模型

YOLOv6上次(应该是很久以前)发布了一个0.3.1版本,支持人脸检测与五点landmark调用,后来我就下载,想使用一下,发现居然没有文档,也没有例子。但是官方有个infer.py文件是可以调用的,说明这个模型文件应该没问题。下载打开模型文件的输入与输出结构如下:

输出格式8400x16,其中16的输出表示为人脸框+landmark坐标信息。xyxy, conf, cls, lmdks,前面四个是Box信息、后面是置信度与分类得分、最后是10个值五点XY坐标

输出解析顺序

官方代码与参考文档给出的解析顺序,xyxy, conf, cls, lmdks,这部分还有官方的参考文件:

代码语言:javascript
复制
https://github.com/meituan/YOLOv6/blob/yolov6-face/yolov6/core/inferer.py

第110行就是这样说明的,于是我按上述格式一通解析,结果让我崩溃了,输入图像与解析结果如下:

这个时候我才明白为什么这个发布了这么久,网上居然一篇文章关于YOLOv6人脸检测的文章都没有,网上的文章很多都是YOLOv5跟YOLOv7的人脸+Landmark检测,原因一切都是有原因的。

我debug一下,发现预测出来的16个值,只有最后两个值的结果是小于或者等于1的,所以我当时猜想16个顺序应该是:xyxy, lmdks, conf, cls,按照我猜测的顺序我又改下代码,然后直接运行测试,奇迹出现了:

这张图是AI生成的,如有雷同纯属巧合!

整个推理的流程跟YOLOv5、YOLOv6对象检测一样,就是后处理不同,所以附上后处理部分的代码:

代码语言:javascript
复制
def wrap_detection(self, input_image, out_data):
    confidences = []
    boxes = []
    kypts = []
    rows = out_data.shape[0]

    image_width, image_height, _ = input_image.shape

    x_factor = image_width / 640.0
    y_factor = image_height / 640.0

    sd = np.zeros((5, 2), dtype=np.float32)
    sd[0:5] = (x_factor, y_factor)
    sd = np.squeeze(sd.reshape((-1, 1)), 1)
    # xyxy, lmdks, conf, cls,
    for r in range(rows):
        row = out_data[r]
        conf = row[14]
        cls = row[15]
        if (conf > 0.25 and cls > 0.25):
            confidences.append(conf)
            x, y, w, h = row[0].item(), row[1].item(), row[2].item(), row[3].item()
            left = int((x - 0.5 * w) * x_factor)
            top = int((y - 0.5 * h) * y_factor)
            width = int(w * x_factor)
            height = int(h * y_factor)
            box = np.array([left, top, width, height])
            boxes.append(box)
            kypts.append(np.multiply(row[4:14], sd))

    indexes = cv.dnn.NMSBoxes(boxes, confidences, 0.25, 0.25)

    result_confidences = []
    result_boxes = []
    result_kypts = []

    for i in indexes:
        result_confidences.append(confidences[i])
        result_boxes.append(boxes[i])
        result_kypts.append(kypts[i])

    return result_kypts, result_confidences, result_boxes
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档