pytorch版本的faster rcnn训练测试自己的数据集

源码地址:https://github.com/jwyang/faster-rcnn.pytorch

环境:Ubuntu 16.04、python2.7或3.6,显卡GTX1080Ti,pytorch0.4.0,CUDA8.0

一、环境配置:

1.1、 系统环境:Ubuntu 16.04:安装教程:https://jingyan.baidu.com/article/3c48dd348bc005e10be358eb.html

1.2、Python 2.7 or 3.6,安装Anaconda,https://blog.csdn.net/lwplwf/article/details/79162470

1.3、硬盘驱动+CUDA 8.0安装:https://blog.csdn.net/baobei0112/article/details/79755803

1.4 Pytorch 0.4.0安装:conda install pytorch=0.4.0 -c soumith

二、用voc2007标准数据集训练模型

1、训练模型

2.1.1 到github下载源码:https://github.com/jwyang/faster-rcnn.pytorch,放到指定的目录下

2.1.2 在代码所在目录打开终端,手动创建data文件夹或者用命令行创建:mkdir data

2.1.3 安装模型所需依赖(第三方包),命令行输入即可自动安装所需依赖:pip install -r requirements.txt

2.1.4 进入lib目录下,编译NMS, ROI_Pooling, ROI_Align和ROI_Crop模块,命令行输入:

cd lib
sh make.sh

2.1.5  下载voc2007数据集,下载链接:

http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar

http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar

,下载后解压,解压后的目录结构如下:

在项目路径data下创建VOCdevkit文件夹,将刚才下载解压后的voc2007文件夹复制到./data/VOCdevkit目录下 ,目录结构如下:

2.1.6 下载预训练好的vgg16模型,并在data数据集上面新建一个pretrained_model文件夹,将与训练模型放到里面

2.1.7 训练模型:基于vgg16模型训练网络,在项目根目录下输入下列命令就会开始训练模型,python trainval_net.py表示执行trainval_net.py代码进行训练,后面的都是指定的参数,若不指定,将会选择默认选项

CUDA_VISIBLE_DEVICES=$GPU_ID python trainval_net.py \
                   --dataset pascal_voc --net vgg16 \
                   --bs 1 --nw 4 \
                   --lr 0.00001 \
                   --cuda

其中

“CUDA_VISIBLE_DEVICES”指代了gpu的id,–dataset”指代你跑得数据集名称,我们就以pascal-voc为例;“–net”指代你的backbone网络是啥,我们以vgg16为例;"–bs"指的batch size;“–nw”指的是worker number;"--lr"指代学习率,“–cuda”指的是使用gpu。
在训练过程中可能出现的错误:

1、Path does not exist: ×××/data/VOCdevkit2007/VOC2007/ImageSets/Main/trainval.txt

分析:路径中不存在VOCdevkit2007一个文件夹

解决方法:.\lib\datasets\pascal_voc.py文件下116行的

return os.path.join(cfg.DATA_DIR, 'VOCdevkit' + self._year)
修改为
return os.path.join(cfg.DATA_DIR, 'VOCdevkit')

2、AttributeError: 'int' object has no attribute 'astype' 

 解决方法:/lib/roi_data_layer/roibatchLoader.py
                  line 52, target_ratio = 1 change to:
                  target_ratio = np.array(1)

3、RuntimeError: cuda runtime error (2) : out of memory at /pytorch/aten/src/THC/generic/THCStorage.cu:58

解决方法:跑代码需要的内存超出当前指定的GPU的可用内存,需要重新指定,(我在训练模型时不指定GPU的ID,即不用输入CUDA_VISIBLE_DEVICES=$GPU_ID,错误消除)

最终在控制台输入以下命令开始训练模型,

python trainval_net.py --dataset pascal_voc --net vgg16 --bs 1 --nw 4 --cuda

训练过程中模型默认保存地址为./model/vgg16/pascal_voc路径下(trainval_net.py中变量sava_name的值为模型保存的路径)。

2、测试训练好的模型

python test_net.py --dataset pascal_voc --net vgg16 --checksession 1 --checkepoch 20 --checkpoint 1291 --cuda

测试结果默认保存在./output/vgg16/voc_2007_test目录下 

3、测试demo

python demo.py --net vgg16  --checksession 1  --checkepoch 20 --checkpoint 1291 --cuda --load_dir models

demo测试会检测images路径下的图片,images从官网下载后的图片有12个,但其中×××_det.jpg的8张都是作者在测试的结果,因此需要删除这8张再进行测试。

三、用自己数据集训练模型

3.1 训练

3.1.1 准备数据集:制作和voc2007格式相同的数据集,将原来data\VOCdevkit\VOC2007目录下的所有内容删除,将自己做好的数据放进data\VOCdevkit\VOC2007目录下,目录结构为

其中Annotations为标注文件夹,有若干.xml文件。每一个图片都对应一个.xml文件,其中存储的是该图片的名称,长宽,目标框(GroundTrues)的左上右下坐标,目标框的类别名称;

ImagesSet文件夹下的Main里,保存了用来训练和测试图片的名称,以txt文本存储,每行一个图片名称;

JPEGImage文件夹保存了所有原图片。

数据集制作软件和具体方法参考:https://blog.csdn.net/qq_38497266/article/details/95169227

如果想要更改xml文件中属性值,比如想把xml文件中类别名称改变,或把图片名称、路径等值改变,参考:https://github.com/XinZhangNLPR/Xml-document-modify.git

3.1.2替换原有的VOC2007数据集: 删除之前训练VOC2007数据集产生的模型文件(./models文件夹下的所有文件和./data/cache文件夹)和测试产生的结果文件(./output文件夹下的所有文件和./data/VOCdevkit文件夹下的annotations_cache与results),进入faster-rcnn.pytorch/lib/datasets/pascal_voc.py文件下,注释掉原来模型识别的类别,比如要检测猫和狗,则添加自己定义的需要识别类别名cat和dog(类名和前面xml文件中目标的name属性应该是一样的):

3.1.3 训练,到此为止就可以开始训练了,训练命令行不用变,依旧为:

python trainval_net.py --dataset pascal_voc --net vgg16 --bs 1 --nw 4 --cuda

训练过程可能会遇到如下错误:

assert(boxes[:,2]>=boxes[:,0]).all()

这是因为在数据集标注的时候标注的框靠近边缘,解决方法:https://blog.csdn.net/xzzppp/article/details/52036794

此时再重新输入训练命令,完美解决问题,训练过程如下图所示:

3.2 测试模型精度mAP+demo可视化检测结果、

3.2.1 测试模型精度

python test_net.py --dataset pascal_voc --net vgg16 --checksession 1 --checkepoch 20 --checkpoint 1291 --cuda

测试结果默认保存在./output/vgg16/voc_2007_test目录下 

3.2.2 demo自己的模型检测结果如何,并进行可视化

注意demo文件中也需要修改模型要识别的类名,

修改完demo后就可以正常的测demo了,测demo的命令类似于:

python demo.py --net vgg16  --checksession 1  --checkepoch 20 --checkpoint 1291 --cuda --load_dir models

但此处要注意看你训练好的模型文件中的checkpoint是否为1291,否则修改为模型文件中的数值。

四、在已经训练好的模型上继续训练自己的数据

假如你需要做某个场景下的文字检测,但手上的数据集样本很小,而网上有其他一些大样本的数据集,此时就可以先用大样本的数据预训练一个模型,然后用自己的小数据集在预训练模型上继续训练,使之更加适应我们的场景,也可以提高我们模型的鲁棒性。具体步骤如下:

4.1 本次做文本检测,选用的大样本数据集为COCO2014文本检测数据集,下载链接:数据集标签文件数据集所有图片,注意COCO2014数据集的标注格式和VOC2007的标注格式不同,因此需要将其转换成VOC格式,具体转换方法见:https://blog.csdn.net/qq_38497266/article/details/99950471

4.2 用COCO2014数据集先训练模型,训练的迭代次数不能设置的过多,否则用自己的数据集继续训练出的模型结果不会很适应自己的场景,本次因为我自己的数据集只有300多张,因此在COCO2014数据集上只迭代了2轮,训练好的模型保存路径为:./models/vgg16/pascal_voc/faster_rcnn_1_2_33659.pth

4.3 将自己的数据集放入data/VOCdevkit/VOC2007文件夹中,在COCO2014数据集上迭代了2轮的基础上继续训练,命令行输入下面命令:

python trainval_net.py --epochs 10 --cuda --r True --checksession 1 --checkepoch 2 --checkpoint 33659

其中--r True checksession 1 --checkepoch 2 --checkpoint 33659这几个参数表明在faster_rcnn_1_2_33659.pth模型基础上继续训练至第10轮,--r 默认情况是False,表示每次训练都是从第一轮重新开始训练模型

4.4 测试+demo

同上面测试步骤一样

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值