matlab下训练faster rcnn出现的错误

本文针对目标检测中出现的常见错误进行了详细的分析,并提供了具体的解决方案,包括处理容器中不存在指定键的错误、解决输入数组维度不匹配的问题等。

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

 

一、出现的问题

1、错误使用 containers.Map/values,此容器中不存在指定的键。出错 roidb_from_voc>attach_proposals (line 172)

gt_classes = class_to_id.values({voc_rec.objects(valid_objects).class})

答:你标注的目标种类与datasets/VOCdevkit2007/VOCcode/VOC2007/VOCiniy.m中指定的目标种类不匹配。比如你只在VOCinit.m中写了一个目标类型标签‘car',但你标记结果Annotations/中某个.xml中不小心标注两种对象object如'car'和'person’。这样机会报错,解决方法是重新标记那个.xml对应的图片,去掉多余的目标种类。

 

2、错误使用 proposal_prepare_image_roidb>scale_rois (line 110),两个输入数组的非单一维度必须相互匹配。

 

答:可能有如下原因:

①一是要识别的是plane并且标注的xml文件中目标名称也是plane,但VOCinit.m中写的目标类型标签是‘car',两者不匹配所以出问题,将VOCinit.m中的label改为'plane'即可;

②二是图片有问题,不是指.jpg或.png图片格式的问题,而是指图片本身存在问题。我是原因是:图片尺寸有问题,一般要求500*375或375*500,例如标准VOC数据集中基本都是这两种大小或者接近这两种大小的图片。我从百度图片上拷贝下来的图片尺寸千差万别,没有对尺寸进行修正直接训练,所以出错。

③可能是Annotations/中的xml文件文字格式有问题,我开始使用labelImg标注训练没问题,后来因为需要对xml文件内容做一定修改,就编写了一个matlab程序对所有的xml批量修改,然后就出错了。原因是修改后:紧凑型xml变为常规型,是的读取时多了几个空格节点。具体表现如下:

1°、xml开头多了一个xml声明格式语句:<?xml version="1.0" encoding="utf-8"?>;

2°、因为上述1中开头的格式设置,修改后的xml每行之间的空格也变大了。

4。有可能是因为缓存没有清理干净,imdb下和output都要清理

错误详细如下:

错误使用 proposal_prepare_image_roidb>scale_rois (line 110)
两个输入数组的非单一维度必须相互匹配。
 

出错proposal_prepare_image_roidb>@(x,y)compute_targets(conf,scale_rois(gt_rois,im_size,y),gt_labels,x,image_roidb_cell{i},y) (line 61)
           compute_targets(conf, scale_rois(gt_rois, im_size, y), gt_labels,  x, image_roidb_cell{i}, y), ...


出错 proposal_prepare_image_roidb>append_bbox_regression_targets (line 53)
    parfor i = 1:num_images


出错 proposal_prepare_image_roidb (line 43)
    [image_roidb, bbox_means, bbox_stds] = append_bbox_regression_targets(conf, image_roidb, bbox_means, bbox_stds);


出错 proposal_train (line 77)
                            = proposal_prepare_image_roidb(conf, opts.imdb_train, opts.roidb_train);


出错 Faster_RCNN_Train.do_proposal_train (line 7)
    model_stage.output_model_file = proposal_train(conf, dataset.imdb_train, dataset.roidb_train, ...


出错 script_faster_rcnn_VOC2007_ZF (line 45)
model.stage1_rpn            = Faster_RCNN_Train.do_proposal_train(conf_proposal, dataset, model.stage1_rpn, opts.do_val);

3.

错误使用 caffe_
glog check error, please check log and clear mex

出错 caffe.Net/forward_prefilled (line 109)
      caffe_('net_forward', self.hNet_self);

出错 caffe.Net/forward (line 142)
      self.forward_prefilled();

出错 fast_rcnn_test>check_gpu_memory (line 208)
        caffe_net.forward(net_inputs);

出错 fast_rcnn_test (line 67)
        max_rois_num_in_gpu = check_gpu_memory(conf, caffe_net);

出错 Faster_RCNN_Train.do_fast_rcnn_test (line 6)
    mAP                         = fast_rcnn_test(conf, imdb, roidb, ...

出错 script_faster_rcnn_VOC2007_VGG16 (line 78)
opts.final_mAP              = Faster_RCNN_Train.do_fast_rcnn_test(conf_fast_rcnn, model.stage2_fast_rcnn, dataset.imdb_test, dataset.roidb_test);

1、显存不足,需要改小batchsize

2、model里面的prototxt文件没有改好

3、如果在final test阶段出现这个问题,应该还是显存不足的问题,因为里面有一句话:出错 fast_rcnn_test>check_gpu_memory (line 208)

我的1080跑zf网络没有问题但是跑vgg16就算batchsize改小了也会报错。考虑可不可以final test阶段用cpu来跑,但是不知道从哪里改

二、.如何检查标签中的错误

1.格式有问题

删掉所有文件中utf8那一行(第一行):sed -i‘(匹配的字符串)’*.xml

2.标签有问题

把所有的标签都找出来:grep '<name>' *.xml >> serach.txt

用vim删除掉正确的标签 例如::g/ofo/d

那么剩下的标签就是错误标签

 

 

 

### mmdetection 训练 Faster R-CNN Loss NaN 解决方案 当遇到 `loss=nan` 问题时,这通常意味着模型训练过程中出现了数值稳定的情况。针对这一现象,在使用 mmdetection 框架训练 Faster R-CNN 时可采取如下措施: #### 数据预处理与验证 确保输入到网络中的数据是有效的非常重要。异常的数据可能导致损失函数计算失败而返回 `NaN` 值。 - **检查标注文件**:确认所有边界框的坐标都是正数,并且没有零宽度或高度的对象实例存在[^3]。 - **清理合规样本**:移除那些尺寸过小(如宽度或高度小于等于1像素)的目标框,因为这些极小对象在经过某些图像变换操作后容易造成数值溢出或下溢。 ```python def filter_small_boxes(annotations, min_size=1): filtered_anns = [] for ann in annotations: w, h = ann['bbox'][2:] - ann['bbox'][:2] if w >= min_size and h >= min_size: filtered_anns.append(ann) return filtered_anns ``` #### 调整超参数配置 合理的超参数设定有助于提高模型收敛性和稳定性。 - **调整学习率**:过高或合适的学习率可能是导致梯度爆炸的原因之一。尝试逐步减小初始学习率直到找到能够使训练平稳进行的最佳值[^4]。 - **优化器选择**:如果默认使用的SGD无法解决问题,则考虑切换至Adam或其他自适应型优化算法,它们往往能更好地控制更新步长从而减少发散风险[^2]。 ```yaml optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) optimizer = dict(type='SGD', lr=0.0025, momentum=0.9, weight_decay=0.0001) ``` #### 修改代码逻辑 有时框架内部实现细节也会影响最终结果。 - 对于两阶段检测器而言,确保仅在一个位置设置了适当的学习率衰减速率;而对于单阶段模型则需同时调整多个相关联的地方以保持一致性。 - 如果怀疑GPU架构设置当引起的问题,可以通过指定合适的CUDA版本及相关环境变量来进行排查。 通过上述方法可以有效地应对mmdetection训练Faster R-CNN期间发生的Loss变为NaN的现象。值得注意的是,具体实施效果取决于实际应用场景和个人实验条件的同组合方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值