【深度学习模型训练】使用自己的数据训练 Fast r-cnn Faster r-cnn YOLOv3

这里以Faster r-cnn讲解为主,Fast r-cnn与Faster r-cnn训练过程类似, proposals的提取过程在Faster r-cnn后单独讲述。yolo在最后讲解,Fast r-cnn 测试部分与yolo类似,也不再赘述。Fast r-cnn 应用于小目标检测,训练模型耗时大,定位效果较差,且生成proposals部分单独用matlab实现,训练过程冗杂,并且测试也需借助Faster r-cnn 评价函数。从耗时效果等多方面考虑,不建议使用Fast r-cnn 进行小目标检测。

感谢老莫关于YOLOv3 部分的补充,感谢莫师兄、裴师兄对整个实验的贡献

关于使用自己的数据训练,推荐的步骤如下:

  1. 先顺利跑出demo,检测配置环境是否有问题;
  2. 利用pasal voc、imagenet等训练模型,找出训练出现的问题并解决;
  3. 处理自己高清的数据,使其符合训练要求;
  4. 数据替换,修改代码跑自己的模型。

使用Faster r-cnn训练自己的模型

接下来详细说明Faster r-cnn跑demo的步骤。

使用Faster r-cnn训练自己的模型——demo部分

  1. 编译的部分参考 https://github.com/rbgirshick/py-faster-rcnn
  2. 编译成功后,下载已训练的模型文件
    下载完成后放在data/faster_rcnn_models目录下面解压
cd  $ FRCN_ROOT 
./data/scripts/fetch_faster_rcnn_models.sh
  1. 运行demo
    直接运行demo默认使用VGG16网络,这里运行demo主要检查有无配置环境的问题,可以使用CPU跑demo,但是训练测试模型必须用GPU。如果顺利显示出检测图像的话,可以往下进行实验。
cd  $ FRCN_ROOT 
./tools/demo.py

使用Faster r-cnn训练自己的模型——训练部分

参考 https://www.jianshu.com/p/60f189b095f1

数据准备

  • 本实验采用不修改实验数据集名称,仅对内容做替换,省去更改部分代码的麻烦

  • 使用labelImg标注图片,使用标签全小写无空格,且存储文件夹名称一致为Annotatios. labelImg安装及使用简介见 https://tw.openrobot.club/article/index?sn=10976 (windows版)

  • 将数据集放置在搜索路径下
    在data/VOCdevkit2007路径下创建results(测试时结果保存的文件夹)、VOC2007(存放训练测试集的文件夹)两个文件夹。在VOC2007下创建Annotations、ImageSets、JPEGImages三个文件夹。其中Annotations存放与图片对应的同名标签文件,JPEGImages存放所有图片、ImageSets/Main下存放训练测试数据的索引列表(trainval.txt、test.txt)。

    生成索引文件的方法如下:

    • 把需要生成统一列表的图片放在同一文件夹下
    • 在VOC2007文件夹内打开终端,运行下面代码(其中 p a t h 为 a 创 建 文 件 夹 名 , path为a创建文件夹名, pathatrain_file为生成文件名,txt文件生成在当前目录下)
    • 生成的txt文件放在ImageSets/Main下
find $path -name *.jpg > $train_file

修改模型内容

建议使用 VGG16+end_to_end 的训练方式,修改models/pascal_voc/VGG16/faster_rcnn_end2end下的prototxt文件:

  • train.prototxt/ test.prototxt
    Input_data:3+1 (类别数+背景)
    Cls_score:3+1
    Bbox_pred:(3+1)*4=16 (所有类别*回归的4个坐标)
    Roi_data /num_classes: 3(实际类别数)
  • solver.prototxt
    修改base_lr 基础学习率,stepsize为迭代多少次数后改变学习率等,可改变训练进程及效果

修改接口内容

这里修改配置文件均备份源文件再修改,用于出现未知错误对比进行修改。

  • 修改pascal_voc.py
    Init函数中self._classes更换为自己的类名+background
  • 修改 imdb .py
    插入以下代码防止因图片未统一处理而报错
    在这里插入图片描述

开始训练

  • 训练之前请先删除所有pkl文件(如果更换训练/测试数据集的话),并重命名output文件夹
  • 下载预训练的模型
cd py-fasyer-rcnn
./data/scripts/fetch_imagenet_models.sh
  • 在py-fasyer-rcnn 内打开终端,输入以下代码进行训练,并将结果训练过程写入trainresult.log
./experiments/scripts/faster_rcnn_end2end.sh 0 VGG16 pascal_voc >trainresult.log

使用Faster r-cnn训练自己的模型——测试部分

  • 开始测试
    正常来说,训练完成后就会直接测试(faster_rcnn_end2end.sh 训练完了接着测试),如果单独测试的话,按以下步骤:
    • 将训练完成的模型,在output/faster_rcnn_end2end/voc_2007_trainval下,拷贝到data/faster_rcnn_models里
    • 在py-fasyer-rcnn 内打开终端,输入以下代码进行测试(其中vgg16_faster_rcnn_iter_40000.caffemodel为训练的模型)
 ./tools/test_net.py –gpu 0 –def models/pascal_voc/VGG16/faster_rcnn_end2end/test.prototxt –net data/faster_rcnn_models/vgg16_faster_rcnn_iter_40000.caffemodel –imdb voc_2007_test –cfg experiments/cfgs/ faster_rcnn_end2end.yml
  • demo显示效果图
    • data/demo文件夹下放入显示图片
    • 修改demo.py文件
      更改CLASS为自己的类别+background,更改NETS中vgg16为训练模型名, im_names为显示图片名
  • 运行demo
cd $FRCN_ROOT 
./tools/demo.py

最后显示检测效果图如下:
在这里插入图片描述

对于小目标改进的建议

  • ~/blob/master/lib/fast_rcnn/config.py
    line118 __C.TRAIN.RPN_MIN_SIZE = 16 按目标大小修改

  • 改进anchor_target_layer proposal_layer
    在~/blob/master/lib/rpn/generate_anchors.py 文件,函数 def generate_anchors中

    • scales: decrease these values to account for smaller boxes
    • ratios: adjust them depending on the shape of your grount-truth boxes
    • feat_stride : supposedly this can be modified to improve accuracy of the generated anchors

使用Fast r-cnn训练自己的模型

使用Fast r-cnn训练自己的模型——测试部分

比较麻烦的事,Fast r-cnn提取proposals的过程和训练过程仍然分离,因此我们在训练过程时,需要用selective search或者edges的方法(基于matlab)先把图像proposals提取好,再送入网络中中训练。
在检测过程中也同样如此。且根据使用方法的不同,检测数据集的像素可能略有差异,selective search 提取OP的图片大小在250KB以内,小于2000*2000,Edge则可以使用4608*3450,大部分手机拍摄原图,若用RPN提取OP(如 Faster r-cnn),则可使用工业相机拍摄原图。
主要参考 https://www.cnblogs.com/louyihang-loves-baiyan/p/4903231.html ,参考 https://github.com/coldmanck/fast-rcnn https://sunshineatnoon.github.io/posts/2012/08/blog-post-1/

使用selective search生成proposals

  • 将所需训练/测试图片直接导入selective_search 文件夹
  • 修改selective_search.py 对__name__函数中的image_filenames列表,更新成更新成训练/测试的图片索引
  • 运行 python selective_search.py 在计算机/tmp目录下生成随机命名的mat文件
  • 将文件改名,复制于/fast-rcnn/data/数据集下

使用edges生成proposals

使用edges源代码生成的proposals坐标是(x,y,w,h)坐标形式,而训练使用的是(x1,y1,x2,y2)形式,所以需要对edgeBoxesDemo.m进行改写,以下为使用edges生成候选区步骤。

  • 打开matlab
  • 在matlab中选择edgeBoxesDemo.m路径
  • 清空工作区防止结果累计
  • 导入toolbox路径
addpath(genpath('~/piotr_toolbox/toolbox'))
savepath

selective search、edges 算法已修改的代码上传至压缩包,可在资源内查看

  • 开始运行,更改图片路径并将boxes/all_boxes 右键存储为mat文件

训练Fast r-cnn模型

Fast r-cnn与Faster r-cnn训练过程相似,仅需把生成好的mat文件放在指定目录下即可,并重命名为voc_2007_trainval/voc_2007_test。
参考此前Faster r-cnn训练步骤,修改 experiments/scripts/default_vgg16.sh 文件,配置默认的solver 到models/VGG16/solver.prototxt 、weights到 data/imagenet_models/VGG16.v2.caffemodel
在终端执行下面代码,进行训练。

./experiments/scripts/default_vgg16.sh 0 >train.log

测试Fast r-cnn

类似yolov3, 在后文详述,不再赘述

运行demo

  • data/demo 下存入所显示的图片和单个图片生成的mat文件,并将mat文件名改成 图片名_boxes.mat
  • 运行 demo .py
    效果如下:
    在这里插入图片描述

使用YOLOv3训练自己的模型——训练+测试

  • 先运行已修改的voc_label.py文件(python voc_label.py)得到训练和测试的txt文件:2007_train.txt,2007_test.txt
  • 修改voc.data文件确认2007_train.txt,2007_test.txt和voc.name文件路径是否正确
  • 将voc.name中的类别名称改成自己的类别名称
  • 在darknet文件夹内开启终端,输入训练代码
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg  pre-trained weight yolov3-voc_final.weight >train.log
  • 在darknet文件夹内开启终端,输入测试图片代码
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg yolov3-voc_final.weight  path of image

其中yolov3-voc_final.weight为测试模型,path of image 为一张图片路径

  • 在darknet文件夹内开启终端,输入测试视频代码(跑demo)
    ./darknet detector demo cfg/voc.data cfg/yolov3-voc.cfg yolov3-voc_final.weight
    yolo效果如下
    在这里插入图片描述

使用YOLOv3训练自己的模型——求取mAP

因为yolo没有评价函数,借助faster r-cnn的voc_eval.py函数进行评价,求取mAP

  • 得到map所需的txt文件
./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg yolov3-voc_final.weight 
  • 将得到txt文件改名为 类别.txt

  • 将faster-rcnn中的voc_eval.py复制过来,然后创建新的空白python文件,内容如下:

    from voc_eval import voc_eval
    print voc_eval (’…/darknet/results/{}.txt’,’…/Annotations/{}.xml’,’…/test.txt’,‘类别’,’.’)

    第一个参数为改名后的txt文件所在路径即B所得,第二个参数为标签所在路径,第三个参数为测试的txt文件所在路径,打印出来的最后一个参数即为ap

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 不是,YOLOv5和Faster R-CNN都是目标检测算法,但它们采用了不同的方法。YOLOv5是一种单发多框检测器(single-shot detector),它使用一个神经网络直接预测边界框的位置和类别,具有实时性和较高的准确率。而Faster R-CNN则采用了两个阶段的方法,首先使用一个区域提议网络(Region Proposal Network)生成候选物体框,然后再对这些框进行分类和位置回归。虽然两种方法都能够达到较好的检测效果,但它们在设计上有很大的区别。 ### 回答2: Yolov5不是Faster R-CNN。它们是两种不同的目标检测算法。 Faster R-CNN是一种经典的目标检测算法,它基于深度学习模型,包括两个主要模块:Region Proposal Network(RPN)和Fast R-CNN。它首先使用RPN生成候选目标区域,然后使用Fast R-CNN对这些候选区域进行分类和边界框回归。Faster R-CNN具有较高的准确性,但在速度方面相对较慢。 相比之下,Yolov5是一种全新的目标检测算法,是Yolov4的改进版。Yolov5的核心思想是将目标检测任务转化为单阶段的回归问题,通过预测目标的类别和边界框。它采用了轻量级网络结构和改进的特征金字塔网络,以提高检测的准确性和速度。Yolov5相对于Faster R-CNN,在速度方面有明显的优势,同时在识别小目标等方面也有很好的表现。 综上所述,Yolov5和Faster R-CNN是两种不同的目标检测算法,它们在原理和性能上有所不同。选择使用哪种算法取决于具体的应用需求和性能要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值