源码地址: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,
1.3、硬盘驱动+CUDA 8.0安装:
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文件夹保存了所有原图片。
数据集制作软件和具体方法参考:
如果想要更改xml文件中属性值,比如想把xml文件中类别名称改变,或把图片名称、路径等值改变,参考:https://github.com/XinZhangNLPR/Xml-document-modify.git
3.1.2替换原有的VOC2007数据集:
3.1.3 训练,到此为止就可以开始训练了,训练命令行不用变,依旧为:
python trainval_net.py --dataset pascal_voc --net vgg16 --bs 1 --nw 4 --cuda
训练过程可能会遇到如下错误:
assert(boxes[:,2]>=boxes[:,0]).all()
这是因为在数据集标注的时候标注的框靠近边缘,解决方法:
此时再重新输入训练命令,完美解决问题,训练过程如下图所示:
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格式,具体转换方法见:
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
同上面测试步骤一样