[Intensive Reading]目标检测(object detection)系列(十三)CenterNet:no Anchor,no NMS

CenterNet,一种创新的目标检测算法,通过定位目标中心点实现高效准确的检测,简化了CornerNet的复杂度,提升了检测速度与精度。
部署运行你感兴趣的模型镜像

在这里插入图片描述

目标检测系列:
目标检测(object detection)系列(一) R-CNN:CNN目标检测的开山之作
目标检测(object detection)系列(二) SPP-Net:让卷积计算可以共享
目标检测(object detection)系列(三) Fast R-CNN:end-to-end的愉快训练
目标检测(object detection)系列(四) Faster R-CNN:有RPN的Fast R-CNN
目标检测(object detection)系列(五) YOLO:目标检测的另一种打开方式
目标检测(object detection)系列(六) SSD:兼顾效率和准确性
目标检测(object detection)系列(七) R-FCN:位置敏感的Faster R-CNN
目标检测(object detection)系列(八) YOLOv2:更好,更快,更强
目标检测(object detection)系列(九) YOLOv3:取百家所长成一家之言
目标检测(object detection)系列(十) FPN:用特征金字塔引入多尺度
目标检测(object detection)系列(十一) RetinaNet:one-stage检测器巅峰之作
目标检测(object detection)系列(十二) CornerNet:anchor free的开端
目标检测(object detection)系列(十三) CenterNet:no Anchor,no NMS
目标检测(object detection)系列(十四) FCOS:用图像分割处理目标检测

目标检测扩展系列:
目标检测(object detection)扩展系列(一) Selective Search:选择性搜索算法
目标检测(object detection)扩展系列(二) OHEM:在线难例挖掘
目标检测(object detection)扩展系列(三) Faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3在损失函数上的区别

简介

CenterNet的论文是《Objects as Points》,其作者是得克萨斯大学奥斯汀分校的Xingyi Zhou,Xingyi Zhou后续在CenterNet的基础上,将其扩展到多目标跟踪领域,近期工作为CenterTrack
CenterNet从名字就可以很直观的看出,CenterNet是将目标检测问题看做对于目标中心点的检测,它是继CornerNet之后的又一个Anchor-free方法,它们之间也有比较多的相似之处,区别在于CornerNet是找目标的角点,而CenterNet是找目标的中心点。

CornerNet原理

Motivation

CenterNet的出发点和RetinaNetCornerNet都是差不多的,对于one-stage的目标检测器,大量的anchor导致正负样本的不平衡,网络训练时loss会被大批量负样本所左右。同时又由于检测器是one-stage的,一旦预设了anchor,没办法二次筛选它。所以RetinaNet提出了Focal loss,在计算损失时弱化负样本的影响。而CornerNet和CenterNet则是直接弃用了anchor,除了上面的原因,还有一个就是anchor的设计是完全先验的,有大量的超参数,比如如何选择尺度,比例,多少个分支等等,每个层放几个等等,每个结构都不一样。

Inference

对于一个目标检测任务,一个backbone最后会输出三个分支,分别是Heatmap,Center offset和Box size,如下:

  1. Heatmap: C × H × W C\times H\times W C×H×W,最大值即为目标中心
  2. Center offset: 2 × H × W 2\times H\times W 2×H×W, 预测中心与真值的偏移量
  3. Box size: 2 × H × W 2\times H\times W 2×H×W,每个目标中心处,包含BBox大小的信息

也可以表示为下图的过程,Heatmap作为最核心的输出,表示物体的中心点,而由于下采样造成的不对称,CenterNet使用中心点的offset来修正它,确定中心点后,根据size分支的输出最后确定bbox。
而上面的C,就是目标检测任务的类别数量了,对于COCO就是80,相当于把不同类别的目标放到不同的channel上做。但是除了Heatmap,其余两个分支不需要C倍的通道数量。
在这里插入图片描述
相比于CornerNet,CenterNet的中心点Heatmap极大的简化了算法的复杂程度,因为一个目标用一个heatmap就可以表示出来,不再需要左上角和右下角两张heatmap,也就不涉及判断哪两个角点属于一个目标的问题。
至于CornerNet认为的“目标的中心点不好定义,目标角点更为清晰明确”这个观点,在CNN的拟合能力面前,看起来是不成问题的。

Train

CenterNet对于目标检测的分支有三个,所以对应的损失也是三个,分别是Heatmap损失,offset损失和size损失:

Heatmap loss:
在这里插入图片描述
offset and size loss:
在这里插入图片描述
其中CenterNet的Heatmap loss参考的是CornerNet,包括高斯映射,Focal loss的使用都是这样。大家可以直接看之前的文章,在这里就不重复了,而offset loss也是和CornerNet相似的,只是CornerNet使用的smoothL1,而CenterNet直接用了L1,CornerNet预测了左上角和左下角点,所以不需要再预测size,而CenterNet的size loss和offset loss是差不多的,也是L1。

Other

no NMS

CenterNet的结构是可以不做NMS的,本质上其实也是因为no Anchor,这意味着没有大量的先验预设框,不需要过NMS进行滤除,这让CenterNet的后处理变得比较简单,并且更加接近于end-to-end。

关于下采样

此外还有一个很有意思的地方,centernet主干网络的在设计的时候,下采样倍率普遍比较小,CenterNet的倍率是4,CornerNet的下采样倍率是5,而Anchor base的方法,下采样倍率就要大的多,比如YOLOv3是在16的基础上构建三个scale,分别是8,16,32。
也就是YOLOv3最小的倍率也是CenterNet的2倍,这说明Anchor Free方法越来越接近将目标检测任务抽象成类似图像分割(语义,实例),姿态估计,人脸对齐这样的对于点的回归任务来做,而不是像之前的对Anchor修正的方式。所以Anchor Free需要一个更大尺寸的feature map来支撑这个任务,反而feature map厚度变小了,而Anchor base方法的feature map厚度普遍都比较大。

resnet主干的centernet

centernet同样选择了resnet18和resnet101主干 ,结合上面说到的下采样倍率,就会带来一个问题,怎么让resnet的结构下采样2次,4倍,而不是原来的5次,32倍?
centernet选择在resnet最后接上转置卷积,一共接了三层,每一层stride=2,这样一来原本降下的倍率又被重新升上去,变成了2,4,8,16,32,16,8,4的结构。

人体关键点预测

CenterNet由于其简洁的结构,使它非常容易的扩展到其他任务上,比如人体姿态估计,也可以成为CenterPose,以coco的17点姿态估计为例,CenterPose的输出为:

  1. Center Heatmap: 1 × H × W 1\times H\times W 1×H×W,最大值即为目标中心
  2. Center offset: 2 × H × W 2\times H\times W 2×H×W, 预测中心与真值的偏移量
  3. Center Box size: 2 × H × W 2\times H\times W 2×H×W,每个目标中心处,包含BBox大小的
  4. Center Points offset: 34 × H × W 34\times H\times W 34×H×W,每个关键点,相比于中心点的偏差
  5. Points Heatmap: 17 × H × W 17\times H\times W 17×H×W, 预测中心与真值的偏移量
  6. Points offset: 34 × H × W 34\times H\times W 34×H×W,每个关键点的中心处,与真值得offset

CenterPose一共有六个分支的输出,前四个定义了单类的目标检测任务和17个点关于中心点的偏移,这是一套17个关键点的预测,后两个定义了17点的预测以及它们各自的offset,这又是一套17个关键点的预测,所以CenterPose一共预测了两套关键点,这样冗余的设计是有意义的:
首先直接对于点的预测可信度应该是更高的(分支5),但是它没办法关联成一个person,这个关联要考分支4,因为分支1、2、3定义了一个person,分支4的offset可以估计出17个点,这17个点可以根据距离关联到5、6预测的17个点上,而对于同样5、6没有预测到的点,可以使用4的点来输出。
当然CenterPose的损失就需要有6个了。

CenterNet性能评价

在这里插入图片描述
首先对于backbone的对比,CenterNet也使用了Hourglass-104,由于它比DLA-34大很多,所以效果也在变好,而这里提及的ResNet也不是原版的ResNet结果,而是带了转置卷积和可形变卷积的,这些主干网络其实是在参考语义分割和姿态估计任务。
在这里插入图片描述
最后这张表很有说服力,上面是two-stage方法,下面是one-stage方法,其中包括anchor base和anchor free,anchor base里的YOLOv3被拉开了一大截,而另一个Anchor Free的CornerNet,由于是Hourglass-104的backbone,效率也没办法了CenterNet比,所以综合效率和性能,CenterNet还是很不错的。

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

Yolo-v8.3

Yolo-v8.3

Yolo

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

这两个错误信息分别涉及 **内存分配失败** 和 **网络缓冲区耗尽**,可能由同一系统的资源问题引发。以下是详细分析和解决方案: --- ### **错误 1: `grep: write error: Cannot allocate memory`** #### **原因** 1. **系统内存不足** - 物理内存或交换空间(swap)耗尽,导致 `grep` 无法分配缓冲区。 - 可能伴随 `Out of memory (OOM)` 错误或进程被 `OOM Killer` 终止。 2. **进程内存限制** - 用户或进程的 `ulimit` 限制(如 `virtual memory` 或 `data segment` 大小)。 3. **文件描述符泄漏** - 大量打开的文件或管道未关闭,导致内存碎片化。 #### **解决方法** 1. **检查系统内存** ```bash free -h # 查看内存和交换空间使用情况 top # 观察内存占用高的进程 dmesg | grep -i oom # 检查是否触发 OOM Killer ``` 2. **调整进程限制** ```bash ulimit -a # 查看当前限制 ulimit -v unlimited # 临时解除虚拟内存限制(需权限) ``` 3. **优化 `grep` 命令** - 避免处理大文件时占用过多内存: ```bash grep "pattern" large_file.log | less # 分页输出 ``` - 使用 `LC_ALL=C` 加速搜索(禁用多字节字符处理): ```bash LC_ALL=C grep "pattern" file ``` --- ### **错误 2: `sendto failed: No buffer space available`** #### **原因** 1. **内核网络缓冲区耗尽** - 系统为套接字分配的发送/接收缓冲区(`wmem`/`rmem`)已满。 - 可能由高并发、网络拥塞或应用程序未正确释放资源导致。 2. **系统级限制** - `net.core.wmem_max`、`net.core.rmem_max` 等参数设置过低。 3. **网络堆栈问题** - 防火墙、路由配置错误或硬件问题导致数据包堆积。 #### **解决方法** 1. **调整网络缓冲区大小** ```bash # 临时增大缓冲区 sysctl -w net.core.wmem_max=12582912 # 12MB sysctl -w net.core.rmem_max=12582912 # 永久生效(修改 /etc/sysctl.conf) echo "net.core.wmem_max=12582912" >> /etc/sysctl.conf echo "net.core.rmem_max=12582912" >> /etc/sysctl.conf sysctl -p ``` 2. **优化应用程序** - 减少发送速率,避免突发流量。 - 确保套接字在关闭时释放资源(如调用 `close()`)。 3. **检查网络状态** ```bash netstat -s | grep -E "lost|retransmit" # 查看丢包和重传 ss -s # 查看套接字统计 ``` --- ### **共同根源与系统级修复** 1. **系统资源耗尽** - 两个错误可能同时出现,表明系统整体资源不足(内存 + 网络缓冲区)。 - **解决方案**: - 增加物理内存或交换空间。 - 终止非必要进程释放资源。 2. **内核参数调优** - 调整以下参数(需 root 权限): ```bash # 增加内存分配限制 sysctl -w vm.overcommit_memory=1 # 允许过度分配内存 sysctl -w vm.swappiness=10 # 减少交换分区使用 # 优化 TCP 缓冲区 sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216" sysctl -w net.ipv4.tcp_wmem="4096 16384 16777216" ``` 3. **监控与日志** - 使用 `vmstat`、`iftop`、`nethogs` 监控资源使用情况。 - 检查系统日志: ```bash journalctl -xe | grep -i "memory\|network" ``` --- ### **示例修复流程** 1. **处理内存不足** ```bash # 1. 释放内存 sync; echo 3 > /proc/sys/vm/drop_caches # 2. 终止占用内存的进程(谨慎操作) pkill -9 memory_intensive_process # 3. 增加交换空间(临时) fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile ``` 2. **修复网络缓冲区问题** ```bash # 1. 重启网络服务(可选) systemctl restart networking # 2. 调整应用程序逻辑(如添加发送延迟) # 在代码中增加 usleep(1000) 避免爆发式发送 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值