Retinaface代码记录(三)(默认框生成)

一、写在开头

这次主要记录关于Retinaface的默认框生成部分。

下面是代码地址:
Retinaface代码地址

主要包括的脚本为:
prior_box.py

也欢迎阅读其上一篇博客Retinaface代码记录(一)。可以帮助读者对本片博客可以有一个整体上的把握和理解。

二、主要内容

这个主要包含一个PriorBox类,首先在__init__中传入一系列后续要用到的参数,然后在forward()中,来获取一系列默认框。具体获取方式:先遍历三个特征图,(特征图大小为[80,40,20]论文中提到的是5个,但代码实现只有3个,如下图。)获取默认框大小,即min_sizes[k],然后遍历特征图的每个像素点(itertools.product()即返回相应的笛卡尔坐标,各个坐标值相应配对),s_kx,s_ky代表的是默认框的宽w和高h;dense_cx,dense_cy包含的是默认框的中心点,即遍历获取的特征图的像素点。这里我们可以看到,x,y乘以的是steps/image_size,因为feature_map和steps的乘积正好是image的大小,这样处理刚好等分遍历完整个图像。最后变化下anchors的形状([x,y,w,h]这个样子),并将其归一化于0-1之间(clamp()即将输入压缩与min和max之间,小于min的记为min,大于max的记为max),因为论文中 the aspect ratio at 1:1,所以直接返回即可。
在这里插入图片描述
prior_box.py

import torch
from itertools import product as product
import numpy as np
from math import ceil


class PriorBox(object):
    def __init__(self, cfg, image_size=None, phase='train'):
        super(PriorBox, self).__init__()
        self.min_sizes = cfg['min_sizes']  # 'min_sizes': [[16, 32], [64, 128], [256, 512]]
        self.steps = cfg['steps']  # 'steps': [8, 16, 32]
        self.clip = cfg['clip']  # 'clip': False
        self.image_size = image_size  # cfg_mnet中'image_size': 640,  cfg_re50中'image_size': 840
        self.feature_maps = [[ceil(self.image_size[0]/step), ceil(self.image_size[1]/step)] for step in self.steps] #feature_maps : [80,40,20]
        self.name = "s"

    def forward(self):
        anchors = []
        for k, f in enumerate(self.feature_maps):
            min_sizes = self.min_sizes[k]
            for i, j in product(range(f[0]), range(f[1])):
                for min_size in min_sizes:
                    s_kx = min_size / self.image_size[1]
                    s_ky = min_size / self.image_size[0]
                    dense_cx = [x * self.steps[k] / self.image_size[1] for x in [j + 0.5]]
                    dense_cy = [y * self.steps[k] / self.image_size[0] for y in [i + 0.5]]
                    for cy, cx in product(dense_cy, dense_cx):
                        anchors += [cx, cy, s_kx, s_ky]

        # back to torch land
        output = torch.Tensor(anchors).view(-1, 4)
        if self.clip:
            output.clamp_(max=1, min=0)
        return output

三、结尾

默认框生成的介绍到这里就结束了。有什么疑问的,可以看下我的这篇博客,里面是一个综述。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
好的,关于 Pytorch-RetinaFace代码讲解,我可以给您提供以下信息: 1. RetinaFace 模型介绍 RetinaFace 是一个用于人脸检测和人脸识别的深度学习模型,其核心思想是在多个尺度下进行特征提取,并利用类似于 Anchor 的方式进行边预测。RetinaFace 模型的核心网络结构为 ResNet-50,通过 ResNet-50 提取特征,再分别在不同的特征图上进行预测,从而提高检测的准确率和速度。 2. Pytorch-RetinaFace 代码结构 Pytorch-RetinaFace代码结构主要包含以下几个文件: - data/ 目录:包含了数据集相关的代码和数据集文件; - models/ 目录:包含了 RetinaFace 模型的代码和模型文件; - layers/ 目录:包含了 RetinaFace 模型中用到的自定义层代码; - utils/ 目录:包含了一些工具类和函数; - train.py:训练脚本; - test.py:测试脚本; - demo.py:演示脚本。 3. RetinaFace 模型训练 RetinaFace 模型的训练主要包含以下几个步骤: - 数据集准备:将数据集按照指定格式进行划分和预处理; - 模型构建:使用 Pytorch 搭建 RetinaFace 模型,并定义损失函数和优化器; - 模型训练:使用训练集对模型进行训练,并在验证集上进行验证和调参; - 模型保存:将训练好的模型保存到指定的路径。 4. RetinaFace 模型测试 RetinaFace 模型的测试主要包含以下几个步骤: - 加载模型:使用 Pytorch 加载训练好的模型; - 图像预处理:将待检测的图像进行预处理,包括大小调整和归一化等; - 特征提取:使用 ResNet-50 提取图像的特征; - 预测边:在不同的特征图上进行边预测,并进行 NMS 处理; - 绘制结果:将预测出的边和置信度绘制在原图上。 以上就是关于 Pytorch-RetinaFace 代码的讲解,希望能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值