ICCV 2021 Oral | 重新思考人群计数和定位:一个纯粹基于点的框架

点击下方卡片,关注“CVer”公众号

AI/CV重磅干货,第一时间送达

转载自:CV技术指南


Rethinking Counting and Localization in Crowds:A Purely Point-Based Framework

论文:https://arxiv.org/abs/2107.12746

代码:

https://github.com/TencentYoutuResearch/CrowdCounting-P2PNet

前言:

在人群中定位个体更符合后续高级人群分析任务的实际需求,而不是简单地计数。然而,现有的基于定位的方法依赖于作为学习目标的中间表示(即密度图或伪框)是违反直觉和容易出错的。

论文提出了一个纯粹基于点的框架,用于联合人群计数和个体定位。对于这个框架,论文提出了一个新的度量标准,称为密度归一化平均精度 (density Normalized Average Precision --nAP),而不是仅仅报告图像级别的绝对计数误差,以提供更全面和更精确的性能评估。

此外,论文在这个框架下设计了一个直观的解决方案,称为点对点网络(P2PNet)。P2PNet 丢弃了多余的步骤,直接预测一组point proposals来表示图像中的头部,与人类标注结果一致。通过彻底的分析,论文揭示了实现这种新颖想法的关键步骤是为这些proposals分配最佳学习目标。

P2PNet 不仅在流行的计数基准上显着超越了SOTA方法,而且还实现了有前途的定位精度。

出发点

  1. 在人群分析的所有相关具体任务中,人群计数是一个基本支柱,旨在估计人群中的个体数量。 然而,简单地给出一个数字显然远远不能支持后续更高层次的人群分析任务的实际需求,如人群跟踪、活动识别、异常检测、流量/行为预测等。

  2. 事实上,这个领域有一个明显的趋势,即除了简单的计数之外,更具有挑战性的细粒度估计(即个体的位置)。 具体来说,一些方法将人群计数视为头部检测问题,但在对小尺度头部进行劳动密集型注释上留下了更多的努力。 其他方法试图生成仅提供点注释的头部伪边界框,但这至少看起来很棘手或不准确。 同样试图直接定位个体,有几种方法在抑制或分裂过近的候选实例时陷入困境,由于头部尺度的极端变化,特别是对于高度拥挤的区域,它们容易出错。

  3. 在评估指标方面,一些有远见的工作鼓励采用补丁级别的指标进行细粒度评估,但它们仅提供了对定位的粗略衡量标准。 其他现有的定位感知指标要么忽略了人群中的显着密度变化,要么缺乏对重复预测的惩罚。

创新思路

  1. 为了解决上述问题,论文提出了一个纯粹基于点的框架,用于联合计数和定位人群中的个人。 该框架直接使用点标注作为学习目标,同时输出点来定位个体,受益于点表示的高精度定位特性和相对便宜的标注成本。

  2. 论文提出了一种称为密度归一化平均精度 (density Normalized Average Precision --nAP) 的新指标,为定位和计数错误提供综合评估指标。nAP 指标支持框和点表示作为输入(即预测或注释),没有上述缺陷。

  3. 作为这个新框架下的直观解决方案,论文开发了一种新方法来直接预测一组具有图像中头部坐标及其置信度的point proposals。具体来说,论文提出了一个点对点网络 (P2PNet) 来直接接收一组带标注的头部点用于训练,并在推理过程中预测点。

    为了使这样的想法正确工作,论文深入研究了ground truth target分配过程,以揭示这种关联的关键。结论是,无论是多个proposals 与单个ground truth匹配的情况,还是相反的情况,都会使模型在训练期间混淆,导致高估或低估计数。

    因此,论文建议通过匈牙利算法进行一对一匹配,将point proposals与其ground truth target相关联,未匹配的proposals 应归类为负样本。凭经验表明,这种匹配有利于改进 nAP 指标,作为论文在新框架下解决方案的关键组成部分。这种简单、直观和高效的设计产生了SOTA的计数性能和有前途的定位精度。

 

Methods

Purely Point-based Framework

这里简要说明这种新框架的思路。给定一个有N个个体的图像,用N个点来表示个体的头部中心点。网络输出两个东西,一个是预测头部的中心点P,一个是该中心点的置信度C。目标是使预测点与ground truth尽可能地接近,并有足够高的置信度。

与传统的计数方法相比,该框架提供的个体位置有助于那些基于运动的人群分析任务,如人群跟踪、活动识别、异常检测等 此外,该框架不依赖于劳动密集型标注、不准确的伪框或棘手的后处理,受益于原始点表示的高精度定位特性,特别是对于人群中高度拥挤的区域。

因此,这个新框架由于其相对于传统人群计数的优势和实用价值而值得更多关注。 然而,由于存在严重的遮挡、密度变化和标注错误,处理这样的任务是非常具有挑战性的 ,这在 [13] 中甚至被认为是理想的但不可行的。

Density Normalized Average Precision

一个预测点 pˆj 只有在它可以匹配到某个ground truth pi 时才被归类为 TP。 匹配过程由基于像素级欧几里德距离的准则 (ˆpj , pi) 指导。 然而,直接使用像素距离来测量亲和度忽略了人群之间大密度变化的副作用。 因此,为此匹配标准引入了密度归一化,以缓解密度变化问题。

简单说来就是引入最近邻K(取3)个点,将它们的距离归一化。

 

用公式表示如下:

 


预测与ground truth匹配方案

 

(a) 在为每个ground truth点选择最近的提议时,多个ground truth点可能与同一个提议匹配,这会导致计数低估。 (b) 在为每个提案选择最近的ground truth时,多个提案可能会与相同的地面实况点匹配,这会导致高估计数。 (c) 论文通过匈牙利算法进行一对一匹配没有以上两个缺陷,因此适合直接点预测。

 

 P2PNet

 

P2PNet 的整体架构

建立在 VGG16 之上,它首先引入了一个上采样路径来获得细粒度的深度特征图。 然后它利用两个分支同时预测一组点提议及其置信度分数。pipeline中的关键步骤是确保point proposals和ground truth点之间的一对一匹配,这决定了这些proposals的学习目标。

 

loss function如下:

Conclusion

ICCV和CVPR 2021论文和代码下载

后台回复:CVPR2021,即可下载CVPR 2021论文和代码开源的论文合集

后台回复:ICCV2021,即可下载ICCV 2021论文和代码开源的论文合集

后台回复:Transformer综述,即可下载最新的两篇Transformer综述PDF

重磅!人群计数交流群成立

扫码添加CVer助手,可申请加入CVer-人群计数微信交流群,方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、PyTorch和TensorFlow等群。

一定要备注:研究方向+地点+学校/公司+昵称(如人群计数+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群

▲长按加小助手微信,进交流群

▲点击上方卡片,关注CVer公众号

整理不易,请点赞和在看

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我会根据您的要求来编写一个基于atmega48单片机的异步串口通信程序,让两台单片机能够相互通信。以下是代码示例: ```c #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 8000000UL #define BAUD_RATE 9600 #define UBRR_VALUE ((F_CPU / (BAUD_RATE << 4)) - 1) #define RX_BUFFER_SIZE 32 #define TX_BUFFER_SIZE 32 volatile uint8_t rx_buffer[RX_BUFFER_SIZE]; volatile uint8_t rx_write_index = 0; volatile uint8_t rx_read_index = 0; volatile uint8_t tx_buffer[TX_BUFFER_SIZE]; volatile uint8_t tx_write_index = 0; volatile uint8_t tx_read_index = 0; void usart_init(void) { UBRR0H = (uint8_t)(UBRR_VALUE >> 8); UBRR0L = (uint8_t)(UBRR_VALUE); UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); } void usart_tx_byte(uint8_t data) { while (((tx_write_index + 1) % TX_BUFFER_SIZE) == tx_read_index) {} tx_buffer[tx_write_index] = data; tx_write_index = (tx_write_index + 1) % TX_BUFFER_SIZE; UCSR0B |= (1 << UDRIE0); } ISR(USART_RX_vect) { uint8_t data = UDR0; if (((rx_write_index + 1) % RX_BUFFER_SIZE) != rx_read_index) { rx_buffer[rx_write_index] = data; rx_write_index = (rx_write_index + 1) % RX_BUFFER_SIZE; } } ISR(USART_UDRE_vect) { if (tx_write_index != tx_read_index) { UDR0 = tx_buffer[tx_read_index]; tx_read_index = (tx_read_index + 1) % TX_BUFFER_SIZE; } else { UCSR0B &= ~(1 << UDRIE0); } } int main(void) { usart_init(); sei(); while (1) { if (rx_write_index != rx_read_index) { uint8_t data = rx_buffer[rx_read_index]; rx_read_index = (rx_read_index + 1) % RX_BUFFER_SIZE; usart_tx_byte(data); } } return 0; } ``` 这段代码实现了异步串口通信,并且能够让两台单片机相互通信。您只需要将两个单片机分别烧录上这段代码,并将它们连接在一起,就可以实现通信了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值