目录

准备工作

源码下载

配置环境

制作VOC数据集

data目录结构

训练

编译CUDA依赖环境

预训练模型

修改pascal_voc.py文件

进行训练

遇到的问题

主要参考文章


准备工作

源码下载

Faster R-CNN pytorch0.4.0版源码:GitHub - jwyang/faster-rcnn.pytorch: A faster pytorch implementation of faster r-cnn
Faster R-CNN pytorch1.0.0版源码:GitHub - jwyang/faster-rcnn.pytorch at pytorch-1.0

配置环境

在requirements.txt所在的目录下用如下命令安装所需库

pip install -r requirements.txt

注意在这之后最好将scipy库降版本,如安装1.2.1版本,不然后面可能会报错

pip uninstall scipy
pip install scipy==1.2.1

制作VOC数据集

制作自己的VOC格式数据集:记录Open Image v4数据集转化为VOC格式_ZZZZ_Y_的博客-CSDN博客

创建软链接指向数据集,不用复制数据集到项目指定路径下额外占用内存:Windows、Linux创建软链接_windows创建链接_ZZZZ_Y_的博客-CSDN博客

data目录结构

data
├─VOCdevkit2007
│  └─VOC2007
│      ├─Annotations
│      ├─ImageSets
│      │  ├─Layout
│      │  ├─Main
│      │  └─Segmentation
│      ├─JPEGImages
│      ├─SegmentationClass
│      └─SegmentationObject
└─pretrained_model

pretrained_model下存放的是预训练模型,

Annotations下存放的是xml标签文件,

JPEGImages下存放的是jpg图片数据文件,

ImageSets下的Main文件夹下存放的是训练集验证集和测试集txt文件,里面是图片的序号

训练

编译CUDA依赖环境

cd lib
python setup.py build develop

预训练模型

预训练模型要存放在pretrained_model文件夹下

修改pascal_voc.py文件

修改文件路径 faster-rcnn.pytorch/lib/datasets/pascal_voc.py文件中的检测类别

类别名要是小写!

进行训练

CUDA_VISIBLE_DEVICES=0 python trainval_net.py --dataset pascal_voc --net res101 --bs 4 --nw 4 --lr 0.005 --lr_decay_step 5 --cuda --epochs 50

测试

使用如下代码测试:

CUDA_VISIBLE_DEVICES=9 python test_net.py --dataset pascal_voc --net res101 --checksession 1 --checkepoch 1 --checkpoint 6755 --cuda

demo.py

使用如下命令运行demo.py

CUDA_VISIBLE_DEVICES=0 python demo.py --net res101 --checksession 1 --checkepoch 4 --checkpoint 13512 --cuda --load_dir models

报错:RuntimeError: Error(s) in loading state_dict for resnet:

RuntimeError: Error(s) in loading state_dict for resnet:size mismatch for RCNN_cls_score.weight: copying a param with shape torch.Size([16, 2048]) from checkpoint, the shape in current model is torch.Size([21, 2048]).size mismatch for RCNN_cls_score.bias: copying a param with shape torch.Size([16]) from checkpoint, the shape in current model is torch.Size([21]).size mismatch for RCNN_bbox_pred.weight: copying a param with shape torch.Size([64, 2048]) from checkpoint, the shape in current model is torch.Size([84, 2048]).size mismatch for RCNN_bbox_pred.bias: copying a param with shape torch.Size([64]) from checkpoint, the shape in current model is torch.Size([84]).

继续报错:

修改demo.py代码中的检测类别:

服务器资源不够,大家都在用,今天没法测试(test+demo)了

遇到的问题

1. 编译时报错invalid command 'develop'

usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]or: setup.py --help [cmd1 cmd2 ...]or: setup.py --help-commandsor: setup.py cmd --helperror: invalid command 'develop'

参考:python setup.py develop · Issue #92 · django-extensions/django-extensions · GitHub

setup.py文件中的

from distutils.core import setup

替换为

from setuptools import setup

然后在服务器终端激活虚拟环境,cd到相应的目录,依次执行以下命令:

conda activate your_env_name
cd lib
python setup.py build develop

开始编译了!

2. 其中会遇到 can't import imread ,可通过scipy降版本解决,可降为1.2.1

pip uninstall scipy
pip install scipy==1.2.1

3. libstdc++.so.6: version `GLIBCXX_3.4.30' not found

ImportError: /home/zy/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/lib/../../../../libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /home/zy/anaconda3/envs/pytorch/lib/python3.6/site-packages/cv2/cv2.abi3.so)

查看系统libstdc++.so.6文件中支持的GLIBCXX版本:

strings  /usr/lib/x86_64-linux-gnu/libstdc++.so.6   | grep GLIBC

如下图,最高版本为3.4.30

anaconda环境下libstdc++.so.6文件中支持的GLIBCXX版本:

strings  /home/zy/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/lib/../../../../libstdc++.so.6 | grep GLIBCX

anaconda环境下最高版本为3.4.29,但需要使用版本为3.4.30

参考Ubuntu系统anaconda报错version `GLIBCXX_3.4.30' not found - Death_Knight - 博客园 (cnblogs.com)

查看anaconda环境下libstdc++.so.6的相关文件:

ls libstdc++.so
ls libstdc++.so -al
ls libstdc++.so.6 -al
ls libstdc++.so.6.0.29 -al

使用如下命令查看系统库路径下,libstdc++.so.6的相关文件:

ls -al /usr/lib/x86_64-linux-gnu/libstdc++.so.6

目前anaconda环境中libstdc++.so和libstdc++.so.6的链接地址指向的为libstdc++.so.6.0.29

使用如下命令将anaconda环境中libstdc++.so和libstdc++.so.6的链接地址指向系统路径中的地址

rm libstdc++.so
rm libstdc++.so.6
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 libstdc++.so
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 libstdc++.so.6

再次查看发现链接的版本为6.0.30

也可以try这个,我用上面的方法成功了就没试下面这个了:

(已解决)Import报错 Version `GLIBCXX_3.4.22‘ not found_glibcxx_3.4.28_可可与鱼的博客-CSDN博客

4. 再次运行,上个报错解决了,又出现了新的问题

ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.

参考解决方法:【已解决】ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead._ShuqiaoS的博客-CSDN博客

我发现我用的是0.4.0的代码,所以才会出现这么多的问题,现在要换成1.0.1的代码了。。。 真的很难过,折腾了好久发现版本竟然是0.4.0的

Faster R-CNN pytorch0.4.0版源码:GitHub - jwyang/faster-rcnn.pytorch: A faster pytorch implementation of faster r-cnn
Faster R-CNN pytorch1.0.0版源码:GitHub - jwyang/faster-rcnn.pytorch at pytorch-1.0

0.4.0的可以看这个,(2条消息) Faster RCNN 环境配置_faster rcnn环境配置_吾人为学的博客-CSDN博客,我看这个还是用的0.4.0

5. 运行报错ImportError: cannot import name '_mask'

参考ImportError: cannot import name '_mask' · Issue #410 · jwyang/faster-rcnn.pytorch · GitHub

激活虚拟环境,cd到data目录安装coco API,执行以下命令

cd datagit clone https://github.com/pdollar/coco.gitcd coco/PythonAPImake

6. 新问题:TypeError: load() missing 1 required positional argument: 'Loader'

原因:新版本的ppyaml已经不支持旧版本的yaml.load(),

way1:可用以下三种方式替代:

yaml.load(file,Loader=yaml.FullLoader)
yaml.safe_load(file)
yaml.load(file, Loader=yaml.CLoader)

way2:降级pyyaml 版本 6.0降为5.4.1(我是用这样解决的,感觉也最方便)

pip uninstall pyyaml
pip install pyyaml==5.4.1

终于不报错了,感动

7. oh no ,有报错了

ValueError: Caught ValueError in DataLoader worker process 1.
ValueError: operands could not be broadcast together with shapes (683,1024,4) (1,1,3) (683,1024,4)

之前用的多个显卡,现在换成1个显卡,没有报错了,但是为什么rpn_cls,rpn_box等都是nan呢

好吧还是报错了,和上面一样,又发现我的数据集文件的命名都为5位数,应该是6位数

8. 修改之后报错 assert (boxes[:, 2] >= boxes[:, 0]).all()    AssertionError

参考(linux)Faster RCNN-pytorch1.0目标检测2:训练自己的数据集,gpu,pycharm, 训练笔记_chao_xy的博客-CSDN博客

修改lib/datasets/pascal_voc.py,_load_pascal_annotation(,)函数

将Xmin,Ymin,Xmax,Ymax 后的-1全部去掉

修改lib/datasets/imdb.py,append_flipped_images()函数

数据整理,在一行代码为 boxes[:, 2] = widths[i] - oldx1 - 1下加入代码:

aboxes = boxes
for b in range(len(boxes)):
if boxes[b][2] < boxes[b][0]:boxes[b][0] = boxes[b][2]boxes[b][2] = aboxes[b][0]

9. 运行又发生了这个报错

roidb[i]['img_id'] = imdb.image_id_at(i)
IndexError: list index out of range

参考roidb[i]['image'] = imdb.image_path_at(i) ·问题 #79 ·RBGIRSHICK/FAST-RCNN ·GitHub

这可能是缓存文件引起的,可以在 fast-rcnn-master/data/cache/ 文件夹下删除训练数据的特定缓存文件,然后重试解决了!

10. 再次报错ValueError: operands could not be broadcast together with shapes (1024,717,4) (1,1,3) (1024,717,4) 看来这个问题还是没有解决

可能是因为有的图片是4通道的,即rgb+alpha,只选取rgb三个通道即可

参考ValueError: operands could not be broadcast together with shapes (441,786,4) (1,1,3) (441,786,4) · Issue #599 · jwyang/faster-rcnn.pytorch · GitHub

在 lib\model\util\blob.py 的P39行前插入:

 if im.shape[2] == 4:im = im[:, :, :3]

可以正常训练了

CUDA_VISIBLE_DEVICES=3,4 python trainval_net.py --dataset pascal_voc --net res101 --bs 4 --nw 4 --lr 0.005 --lr_decay_step 5 --cuda --epochs 50

11.又有报错了

RuntimeError: Caught RuntimeError in DataLoader worker process 3.

RuntimeError: The expanded size of the tensor (1200) must match the existing size (0) at non-singleton dimension 1.  Target sizes: [600, 1200, 3].  Tensor sizes: [600, 0, 3]

1439
[session 1][epoch  1][iter 3800/6756] loss: 0.7875, lr: 5.00e-03fg/bg=(10/1014), time cost: 53.474536rpn_cls: 0.1268, rpn_box: 0.0292, rcnn_cls: 0.0855, rcnn_box 0.0142
Traceback (most recent call last):File "trainval_net.py", line 310, in <module>data = next(data_iter)File "/home/zy/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 435, in __next__data = self._next_data()File "/home/zy/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 1085, in _next_datareturn self._process_data(data)File "/home/zy/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 1111, in _process_datadata.reraise()File "/home/zy/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/_utils.py", line 428, in reraiseraise self.exc_type(msg)
RuntimeError: Caught RuntimeError in DataLoader worker process 2.
Original Traceback (most recent call last):File "/home/zy/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/utils/data/_utils/worker.py", line 198, in _worker_loopdata = fetcher.fetch(index)File "/home/zy/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/utils/data/_utils/fetch.py", line 44, in fetchdata = [self.dataset[idx] for idx in possibly_batched_index]File "/home/zy/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/utils/data/_utils/fetch.py", line 44, in <listcomp>data = [self.dataset[idx] for idx in possibly_batched_index]File "/home/zy/faster-rcnn.pytorch-pytorch-1.0/lib/roi_data_layer/roibatchLoader.py", line 177, in __getitem__padding_data[:, :data_width, :] = data[0]
RuntimeError: The expanded size of the tensor (1200) must match the existing size (0) at non-singleton dimension 1.  Target sizes: [600, 1200, 3].  Tensor sizes: [600, 0, 3]

参考"RuntimeError: The expanded size of the tensor (1200) must match the existing size (1199) at non-singleton dimension 1. Target sizes: [600, 1200, 3]. Tensor sizes: [600, 1199, 3] " · Issue #629 · jwyang/faster-rcnn.pytorch · GitHub

删除fast-rcnn-master/data/cache/下的pkl文件试一试

测试过程报错:

1.  AttributeError: 'NoneType' object has no attribute 'text'

  File "/home/zy/faster-rcnn.pytorch-pytorch-1.0/lib/datasets/voc_eval.py", line 22, in parse_recobj_struct['pose'] = obj.find('pose').text
AttributeError: 'NoneType' object has no attribute 'text'

解决方法:去原文档里注释掉这一句 obj_struct['pose'] = obj.find('pose').text

发现pose,truncated,difficult 这几项我的xml文件里都没有,于是都给注释了

参考AttributeError:“NoneType ” object has no attribute 'text' · Issue #580 · rbgirshick/py-faster-rcnn · GitHub

2. 报错: KeyError: 'difficult'

difficult = np.array([x['difficult'] for x in R]).astype(np.bool)
KeyError: 'difficult'

解决方法:修改faster-rcnn.pytorch-pytorch-1.0/lib/datasets/voc_eval.py文件,注释difficult相关代码

参考利用py-faster-rcnn训练目标检测模型_liuyan20062010的博客-CSDN博客

和AttributeError:“NoneType ” object has no attribute 'text' · Issue #580 · rbgirshick/py-faster-rcnn · GitHub

修改过的地方:

def parse_rec(filename):""" Parse a PASCAL VOC xml file """tree = ET.parse(filename)objects = []for obj in tree.findall('object'):obj_struct = {}obj_struct['name'] = obj.find('name').text#obj_struct['pose'] = obj.find('pose').text    //注释这一行#obj_struct['truncated'] = int(obj.find('truncated').text)    //注释这一行#obj_struct['difficult'] = int(obj.find('difficult').text)    //注释这一行bbox = obj.find('bndbox')obj_struct['bbox'] = [int(bbox.find('xmin').text),int(bbox.find('ymin').text),int(bbox.find('xmax').text),int(bbox.find('ymax').text)]objects.append(obj_struct)return objects
  # extract gt objects for this classclass_recs = {}npos = 0for imagename in imagenames:R = [obj for obj in recs[imagename] if obj['name'] == classname]bbox = np.array([x['bbox'] for x in R])#difficult = np.array([x['difficult'] for x in R]).astype(np.bool)    //注释这行difficult = 0;    //添加这行det = [False] * len(R)     #npos = npos + sum(~difficult)     //注释这行class_recs[imagename] = {'bbox': bbox,'difficult': difficult,'det': det}
      if ovmax > ovthresh:#if not R['difficult'][jmax]:    //注释这行# if not R['det'][jmax]:    //注释这行#  tp[d] = 1.    //注释这行# R['det'][jmax] = 1    //注释这行# else:    //注释这行fp[d] = 1.else:fp[d] = 1.

主要参考文章

Faster-RCNN.pytorch的搭建、使用过程详解(适配PyTorch 1.0以上版本)_faster rcnn pytorch_Yale曼陀罗的博客-CSDN博客

使用faster-rcnn.pytorch训练自己数据集(完整版) - Wind·Chaser - 博客园 (cnblogs.com)

Faster RCNN(Pytorch) 配置过程记录及问题解决_cc__cc__的博客-CSDN博客

(linux)Faster RCNN-pytorch1.0目标检测2:训练自己的数据集,gpu,pycharm, 训练笔记_chao_xy的博客-CSDN博客 Faster-RCNN.pytorch的搭建、使用过程个人记录(适配PyTorch 1.0以上版本)_璐璐不是小胖纸er的博客-CSDN博客

使用Faster R-CNN(linux-pytorch)训练自己的数据集过程记录相关推荐

  1. Faster R CNN

    Faster R CNN 3 FASTER R-CNN 我们的Faster R CNN 由两个模块组成,第一个模块是 proposes regions 的全卷积网络,第二个是使用 proposed r ...

  2. CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录(第二次)

    YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录(第二次) 目录 训练记录 训练记录

  3. CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录

    CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录 目录 视频请观看 训练输出记录 视频请观看 深度学习之计算机视觉神经网络训练Yolov3-5c ...

  4. CV之YOLO:深度学习之计算机视觉神经网络tiny-yolo-5clessses训练自己的数据集全程记录

    CV之YOLO:深度学习之计算机视觉神经网络tiny-yolo-5clessses训练自己的数据集全程记录 目录 训练全部流程记录 训练全部流程记录 1.采用tiny-yolo-5clessses训练 ...

  5. 【猫狗数据集】pytorch训练猫狗数据集之创建数据集

    数据集下载地址: 链接:https://pan.baidu.com/s/1tJQIY0ob2EyQn3cDipPkow?pwd=7gch  提取码:7gch 猫狗数据集的分为训练集25000张,在训练 ...

  6. 图像语义分割模型DeepLab训练Cityscapes数据集过程记录

    参考:https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/cityscapes.md https://git ...

  7. linux下can调试工具canutils安装过程记录

    https://www.cnblogs.com/chenfulin5/p/6797756.html 一.下载源码 下载canutils和libsocketcan libsocketcan地址:http ...

  8. linux 集成调试工具,linux下can调试工具canutils安装过程记录

    https://www.cnblogs.com/chenfulin5/p/6797756.html 一.下载源码 下载canutils和libsocketcan https://git.pengutr ...

  9. seresnet50训练自己的数据集_SSD框架训练自己的数据集

    SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证. 本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注 2 数据集的转换 3 使用S ...

最新文章

  1. 设计模式之美:Facade(外观)
  2. 微信8.0之后,又悄悄上线新功能:别人“抢不到”的红包!赶紧看看灰度到你了没?...
  3. Java文件下载详解
  4. 将windows 客户机加入msits.com域环境中
  5. ASP.NET 5 入门(1) - 建立和开发ASP.NET 5 项目
  6. 电脑技巧:微软电脑管家测试版发布,赶快来体验一下吧!
  7. mybatis--面向接口编程
  8. pic单片机tmr1计数c语言,PIC单片机C语言编程实例五.doc
  9. 利用CSS3制作网页动画
  10. win10开机后底部任务栏无响应的修复方法
  11. 谷歌学术、github、Sci-Hub镜像网址总结
  12. 阳线双响炮K线形态,上升势不可挡,送指标源码
  13. react的useMemo 和 vue3的computed
  14. python之excel处理画图
  15. mysql查询优化count(*)-查询记录总条数(一)
  16. m4a html 播放器,HTML5 Audio m4a
  17. buck电路 dac stm32_BUCK转换电路的工作原理
  18. 关于一个二维数组问题
  19. [矩阵的三角分解系列二] LDU基本定理
  20. Prometheus Operator 通过additional 添加target

热门文章

  1. [微信小程序]微信小程序点击事件返回值的target分析
  2. win7和ubuntu双系统启动U盘制作
  3. 20172325 2018-2019-2 《Java程序设计》第六周学习总结
  4. 图同构(graph isomorphism)算法(1)
  5. python保存文件到桌面_我用Python不到一分钟就将桌面文件整理分类!
  6. synchronized,volite,lock接口分析以及锁的分类
  7. 量子领域的机器学习人工智能(三)(Machine learning artificial intelligence in the quantum domain)
  8. ESDB论文重点整理
  9. Android--注销登录用户
  10. csv的文件excel打开长数字后面位变0的解决方法