[Revisiting RCNN] On Awakening the Classification Power of Faster RCNN

1、hard FP

    1)极少量的高置信度FP是mAP明显下降的主要原因

    2)hard FP主要有三种:

        - 框只覆盖部分目标(IoU小):只覆盖了有辨别力的part

        - 相似类之间的区分错误:不同类之间share有辨别力的part;分类器不够强大

        - 背景错分为目标:背景pattern与目标相似;感受野过大,包含了相邻的目标物体

        * 均由suboptimal分类器导致

2、Faster R-CNN的弊端

    1)分类和定位的目标不同,因此共享的特征对两个任务来说并不是最优的

        * 分类需要translation invariant特征;定位需要translation covariant特征

    2)多任务学习有相互促进的作用,但multi-task loss的最优,对于子任务的loss来说并不是最优的

        * MTL适用于backbone较弱的情况,当backbone足够强大时,multi-task无法发掘backbone的潜力

    3)proposal的不同目标共享相同的感受野,对于小目标是冗余的,对大目标来说不够(但是不同大小的anchor在roi pooling之后对应的feature map范围不同,所以这一点不能理解

        * 尽管一些网络采用了multi-scale策略,但multi得远远不够

    4)sub-sampling操作可能会引入严重的unalignment,例如一个像素的偏移,下采样32倍后,会导致32个像素的偏移

4、Decoupled Classification Refinement (DCR)网络

    1)Faster R-CNN输出检测结果,作为region proposal,每个proposal的置信度为score_frcnn

    2)根据proposal,在原图上crop-resize相应区域到固定size(相当于把ROI Pooling放到了原图上,但ROI Pooling的感受野明显更大)

    3)用hard FP训练类似于R-CNN结构的强分类器,每个proposal的置信度为score_dcr

    4)test时,score = score_frcnn * score_dcr,只用score_dcr结果很差,因为rcnn无定位功能,是强分类器,倾向于crop中出现部分目标就预测为正

    * DCR和Faster R-CNN不共享参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VLAD(Vector of Locally Aggregated Descriptors)是一种图像表示方法,常用于图像检索和计算机视觉任务中。它通过聚合局部特征描述符来生成图像的紧凑表示。 以下是一个简单的C++实现示例,展示了如何实现VLAD图像表示: ```cpp #include <iostream> #include <vector> #include <opencv2/opencv.hpp> // 聚类算法(这里使用K-means) cv::Mat kmeansClustering(const std::vector<cv::Mat>& descriptors, int numClusters) { cv::Mat allDescriptors; for (const cv::Mat& descriptor : descriptors) { allDescriptors.push_back(descriptor); } cv::Mat labels, centers; cv::TermCriteria criteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 100, 0.01); cv::kmeans(allDescriptors, numClusters, labels, criteria, 1, cv::KMEANS_PP_CENTERS, centers); return centers; } // 计算VLAD图像表示 cv::Mat computeVLAD(const std::vector<cv::Mat>& descriptors, const cv::Mat& visualWords) { int descriptorSize = descriptors[0].cols; cv::Mat vlad(visualWords.rows, descriptorSize, CV_32F, cv::Scalar(0)); for (const cv::Mat& descriptor : descriptors) { // 找到每个描述符最近的视觉词 cv::Mat difference = visualWords - descriptor; cv::Mat distances; cv::reduce(difference.mul(difference), distances, 1, cv::REDUCE_SUM); cv::Point minLoc; cv::minMaxLoc(distances, nullptr, nullptr, &minLoc); // 计算每个视觉词的残差 cv::Mat residual = descriptor - visualWords.row(minLoc.y); // 更新VLAD表示 for (int i = 0; i < descriptorSize; i++) { vlad.at<float>(minLoc.y, i) += residual.at<float>(0, i); } } // 归一化VLAD表示 cv::normalize(vlad, vlad, 1.0, 0.0, cv::NORM_L2); return vlad; } int main() { // 假设有一组局部特征描述符(使用OpenCV的Mat表示) std::vector<cv::Mat> descriptors = { (cv::Mat_<float>(1, 128) << /* descriptor values */ ), (cv::Mat_<float>(1, 128) << /* descriptor values */ ), (cv::Mat_<float>(1, 128) << /* descriptor values */ ), // ... }; // 聚类算法,得到视觉词汇 int numClusters = 100; cv::Mat visualWords = kmeansClustering(descriptors, numClusters); // 计算VLAD图像表示 cv::Mat vlad = computeVLAD(descriptors, visualWords); // 输出VLAD表示结果 std::cout << "VLAD Representation:\n" << vlad << std::endl; return 0; } ``` 在这个示例中,`descriptors`是一组局部特征描述符,每个描述符用一个`cv::Mat`对象表示。首先,使用K-means聚类算法将所有描述符聚类成`numClusters`个视觉词汇,并得到`visualWords`矩阵。然后,根据每个描述符找到最近的视觉词,并计算每个视觉词的残差。将残差累加到VLAD表示中,并进行归一化处理。最后,输出VLAD图像表示结果。 请注意,这只是一个简单的VLAD图像表示的C++实现示例,供你参考。在实际应用中,你可能需要根据具体需求进行修改和扩展,例如使用更复杂的特征提取方法、改进聚类算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值