人脸检测retinaface_onnx

基于retinaface实现的人脸检测,使用的是onnx格式的模型

这个模型是使用锚框来定位人脸,锚框(Anchor Box)在目标检测任务中起着非常重要的作用。

  1. 预测目标位置:锚框是一种预设定的框,它代表了模型预测的目标的理想位置、形状和大小。在输入数据经过特征提取阶段后,一般都会做下采样降低数据量得到高层特征图,再在这些高层特征图上预设锚框与标签ground truth进行损失计算。
  2.  提供先验知识:锚框提供了一种先验知识,即在同一位置设置不同宽高比的锚框。这样做的目的是为了增加任务成功的几率,因为不同的目标可能有不同的形状和大小。
  3. 减少计算量:如果按照遍历输入图像上所有可能的像素框的方案执行,即使是一张图片所产生的锚框将多到我们难以承受的地步。因此,更好的处理方式是先对原图进行下采样处理,得到feature map,在feature map中生成锚框。
  4. 提高模型准确性:锚框可以帮助模型更准确地预测目标的位置。通过设定IOU阈值,先验框与真实框超过这个阈值,该先验框就负责这个真实框,所以一个真实框可由多个先验框负责。

生成锚框代码:

void Detector::create_anchor_retinaface(std::vector<box> &anchor, int w, int h)
{
    if (m_lastDstWidth == w || m_lastDstHeight == h)
    {
        return;
    }
    anchor.clear();
    std::vector<std::vector<int> > feature_map(3), min_sizes(3);
    float steps[] = {8, 16, 32};
    for (int i = 0; i < feature_map.size(); ++i) {
        feature_map[i].push_back(ceil(h/steps[i]));
        feature_map[i].push_back(ceil(w/steps[i]));
    }
    std::vector<int> minsize1 = {16, 32};
    min_sizes[0] = minsize1;
    std::vector<int> minsize2 = {64, 128};
    min_sizes[1] = minsize2;
    std::vector<int> minsize3 = {256, 512};
    min_sizes[2] = minsize3;

    for (int k = 0; k < feature_map.size(); ++k)
    {
        std::vector<int> min_size = min_sizes[k];
        for (int i = 0; i < feature_map[k][0]; ++i)
        {
            for (int j = 0; j < feature_map[k][1]; ++j)
            {
                for (int l = 0; l < min_size.size(); ++l)
                {
                    float s_kx = min_size[l]*1.0/w;
                    float s_ky = min_size[l]*1.0/h;
                    float cx = (j + 0.5) * steps[k]/w;
                    float cy = (i + 0.5) * steps[k]/h;
                    box axil = {cx, cy, s_kx, s_ky};
                    anchor.push_back(axil);
                }
            }
        }

    }

}

锚框的生成算法是固定的,是模型在训练的时候使用的一组固定数据,模型推理结果是对这一组固定数据的锚框做一些偏移操作,使其与图像做对应

识别效果:


完整的项目参见https://github.com/coolbreeze1093/retinaface_onnx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值