Faster_Rcnn误检解决方案---强制负样本策略

本文探讨Faster_Rcnn误检问题,分析为何增加负样本对Yolo有效但对Rcnn效果有限。提出强制负样本策略,通过在数据标注阶段将误检目标设为特殊类别,确保其在训练中被优先选为负样本,以提高模型对误检背景特征的学习,从而改善误检问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述

误检是目标检测领域的一大难点,现有的检测算法都存在误检情况.
误检一般分成两类

1.固定特征的误检.误检对象与正样本存在相似的特征,如将集装箱误检为卡车.
2.没有规律的误检.这类误检没有什么特征可寻,具有一定的随意性,如将地面/天空误检为汽车.

对于第一类误检,我们经常采用的方法是将相应的负样本加入到训练数据集中;这一做法对于yolo系列的算法改善效果较明显【需要保证一定量的负样本】,但在实际应用中,我们发现:

通过添加负样本来优化误检问题这一策略对Rcnn系列的算法的改进效果并不明显

对于漏检问题,比如特定场景下的车辆或行人等,通过增加相应的样本数据同样能够实现较好的优化,而且这个策略对yolo系列和RCNN系列的算法都适应,即:

通过添加正样本来优化漏检问题这一策略对Rcnn系列的算法的改进效果较明显

×××说明:对于数据分布不均匀导致的明显漏检问题,添加样本能够起到较好的优化效果;但不是所有的漏检都能够通过增加样本来解决,如小目标问题、遮挡问题等,这些还是得从算法的角度进行优化;

继续我们关于rcnn误检的思考,总结起来有两个问题:

  1. 为什么yolo加负样本好使而rcnn却反应不佳????
  2. 同样是加样本,为什么rcnn对漏检的改善效果明显,但对误检的改善却不行???

关于这两个问题,我从算法的角度进行了一些解读和理解【个人观点】,其主要原因还是在于两者对正负样本的处理有所区别;anchor_base系列的目标检测算法,如yolov3、faster_rcnn等,在正负样本的处理过程中都会涉及两个重要的步骤:

  1. **assigner:**为每一个先验框[anchor]分配属性,即这个anchor是正样本、负样本还是忽略不计
  2. **sampler:**采取某种策略[如随机采样]从分配好的正负样本中选出对应数量的正负样本进行训练

关于assigner和sampler的理解以及更多正负样本的匹配策略,可以参考目标检测之正负样本详解,此处不再展开;

首先关于为什么yolo加负样本好使而rcnn却反应不佳?
我们知道,yolo和faster_rcnn在模型训练过程中会生成很多的anchor,通过assigner这一步操作,这些anchor被分成了正样本、负样本或忽略不计的样本,在正负样本中,负样本的数量往往远远超过正样本的数量,因此我们会再通过sampler操作筛选出一点数量的负样本送到网络中进行训练和学习,也就是说并不是所有的负样本都会送到网络中学习;
图像中的误检目标实际是一个负样本,如果在训练过程中关于这个误检目标的负样本anchor并没有送到网络中,那网络自然也就学不到这个背景特征,而且负样本的数量往往很多,而送去学习的负样本却很少,所以如果采用随机抽样的方法进行选取,误检目标做为负样本被送进网络学习的概率很低;
在实际训练中,关于rpn参数的设置如下【可以自己调整】:

    rpn=dict(
        assigner=dict(
            type='MaxIoUAssigner', #采用的Assigner策略
            pos_iou_thr=0.7,
            neg_iou_thr=0.3,
            min_pos_iou=0.2,
            ignore_iof_thr=0.3),
        sampler=dict(
            type='RandomSampler',#采用的samplerc策略,此处为随机抽样
            num=256,  #送到网络学习的样本总数,包括正样本和负样本
            pos_fraction=0.5, #送去训练的正样本占实际样本的比例【一般达不到】
            neg_pos_ub=-1,
            add_gt_as_proposals=False),
        allowed_border=128,
        pos_weight=-1,
        debug=False),

class RandomSampler(BaseSampler):

    def __init__(self,
                 num,
                 pos_fraction,
                 neg_pos_ub=-1,
                 add_gt_as_proposals=True,
                 **kwargs):
        super(RandomSampler, self).__init__(num, pos_fraction, neg_pos_ub,
                                            add_gt_as_proposals)

    @staticmethod
    def random_choice(gallery, num):
        """Random select some elements from the gallery.

        It seems that Pytorch's implementation is slower than numpy so we use
        numpy to randperm the indices.
        """
        assert len(gallery) >= num
        if isinstance
<think>好的,我现在需要解决用户在Python中使用Pillow库时遇到的AttributeError: 'ImageDraw' object has no attribute 'textsize'问题。首先,我得理解这个错误的原因。用户提到在生成词云图时报错,可能是在调用ImageDraw的textsize方法时发生的。 根据引用[4]的内容,这个问题可能与Pillow的版本有关。特别是当Pillow升级到10.0.0或更高版本时,ImageDraw模块中的textsize方法被移除了。所以,我需要检查用户当前的Pillow版本。如果版本是10.0.0及以上,那么降级到9.5.0或更早的版本可能可以解决问题。 接下来,我需要指导用户如何检查他们的Pillow版本。可以通过在Python环境中运行import PIL和print(PIL.__version__)来查看。如果确认是版本问题,用户需要使用pip安装旧版本的Pillow,比如pip install Pillow==9.5.0。 此外,如果用户无法降级版本,可能需要修改代码,使用替代方法。例如,引用[4]提到可以使用textbbox方法来代替textsize。textbbox返回一个包含文本边界的元组,从中可以提取宽度和高度。因此,将draw.textsize(text)改为draw.textbbox((0, 0), text)[2:4]可能有效。 还要注意,代码中是否正确导入了ImageDraw模块,是否有拼写错误或者其他语法问题。但根据错误信息,更可能的是版本兼容性问题。 最后,建议用户测试修改后的代码,确保问题已经解决。如果降级后仍然存在问题,可能需要尝试更旧的版本,比如9.4.0,如引用[4]所述。 总结解决方案步骤:检查版本,降级Pillow或修改代码使用替代方法。需要将这些步骤清晰地传达给用户,并提供具体的命令和代码示例,确保他们能顺利操作。</think>### 解决方案:Pillow库AttributeError: 'ImageDraw' object has no attribute 'textsize' 该问题主要由**Pillow版本升级导致API变更**引起。以下是具体解决步骤: --- #### **第一步:检查当前Pillow版本** 在Python环境中运行以下代码确认版本: ```python import PIL print(PIL.__version__) # 输出结果例如"10.0.0"[^4] ``` --- #### **第二步:降级Pillow到兼容版本** 如果版本≥10.0.0,通过以下命令降级: ```bash pip uninstall Pillow # 先卸载当前版本 pip install Pillow==9.5.0 # 安装兼容版本[^4] ``` --- #### **第三步:代码适配新API(可选)** 如果无法降级,改用`textbbox`方法替代`textsize`: ```python from PIL import ImageDraw # 原始报错代码 # width, height = draw.textsize(text) # 修改后代码 bbox = draw.textbbox((0, 0), text, font=font) # 获取文本边界框 width = bbox[2] - bbox[0] # 计算宽度 height = bbox[3] - bbox[1] # 计算高度 ``` --- #### **验证修复** 重新运行程序,确保错误消失。若仍存在问题,尝试进一步降级到`9.4.0`: ```bash pip install Pillow==9.4.0 ``` --- ### 关键原因 Pillow 10.0.0移除了`ImageDraw.textsize()`方法,改用`textbbox()`实现类似功能。若依赖旧版代码,需回退版本或适配新API。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值