SSD细节—— default box与prior box

本文围绕SSD展开,介绍了default box和prior box的概念,指出二者指的是feature map cell上固定数量的box。阐述了SSD检测值与Yolo的不同,包括置信度和边界框位置的预测,以及边界框的编码和解码过程。还提到了SSD Caffe源码中variance超参数的设置,最后解释了conv4_3做norm的原因。
部署运行你感兴趣的模型镜像

二者都是指feature map cell上固定数量的box,并不是有些文章说的prior是从default挑选出来的。论文里写的default box,代码里用了prior box。

论文中说边框回归类似faster rcnn,那代码里prior的4个variance又是什么? 解释如下:

SSD的检测值也与Yolo不太一样。对于每个单元的每个先验框,其都输出一套独立的检测值,对应一个边界框,主要分为两个部分。第一部分是各个类别的置信度或者评分,值得注意的是SSD将背景也当做了一个特殊的类别,如果检测目标共有  个类别,SSD其实需要预测  个置信度值,其中第一个置信度指的是不含目标或者属于背景的评分。后面当我们说  个类别置信度时,请记住里面包含背景那个特殊的类别,即真实的检测类别只有  个。在预测过程中,置信度最高的那个类别就是边界框所属的类别,特别地,当第一个置信度值最高时,表示边界框中并不包含目标。第二部分就是边界框的location,包含4个值  ,分别表示边界框的中心坐标以及宽高。但是真实预测值其实只是边界框相对于先验框的转换值(paper里面说是offset,但是觉得transformation更合适,参见R-CNN)。先验框位置用  表示,其对应边界框用  $表示,那么边界框的预测值  其实是  相对于  的转换值:

习惯上,我们称上面这个过程为边界框的编码(encode),预测时,你需要反向这个过程,即进行解码(decode),从预测值  中得到边界框的真实位置  :

然而,在SSD的Caffe源码实现中还有trick,那就是设置variance超参数来调整检测值,通过bool参数variance_encoded_in_target来控制两种模式,当其为True时,表示variance被包含在预测值中,就是上面那种情况。但是如果是False(大部分采用这种方式,训练更容易?),就需要手动设置超参数variance,用来对  的4个值进行放缩,此时边界框需要这样解码:

b^{cx}=d^w (variance[0]*l^{cx}) + d^{cx}, \space b^{cy}=d^y (variance[1]*l^{cy}) + d^{cy}

b^{w}=d^w \exp(variance[2]*l^{w}), \space b^{h}=d^h \exp(variance[3]*l^{h})

另外,关于conv4_3 做norm的原因

VGG16中的Conv4_3层将作为用于检测的第一个特征图。conv4_3层特征图大小是 38X38 ,但是该层比较靠前,其norm较大,所以在其后面增加了一个L2 Normalization层(参见ParseNet),以保证和后面的检测层差异不是很大,这个和Batch Normalization层不太一样,其仅仅是对每个像素点在channle维度做归一化,而Batch Normalization层是在[batch_size, width, height]三个维度上做归一化。归一化后一般设置一个可训练的放缩变量gamma
 

(引自 https://blog.youkuaiyun.com/c20081052/article/details/80391627 )

 

您可能感兴趣的与本文相关的镜像

Yolo-v5

Yolo-v5

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

<think> 我们正在处理一个关于Protocol Buffers(protobuf)的问题。用户询问“priorbox”是否在protobuf库中定义。根据提供的引用内容,并没有直接提到priorbox。但是,我们可以从protobuf的一般使用和常见实践来推断。 分析: 1. 引用[1]和[2]讨论了protobuf的消息设计(避免使用字符串编码数据)和JSON提示,但未提及priorbox。 2. 引用[3]展示了使用TensorFlow创建TFRecords文件的示例,其中使用了protobuf格式(tf.train.Example)。但这是TensorFlow特定的,并非protobuf标准库的一部分。 3. 引用[4]描述了一个手部检测器的类,protobuf无关。 因此,我们需要基于对protobuf的了解来回答: - protobuf是一个用于序列化结构化数据的库,它允许用户自定义消息类型(message)。用户定义的消息通常在一个.proto文件中声明,然后由protoc编译器生成对应语言的类。 - 标准protobuf库(google.protobuf)提供了一些预定义的消息类型,但通常不包含特定领域的消息(如计算机视觉中的priorbox)。 在计算机视觉领域,priorbox(或称为prior box, default box)是目标检测算法(如SSD)中的一个概念,用于生成候选框。它通常不是protobuf标准库的一部分,而是由具体框架(如Caffe、TensorFlow等)或模型定义文件(如Caffe的prototxt)中定义。 结论: 在标准的protobuf库(google.protobuf)中,并没有名为“priorbox”的预定义消息类型。但是,用户可以在自己的.proto文件中定义一个名为PriorBox的消息。 因此,回答用户: 根据标准protobuf库的官方文档,没有名为“priorbox”的预定义消息类型。如果您在某个项目中看到“priorbox”,它很可能是该项目自定义的消息类型(在.proto文件中定义)。 注意:由于用户的问题可能来源于特定的上下文(如某个开源项目),如果用户能提供更多细节(例如在哪个项目中遇到的),我们可以给出更准确的答案。 生成相关问题: 1. 如何在protobuf中定义自定义消息? 2. 在TensorFlow中使用protobuf定义模型结构的方法是什么? 3. 如何将自定义的protobuf消息序列化为TFRecords? 4. 在目标检测中,priorbox的作用是什么? 5. 如何查看protobuf消息的定义? </think> 在 Protobuf(Protocol Buffers)标准库中,**没有名为 `PriorBox` 的预定义消息类型**。以下是详细分析: ### 1. **Protobuf 标准库的定义范围** - Protobuf 标准库(如 `google/protobuf`)主要提供通用的基础类型(如 `Any`、`Timestamp`、`Struct` 等)和工具,不包含特定算法或领域的专用类型[^1][^2]。 - 类似 `PriorBox`(常用于目标检测算法如 SSD 中的先验框生成器)属于深度学习领域的专用概念,需由开发者自行定义。 ### 2. **PriorBox 的典型定义场景** 开发者通常在自定义的 `.proto` 文件中定义 `PriorBox`,例如: ```protobuf syntax = "proto3"; message PriorBox { repeated float min_sizes = 1; // 最小框尺寸 repeated float max_sizes = 2; // 最大框尺寸 float aspect_ratio = 3; // 宽高比 bool flip = 4; // 是否翻转框 } ``` 此类定义常见于: - TensorFlow Object Detection API 的模型配置 - Caffe 的 `prototxt` 网络定义文件 - ONNX 模型的结构描述 ### 3. **验证方法** - **检查官方文档**:查阅 [Protobuf 官方类型列表](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf),无 `PriorBox` 相关定义。 - **代码搜索**:在 TensorFlow/Caffe 源码中,`PriorBox` 均定义在项目的私有 `.proto` 文件中(例如 Caffe 的 `caffe.proto`)。 ### 4. **替代方案** 若需使用 `PriorBox`: 1. 在自定义 `.proto` 中声明其结构(如上文示例)。 2. 调用 `protoc` 编译器生成对应语言的类: ```bash protoc --python_out=. priorbox.proto # 生成 Python 类 ``` ### 总结 `PriorBox` 是计算机视觉领域的专用类型,**不属于 Protobuf 标准库**,需开发者自行定义。其实现依赖于具体框架(如 TensorFlow/Caffe)或自定义协议文件[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值