Fast, Accurate Detection of 100,000 Object Classes on a Single Machine(转载)

Fast, Accurate Detection of 100,000 Object Classes on a Single Machine 读后记录

这篇文章是CVPR 2013 best paper。

这篇文章的牛,主要体现在一些关键数字上,可以分类100000类别,比base line快了20000倍。

不过,美中不足的是,其单机处理一幅图像的速度,需要20s,而且,100000类mAP为0.16,看上去很美,但是距离实用还有一些距离。

这篇文章的卖点在于速度快,具体就是对于多类检测问题,检测速度可以做到和类别数目无关。

对于包含C类的物体检测而言,一个基本的框架是,训练C个分类器,对于每个候选位置,用每个分类器都判定一遍,然后做后处理融合。这样的坏处是速度太慢,处理速度和物体类别成反比(线性,算法复杂度O(C))。

这篇文章参考的base line算法是DPM模型,就是每个物体的模型由多个part(假定P个)的模型组成,每个part的模型可以看作是一个filter和该位置特征的点积(整体上可以看作是一个convolution过程),然后根据可能的part候选的位置约束确定物体的位置。在实际中,最耗时的是convolution过程,每个物体分类器的filter(对应weight)都需要和候选位置的特征进行一次点积处理,假定候选窗口数目为W个,候选窗口的feature dimension是M维,则运算复杂度为W*C*P*M。

这篇文章利用了之前的一个工作的结果,可以将两个向量的点积(其实点积和cos距离有非常强的关联,如果预先对参与cos距离运算的两个向量进行模的归一化处理,则归一化后两向量的cos距离和点积是相同的)相似度转化为两个hash值的hamming距离。

距离将feature转换为lsh hash的过程如下(得到的hash是LSH hash,也是WTA hash):

假定共M维feature,设K为保留的中间元素数目

设定一个重排数组(随机得到,个数为M,元素为0-M-1,每个元素的序号表示临时feature对应原始feature中的序号),从而将原始feature转变为一个临时feature,取临时featue的前K维,组成最终的新feature,则新feature中最大元素序号(新feature中)为k,将k表示为一个log(K)位的二进制数字串

继续设定共N个重排数组(随机得到),则得到共N*log(K)位的二进制串,按照最前面的重排数组对应的串放在最低位的原则,得到一个hash值(N*log(K)位整数)。

对应的,两个feature之间的点积转化为两个对应hash之间的hamming距离。

直观上看,由于如此得到的数字只和数字之间的相互大小有关,且每次保留最大的序号的信息,因此,对于数字的扰动非常鲁棒。因此,得到的两个hash值之间的hamming距离所对应的相似度对于特征值的变化更加鲁棒,是更有效的表示(到底是否是这样,无从得知,其他信息请参考J. Yagnik, D. Strelow, D. A. Ross, and R.-s. Lin. The powe of comparative reasoning. In IEEE International Conference on Computer Vision, 2011.)。

由于计算两个hash之间的hamming距离非常快速(还可以查表),因此最耗时的部分在计算每个窗口的feature以及计算hash值上,这个运算和类别数目无关。

上述可以用于点积衡量相似度的特征,可以是各种各样的特征,在物体检测里面最常用的要数HOG特征了。

下面以HOG特征为例,说明base line 算法和本文提出的改进之间计算时间的对比:

base line算法的计算过程如下:

1,计算多尺度的边缘强度和边缘方向图像;

2,对所有窗口进行遍历

对于每个窗口,

计算其高斯加权HOG直方图特征

分别计算HOG特征和C类P个filter的点积

3,

将具有局部最大响应的窗口作为候选,得到可能的物体中心的分布累积

综合得到最终的物体检测结果

改进算法计算过程如下:

事先计算得到C*P个filter对应的hash值

1,计算多尺度的边缘强度和边缘方向图像;

2,对所有窗口进行遍历

对于每个窗口,

计算其高斯加权HOG直方图特征

计算特征对应的hash值

分别计算HOG特征hash值和C类P个filter的hash值的hamming距离

3,

将具有局部最大响应的窗口作为候选,得到可能的物体中心的分布累积

综合得到最终的物体检测结果

对比可以看到,由于改进算法中,计算hamming距离的部分非常快,可以忽略,因此,最终得到的多类检测器的运算量和类别数目无关。

进一步,为了快速运算,可以将上述的hamming距离计算转换为查表运算,为了当累积相似度高于阈值时无需继续计算,将hash值划分为多个不同部分(这样每个表也比较小)。

将N*log(K) bit的hash分为N/M组(band),每组是一个M*log(K) bit的整数,对于每个类别每个part的filter(训练模型),对应N/M组查找表(查找表的序号为当前窗口feature在该band上的hash值,查找表记录的值为该featurehash值和模型hash值的相似度),从而避免了hamming距离计算过程。每个filter取到的N/M组查找表的值的累积和为对应的点积值(相似度)。对N/M组累积和计算,当计算发现相似度大于阈值时,则放弃后面的运算,直接对预估物体位置分布进行累积。

则最终得到物体位置分布累积最大的位置为检测得到的物体位置。

文章中还有一些特殊的细节(比如root filter,以及在快速计算之后继续用点积计算相似度等),不再赘述。

文章中还有一点值得讨论的地方在于,作者的100000类数据都是搜索引擎爬取的,没有经过人工标定,所以结果存在一定不准确的地方。但是定性上看,这样做确实快了很多。

当然,相对base line算法,本文提出的算法在精度上还是降低一些的(见论文voc 2007的对比结果,mAP由0.26->0.24)。而耗费的20G内存,推测主要应该是查找表对应的内存。

启发:

1,这个思路,对于基本操作为点积(x*y)运算的,都可以加速,这个操作非常常见,比如线性svm,cos距离,以及神经网络和LR里面的wx等等,都可以使用。一个比较容易想到的是可以应用于multi-model检测框架中(比如多类别物体检测,多姿态人脸/汽车检测等等);

2,对于多模型检测,速度是一个非常重要的方面,一般的思路就是在提高单个模型速度(feature和分类器计算速度)的情况下,增加特征共用(LAB feature image, vector boosting),其实,最理想的特征共用是deep learning模型(只在最后一层不同,其它层都是共用的,每个隐节点可以看作是feature,所有类别共用feature,只在输出层时,计算一个wh+b项,是非常理想的特征共用),只可惜单个deep learning模型太慢,当遍历多个检测候选窗口时,最终的速度现在看太慢了,谁感兴趣可以好好想想这个问题;

补充:其实这个方法可能用于加速神经网络模型(当然包括deep learning),难点在于点积变为hash距离的近似比较大,未必会有好的结果,谁去想想试试吧;

时间: 2024-10-17 08:39:32

Fast, Accurate Detection of 100,000 Object Classes on a Single Machine(转载)的相关文章

基于100,000篇演讲的分析数据科学家发现了最佳演讲者的特征——及时解释听众不懂的词语,必要时提高10%的音调,正确和恰当的手势,氛围的营造

[TD精选] 基于100,000篇演讲的分析数据科学家发现了最佳演讲者的特征 相信大部分人一定试图寻找过使得自己的演讲变得更加吸引人,更加有气势的方法.现如今,在大数据工具和机器学习技术的辅助下,找到完美演讲的答案已经变得十分容易.Noah Zandan, CEO of Quantified Communications, 为人们提供了第一个能够分析,衡量,评估以及提高人们交流和演讲技巧的分析平台.Zandan 的数据团队分析了100,000多篇来自于企业家,政治家和演说家的演讲.他们将分析重点

在100,000个核心集群上运行100万个作业

随着客户在更大的环境中部署OpenLava.可扩展性,吞吐量和性能变得越来越重要.为了满足这些领域的客户需求,OpenLava 提供了一些重要的增强功能: o  并行化作业事件处理以加速集群启动并最小化停机时间. o   增强的守护进程间通信,提高效率和性能. o   其他调整参数,为集群管理员提供其他工具,以提高性能,响应速度和可扩展性. 在发布OpenLava之前,天云软件使用HPC Cluster-as-a-Service在100,000个内核组成的集群上进行了大规模测试,这是我们迄今为止

惊!新的勒索病毒在中国迅速蔓延,已感染超过100,000台计算机!

近日,一个新的勒索软件正在中国迅速蔓延,来势汹汹! 由于其使用"供应链***"的方式传播病毒,过去四天已经感染了超过100,000台计算机,并且受感染用户的数量每小时都在不断增加. 与大多数勒索软件恶意软件不同,这个新病毒不需要使用比特币支付赎金,而是***者要求受害者通过微信支付支付110元(近16美元)的赎金 - 微信支付是中国最受欢迎的支付功能.勒索软件+密码窃取器 - 与去年引起全球混乱的WannaCry和NotPetya勒索软件爆发不同,新的中国勒索软件只针对中国用户.它还能

Error: Cannot fit requested classes in a single dex file (# methods: 149346 > 65536)

引用第三方库的jar文件,都有可能会触发这个错误.解决方案如下: 参考<[Android]Cannot fit requested classes in a single dex file. Try supplying a main-dex list.> 一.在app的build.gradle中添加依赖,在defaultConfig中添加以下代码[注意:必须是app这个module,不能是其他的module] apply plugin: 'com.android.application' an

实现 100000 到100,000显示

function t(n){ var arr=[],i=1000,k=0; if(n<1000) return n; while(n/i>=1){ var j=n%i; if(n%i){ if(j>100){ arr.push(j); }else if(j>10){ arr.push('0'+j); }else{ arr.push('00'+j); } }else{ arr.push('000'); } n=Math.floor(n/i); } arr.push(n); arr.r

C#中system.object的函数方法功能介绍-转载

C#中system.object的函数方法功能介绍 在C#中,Object类型是所有类型的根,大家平常开发中都要跟它打交道,但不见得对它里面的每个方法都知根知底,下面对它里面的每个方法都进行仔细的总结. 概述: 构造函数 Equals函数 Finalize函数 GetHashCode函数 GetType()函数 ReferenceEquals函数 MemberWiseClone()函数 ToString()函数 Object类型中一共有8个方法,重载的方法没有算进来.下面一一来看看这些方法. 1

Lock的await/singal 和 Object的wait/notify 的区别(转载)

在使用Lock之前,我们都使用Object 的wait和notify实现同步的.举例来说,一个producer和consumer,consumer发现没有东西了,等待,producer生成东西了,唤醒. 线程consumer 线程producer synchronize(obj){     obj.wait();//没东西了,等待 } synchronize(obj){     obj.notify();//有东西了,唤醒 } 有了lock后,世道变了,现在是: lock.lock(); con

Java学习笔记--HashMap中使用object做key的问题【转载】

在HashMap中,如果需要使用多个属性组合作为key,可以将这几个属性组合成一个对象作为key.但是存在的问题是,要做get时,往往没办法保存当初put操作时的key object的reference,此时,需要让key object覆盖如下hashCode()和equals(Object obj)的实现.sample code如下: public class TestKeyObject { private long id; private int type; public TestKeyOb

ICCV2013、CVPR2013、ECCV2013目标检测相关论文

CVPapers 网址: http://www.cvpapers.com/   ICCV2013 Papers about Object Detection: 1. Regionlets for Generic Object Detection. Xiaoyu Wang, Ming Yang, Shenghuo Zhu, Yuanqing Lin .(暂无源码提供) Website: http://www.xiaoyumu.com/project/detection 这篇文章提出了一种新的特征描