Learning To Count Everything(论文阅读笔记)

Learning To Count Everything

在这里插入图片描述
论文地址:https://arxiv.org/abs/2104.08391
源码:https://github.com/cvlab-stonybrook/LearningToCountEverything
出处:CVPR 2021
作者单位:石溪大学, VinAI研究院

一、摘要

目前的计数工作主要集中于某种特定的类别,例如人、动物或者细胞。在这篇文章中,作者将计数任务当做一个少样本(few-shot)回归任务,通过少数带注释的实例来计数一切

作者设计了一个新的方法,将查询图像与来自查询图像的一些范例对象结合在一起,并为查询图像中所有感兴趣的对象预测一个密度图,并提出了一种新的适应策略,使网络在测试时适应任何新的视觉类别。

数据方面,作者提供了一个包含147个类别,超过6000张图像的数据集( Few-Shot Counting-147,FSC-147)。数据集的标注采用了全部的点标注和3个矩形框标注两种格式。

实验结果表明,文中提出的方法在该数据集上优于几种最先进的目标检测和少量样本计数的方法。

二、介绍

目前,有两个主要的挑战阻碍计算机视觉领域设计出能够计算大量视觉类别的系统。

  1. 当前的计数方法将计数当做一个监督回归任务,这就导致了需要大量被标注的图片,而且很难处理大量的视觉类别;
  2. 没有任何足够大的无约束计数数据集,具有许多可视化的类别,以开发一种通用的计数方法。

为了解决上述两个挑战,作者在将计数定位为少样本回归任务,如图1所示。在这里插入图片描述

文章的主要贡献:

  1. 将计数任务定位为少样本回归任务;
  2. 提出了一个新的网络结构:Few Shot Adaptation and Matching Network (FamNet),包含两个主要的模块:特征提取模块(采用了resnet50)和密度预测模块,同时为了能在测试阶段适应新的类别,作者提出了一种少样本自适应方案来提高性能;
  3. 提出了一个数据集FSC-147。

二、相关工作

  1. 目前少样本学习的研究主要集中在图像分类任务上;
  2. 少样本检测任务与少样本计数的区别:
    少样本计数需要点标准,而少样本检测需要框标注
    少样本检测方法可能会受到严重遮挡的影响,而少样本计数是通过密度估计方法解决的,它对遮挡的鲁棒性比检测然后计数方法更强。
  3. 2018年提出的GMN模型,用于类无关计数。采用跟踪视频数据进行预训练,并具有显式自适应模块,使网络适应感兴趣的图像域。但GMN在测试时,需要较多标注样本来进行微调。

三、 Few-Shot Adaptation & Matching Network

3.1 Network architecture

在这里插入图片描述
4. 网络的输入:训练时输入密度图真值以及原图、3个标注框的位置;测试时输入图片+少量选取的样本框
5. feature extraction module:利用resnet 50的前面4个blocks(扔掉了全连接层),但冻结了这4个blocks的参数,不可改变,同时还用了FPN的多尺度来强化特征。
6. ROI pooling:将标注框所框的特征抠出来,池化成统一的大小。
7. feature correlation layer:ROI pooling取得的特征和特征提取器获得的特征做相关计算,得到的张量输入到下一层预测密度图。
8. density prediction module:预测密度图
9. 网络的输出:预测的密度图,目标的数量值(通过对所有的密度值求和得到)

FamNet由两个关键模块组成:

  1. 多尺度特征提取模块
    使用ImageNet预训练的网络进行特征提取,可以处理广泛的视觉类别。多尺度特征提取模块由来自预训练ResNet-50骨干网络的前四个块组成(这些块的参数在训练期间被冻结)。利用第三和第四个块处的卷积特征映射来表示图像。通过对第三和第四个Resnet-50块卷积特征映射执行ROI池化获得一个示例的多尺度特征。
  2. 密度预测模块
    为了使密度预测模块不受视觉类别的影响,不直接使用从特征提取模块获得的特征进行密度预测。相反,只使用范例特征和图像特征之间的相关映射作为密度预测模块的输入。
    为了解释在不同尺度下感兴趣的对象,将样本特征缩放到不同尺度,并将缩放后的样本特征与图像特征关联,从而获得多个相关map,每个尺度一个。在实验中,使用0.9和1.1的scales,以及原始的scales。将相关图串联并送入密度预测模块。
    密度预测模块由5个卷积块和3个上采样层组成,分别位于第一、第二和第三个卷积层之后。最后一层是1*1的卷积层预测2维密度图,其大小与输入图像一致。

3.2 Train

每个训练图像包含多个感兴趣的对象,但是只有范例对象用包围框注释,而且大多数对象只有点注释。

密度图的生成:由于数据集由147个不同的类别组成,这些类别中对象的大小差异很大。因此,作者使用自适应窗口大小的高斯平滑。首先,使用点注释来估计对象的大小。在点注释地图中,每个点都位于一个物体的近似中心,计算每个点与它最近的邻居之间的距离,并对图像中所有点的这些距离进行平均。这个平均距离用作高斯窗口的大小来生成目标密度图。高斯分布的标准偏差被设置为窗口大小的四分之一。

使用Adam优化器,学习速率为10−5,批大小为1。将每个图像的高度调整为384,并相应地调整宽度以保持原始图像的长宽比。

3.3 Test-time adaptation

在这里插入图片描述

  1. Min-Count Loss:每个框对应位置的物体数量应该至少是1个,若小于1个就产生损失。大于等于1不产生损失,框可能包含超过一个物体。
    在这里插入图片描述
  2. Perturbation Loss:从目标跟踪的研究借用correlation filter而来。给定一个需要跟踪的物体以及它的标注框,当一个框位于标注框的位置有最大的响应值,当这个框偏离了标注框,它的响应值根据距离指数型下降。
    在这里插入图片描述
  3. The combined adaptation Loss 综合损失:
    在这里插入图片描述The values for λ1 and λ2 are10−9 and10−4respectively.

四、数据集 FSC-147

4.1 图像采集

文章构建数据集采用了网络抓取的方式,并手动检查筛选图片并基于以下3个准则:高质量、目标数量够多、目标外观相似。

4.2 图像标注

工具:Computer vision annotation tool
在遮挡情况下,被遮挡的实例只有在被遮挡部分小于90%时才被计数和标注。对于每个图像,任意选择三个对象作为范例,并为这些实例绘制轴对齐的边框。

4.3 数据集划分

| | 图片数量| 类别数量 |
|–|–|-|–|–|
| 训练集 |3659| 89 |
|验证集|1286| 29 |
| 测试集|1190| 29 |

4.4 数据统计

在这里插入图片描述

五、实验

5.1 评价指标

在这里插入图片描述

5.2 与少样本方法比较

在这里插入图片描述

5.2 与目标检测方法比较

在这里插入图片描述

5.3 消融实验

在这里插入图片描述
在这里插入图片描述

5.4 对特定的类别计数

在这里插入图片描述

5.5 结果展示

在这里插入图片描述
第四张图的目标因为与背景相似所以估计的效果不理想。
在这里插入图片描述

六 总结

第一篇关注利用小样本实现新类别计数的论文。

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"Learning to Quantify" 是一个非常广泛的研究方向,这里提供一个比较通用的 Python 代码模板,可以用于各种不同的 Learning to Quantify 任务。 首先,需要导入一些必要的库: ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_absolute_error ``` 接下来,我们需要读入数据集。这里以一个简单的例子说明,数据集包含两个特征和一个目标变量: ```python data = pd.read_csv("data.csv") X = data.drop("target", axis=1) y = data["target"] ``` 接下来,将数据集分成训练集和测试集: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 接下来,定义一个函数来训练模型: ```python def train_model(X_train, y_train): model = LinearRegression() model.fit(X_train, y_train) return model ``` 然后,定义一个函数来计算模型在测试集上的 MAE(平均绝对误差): ```python def evaluate_model(model, X_test, y_test): y_pred = model.predict(X_test) mae = mean_absolute_error(y_test, y_pred) return mae ``` 最后,将这些函数组合起来,训练模型并评估它的性能: ```python model = train_model(X_train, y_train) mae = evaluate_model(model, X_test, y_test) print("MAE: ", mae) ``` 这是一个非常基础的 Learning to Quantify 的 Python 代码模板,可以根据具体的任务和数据集进行相应的修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值