文章标题 faster rcnn-pytorch版训练自己的数据

来源:互联网 发布:长春java公司 编辑:程序博客网 时间:2024/06/01 07:22

pytorch框架比起tenserflow和caffe等框架相对简单很多,代码短小精悍,这里记录一下用pytorch版的faster rcnn训练自己的数据并测试的过程,以及途中遇到的一些问题。
一、github上下载faster rcnn pytorch的代码链接:https://github.com/longcw/faster_rcnn_pytorch
按照此工程下面的readme配置相应库,测试或对VOC2007数据集进行训练等。
二、对于自己的数据集,首先需要标记数据生成相应的xml文件,标记工具链接:https://github.com/DuinoDu/BBox-Label-Tool ,执行python tools/createDS.py,这里会提示标记的类别名、标记图片的导入路径、标记结果的保存路径,以及询问图像中是否只含一个目标,注意不是一个类别,是一个目标!!!这里的默认路径是家目录下bbox_label.txt中的路径,可根据实际情况修改:vim .bbox_label.txt。
如图所示
完成后运行 python main_voc.py,然后画框标记,左下角有标记坐标的显示,可随时查看标记是否成功;
完成标记后进入BBOX_Label_Tool/tools里面运行checkAnno.py ,检查一下你的xml是否有问题,有问题的话将其和其对应的图片删除,然后重命名,然后在执行createSplit.py,运行后会自动生成Imagesets文件夹,里面包含数据划分的txt,这里要注意一个问题,就是你标记时候定义的classes_name要和你的xml中object的名字一样,否则执行createSplit.py后tranval.txt等一系列txt中都不会有内容!!!!!并且你还发现不了这个问题,所以一定要注意注意,贴图说明:
这里写图片描述
这里写图片描述
重命名脚本:

import xml.etree.ElementTree as ETimport osimport cPickleimport numpy as npimport cv2import randomannopath="/home/lsj/project/faster_rcnn_pytorch/data/VOCdevkit2007/VOC2007/Annotations"imgpath="/home/lsj/project/faster_rcnn_pytorch/data/VOCdevkit2007/VOC2007/JPEGImages"new_xml_dir="/home/lsj/project/faster_rcnn_pytorch/data/VOCdevkit2007/VOC2007/cache/Annotations"new_img_dir="/home/lsj/project/faster_rcnn_pytorch/data/VOCdevkit2007/VOC2007/cache/JPEGImages"def updatexml(ann_path,new):    updatetree=ET.parse(ann_path)    root=updatetree.getroot()    filename=root.find('filename')    filename.text=str(new)    updatetree.write(os.path.join(new_xml_dir,new+'.xml'))def preprocess():   filelist=os.listdir(annopath)   num = 1  #从1开始命名,避免0、1造成的程序问题   number = 0   for file in filelist:        print('number =  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~',number)        number += 1        ann_path = os.path.join(annopath,file)        name = os.path.splitext(file)[0]        jpg = name + '.jpg'        jpg_path = os.path.join(imgpath,jpg)        img=cv2.imread(jpg_path)        new_name = (6 - len(str(num)))*'0' + str(num)        num+=1        cv2.imwrite(os.path.join(new_img_dir,new_name+'.jpg'), img)        updatexml(ann_path,new_name) if __name__ == '__main__':    preprocess()

二、修改pytorch faster rcnn代码数据传送接口
1.找到faster_rcnn_pytorch/experiments/cfgs/faster_rcnn_end2end.yml文件,修改这里面的参数,一般只需要修改下类别,调试过程中如果需要可修改batchsize的数值或学习率等。
2.找到faster_rcnn_pytorch/faster_rcnn/faster_rcnn.py文件,在 FasterRCNN类中修改类别数量和类别名称,类别名称就是你的xml中object的名字,例如我这里是上面途中红色标注的suspension_point,这个类中还可以改变输入图像的resize结果,原py文件中是将短边固定为600,按原图的长宽比放缩长边,并限制最大size不超过1000,这些参数可根据具体情况修改。
3.找到faster_rcnn_pytorch/faster_rcnn/datasets/pascal_voc.py文件修改类别数和类别名,和2差不多
4.如果你用faster_rcnn_pytorch自己训练过VOC2007数据集,那么在faster_rcnn_pytorch中会有三个文件夹:cache、pretrained_model、 VOCdevkit2007,cache是存的从你数据集中load 进来的数据缓存,训练前将里面的内容删除运行程序时会自动生成, pretrained_model 里面存的是预训练模型,比如你要用VGG16作为你的basenet,那么你要去github上下载一个VGG_imagenet.npy文件,放进这个文件夹中,最后一个VOCdevkit2007里面就是你的数据,为了少修改代码,我们可以将自己的数据变为和VOC2007一样的格式,具体来说需要在VOCdevkit2007中建立一个VOC2007文件夹,然后把你之前数据准备检测并重命名后的数据放在这个文件夹中,最后的效果是VOCdevkit2007/VOC2007这个文件夹中含有三个子文件:Annotations、JPEGImages、ImageSets。
5.训练吧,见证奇迹的一刻,在faster_rcnn_pytorch目录下运行python train.py。
三、感想
pytorch真的是一个很棒的框架,简单易懂,官网的docs里面也有很多例子,大家都可以抽空去看看,你们一定也会爱上它的!数据准备真的很重要啊,中间某个过程出错就会导致训练不成功,所以一定要养成check的好习惯,未雨绸缪,防患于未然,之后的过程就会很顺畅了!实践过程中需要注意的问题博客中基本都涵盖了,希望能帮到不知道从何入手的你~(^▽^)

原创粉丝点击