如何怎么才能训练口才将Faster R-CNN训练起来

既然faster-rcnn原版发表时候是matlab版代码,那就用matlab版代码吧!不过遇到的坑挺多的,不知道python版会不会好一点。
======= update =========
总体上包括这些步骤,请注意检查:
1 获取数据;(标准数据集/比赛数据/自行收集数据)
2 整理图片名和标注信息格式、指定训练集和测试集;(转voc格式,同时记得修改vocinit.m中类别信息;或者自己修改代码中读取数据的地方)
3 正确使用均值图像:手动算一个或用默认的减去128,别用错
4 选择网络与设定网络参数(solver和net);(根据业务需求和显存大小设定;修改网络中目标类别数量)
5 检查batch_size;
6 检查anchor;
7 清空cache目录;
8 开始训练;
9 确保电脑供电且不会休眠睡眠;
10 执行测试;整理测试结果
======= update =========
anyway,这里记录一下我遇到的几个坑
这里假设你已经配置好了faster-rcnn。我是在win10下配置的,显卡GTX 970,使用ZF网络。
0. 准备数据集
官方训练时用的是voc2007系列数据,那就转换成这个系列的好了,主要包括:0.下载数据集 1.整理图片 2.xml格式的annotation文件 3.txt格式指定训练集、测试集、验证集、训练验证集,以及每个类别各自的这四种文件
0.0 下载数据集
看具体情况,比如做某个比赛,那就下载;如果是自己收集的数据集,那就统一放到一起
0.1 整理图片
主要是图片格式统一,比如都是png
以及,命名规范,比如统一是6位长度的数字:000001.png,并且序号是连续的
训练图片和测试图片都放在一个JPEGImages目录里
0.2 xml格式的annotation文件
其实voc2007这种方式:为每张图片编写一个xml文件,记录图片各种元信息(作者、文件名、宽度高度深度、来源),以及bounding box坐标信息(左上、右下定点)等,很蛋疼啊,图片多的话每次处理xml文件读写I/O就增大了。anyway,遵守标准的好处是省的自己造各种工具。
这里贴一个例子好了,000001.xml:
&annotation&
&folder&VOC2007&/folder&
&filename&000001.png&/filename&
&database&My Database&/database&
&annotation&VOC2007&/annotation&
&image&flickr&/image&
&flickrid&NULL&/flickrid&
&flickrid&NULL&/flickrid&
&name&chriszz&/name&
&width&1280&/width&
&height&720&/height&
&depth&3&/depth&
&segmented&0&/segmented&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&369&/xmin&
&ymin&403&/ymin&
&xmax&409&/xmax&
&ymax&418&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&434&/xmin&
&ymin&375&/ymin&
&xmax&443&/xmax&
&ymax&401&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&461&/xmin&
&ymin&368&/ymin&
&xmax&471&/xmax&
&ymax&395&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&571&/xmin&
&ymin&473&/ymin&
&xmax&593&/xmax&
&ymax&490&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&674&/xmin&
&ymin&470&/ymin&
&xmax&683&/xmax&
&ymax&478&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&693&/xmin&
&ymin&471&/ymin&
&xmax&714&/xmax&
&ymax&480&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&976&/xmin&
&ymin&413&/ymin&
&xmax&998&/xmax&
&ymax&438&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&1004&/xmin&
&ymin&396&/ymin&
&xmax&1011&/xmax&
&ymax&410&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&1024&/xmin&
&ymin&388&/ymin&
&xmax&1031&/xmax&
&ymax&405&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&1046&/xmin&
&ymin&388&/ymin&
&xmax&1071&/xmax&
&ymax&406&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&1114&/xmin&
&ymin&390&/ymin&
&xmax&1143&/xmax&
&ymax&410&/ymax&
&name&sign&/name&
&pose&Unspecified&/pose&
&truncated&0&/truncated&
&difficult&0&/difficult&
&xmin&913&/xmin&
&ymin&431&/ymin&
&xmax&928&/xmax&
&ymax&458&/ymax&
&/annotation&
记得所有xml文件的文件名要和图片序号一一对应:000001.xml对应000001.png
并且,所有xml文件放到Annotations目录中
0.3 txt文件指定训练集、测试集等
在ImageSets/Main目录下保存这些文件。比如我的任务是检测交通标识,只有一个类别需要检测,或者说是二分类问题,只需要判断一个bbox区域是否为交通标识(sign),那么我创建sign对应的4个文件;以及4个表示总体的训练、验证、训练验证、测试的txt文件:
其中,sign_train、sign_test、sign_trainval、sign_val每行格式相同
图片id(不带后缀,不用全路径) +1或-1(表示这张图片中是否包含sign类别的区域)
对于我的情况,类别标签都是+1
然后是train、val、trainval、test文件,其中trainval是train和val的拼接。
这里我是需要
1 修改faster-rcnn的几个代码细节
1.0 experiments\script_faster_rcnn_VOC2007_ZF.m第30、31行
这里默认居然是用select search生成region proposal,我也是醉了。
= Dataset.voc2007_trainval(dataset, 'train', use_flipped);
= Dataset.voc2007_test(dataset, 'test', false);
1.1 experiments\+Dataset\voc2007_test.m第11行、第14行,test改成val
这个真的是太坑了,在这里我卡了大半天。为什么会卡在这个地方,然后程序一直运行出错呢?以及,程序出错大概如下:
错误使用 proposal_prepare_image_roidb&scale_rois (line 110) 两个输入数组的单一维度必须相互匹配,...
设断点debug后发现,roidb_train里各种字段都有值(比如gt、坐标、阈值、类别等);而roidb_val里面是空的。
实际上是在experiments\+Faster_RCNN_Train\do_proposal_train.m里面,把dataset.roidb_test赋值给roidb_val了:
function model_stage = do_proposal_train(conf, dataset, model_stage, do_val)
if ~do_val
dataset.imdb_test = struct();
dataset.roidb_test = struct();
model_stage.output_model_file = proposal_train(conf, dataset.imdb_train, dataset.roidb_train, ...
'do_val',
do_val, ...
'imdb_val',
dataset.imdb_test, ...
'roidb_val',
dataset.roidb_test, ...
# 尼玛,在这里赋值了
'solver_def_file',
model_stage.solver_def_file, ...
'net_file',
model_stage.init_net_file, ...
'cache_name',
model_stage.cache_name);
问题就是在这里了,不多说。那么接下来就是把experiments\+Dataset\voc2007_test.m第11行、第14行,test改成val,保证以后在imdb\cache目录下有val的mat数据存在,roidb_val也不会说里面内容都为空的了。
2 修改网络参数
看到下面这张图应该知道要改那几个文件了:
具体可以参考小咸鱼的faster-rcnn matlab版的配置
阅读(...) 评论()Faster R-CNN 1.编译配置 - 简书
Faster R-CNN 1.编译配置
近期在做一个Object Detective的项目,这里用的是Caffe,如果同学你还没装上Caffe的话,可以参考我之前写的文章:
在Caffe搭好了之后,再来看这篇。(这与之前的搭建差不多,近乎一样)
Installation
clone py-faster-rcnn
这里,我们先下载Ross Girshick大神在上的一个库。
# Make sure to clone with --recursive
$ git clone --recursive /rbgirshick/py-faster-rcnn.git
如大神所言,记得加上--recursive
Build the Cython modules
从下文开始,我将用$FRCN_ROOT来代表上面git clone下来的文件目录路径。如直接放在home下,$FAST_ROOT被替换为/home/cap/py-faster-rcnn(注意,此处的cap是我的用户名,应该换成你自己的)
$ cd $FRCN_ROOT/lib
Build Caffe and pycaffe
在编译之前,先来做下准备工作。
把$FRCN_ROOT/caffe-fast-rcnn目录下的Makefile.config.example文件复制一份,重命名为Makefile.config。
修改Makefile.config的相关项
USE_CUDNN = 1
//此项默认是关闭的,若你安装了cudnn,则把前面的#去掉,让其支持cudnn.
WITH_PYTHON_LAYER = 1
//这项默认也是关闭的,应该打开,去掉前面的#
USE_PKG_CONFIG = 1
//此项默认也是关闭的,应该打开,去掉前面的#
# CPU_ONLY := 1
//此项默认是关闭的,如果你的机器不支持gpu计算,则将其打开,去掉前面的注释
CUDA_DIR := /usr/local/cuda
//注意此项,应该和你安装的cuda的路径相同
OPENCV_VERSION := 3
//此项默认也是关闭的,应该打开,去掉前面的#
BLAS := atlas
//我不太确定这项是什么,貌似与先前搭建Caffe时有关,在此处选择默认的,即不用修改
在完成了前面的工作后,开始编译pycaffe。
$ cd $FRCN_ROOT/caffe-fast-rcnn
$ make -j8 && make pycaffe
编译pycaffe时,我的机器报错了AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so
/usr/bin/ld: cannot find -lippicv
collect2: error: ld returned 1 exit status
make: *** [.build_release/lib/libcaffe.so] Error 1
解决方法:把OpenCV下的libippicv.a文件复制到/usr/local/lib目录下,然后重新编译pycaffe。具体操作如下:复制libippicv.a文件$ cd /usr/local/opencv-3.1.0/3rdparty/ippicv/unpack/ippicv_lnx/lib/intel64
$ sudo cp libippicv.a /usr/local/lib
然后重新编译pycaffe$ cd $FRCN_ROOT/caffe-fast-rcnn
$ make clean
#清除前面的
$ make -j8 && make pycaffe
Download pre-computed Fast R-CNN detectors
此处是下载一些训练模型,在这篇博客里,我们先用作者已经训练好的caffe模型,看下fast-rcnn的效果:
$ cd $FRCN_ROOT
$ ./data/scripts/fetch_faster_rcnn_models.sh
下载完后,在$FRCN_ROOT/data/faster_rcnn_models下有2个模型,分别为
├── VGG16_faster_rcnn_final.caffemodel
└── ZF_faster_rcnn_final.caffemodel
在$FRCN_ROOT/data/scripts下,有三个shell(即.sh)文件
├── fetch_faster_rcnn_models.sh
├── fetch_imagenet_models.sh
└── fetch_selective_search_data.sh
此处引用楼燚航同学的介绍:第一是作者训练好的faster_rcnn模型,第二个是imagenet_model上预训练好的模型,第三个对应着的是作者基于Pascal VOC数据集提取的selective_search预选框。如果想要看一下faster rcnn的效果,可以直接加载Ross训练好的faster_rcnn模型,如果要自己训练的话,记得加载imagenet模型
run the demo
在开始前,你可能需要先安装相关的Python module
$ sudo pip2 install easydict
$ sudo pip2 install pyyaml
开始跑动demo
cd $FRCN_ROOT
./tools/demo.py
 如果你的gpu性能不加,那么可能出现类似如下的错误
Loaded network /home/hadoop/py-faster-rcnn/data/faster_rcnn_models/VGG16_faster_rcnn_final.caffemodel
F:55.60 relu_layer.cu:26] Check failed: error == cudaSuccess (9 vs. 0)
invalid configuration argument
*** Check failure stack trace: ***
Aborted (core dumped)
解决办法:使用较小的网络模型$ cd $FRCN_ROOT
$ ./tools/demo.py --net zf
如果是你的机器不支持GPU,那么记得在前面的Makefile.config文件去掉 # CPU_ONLY := 1 前面的#,使用CPU计算,然后此处跑动demo时,敲入$ cd $FRCN_ROOT
$ ./tools/demo.py --cpu
想了解更多的操作,敲入$ cd $FRCN_ROOT
$ ./tools/demo.py -h
usage: demo.py [-h] [--gpu GPU_ID] [--cpu] [--net {vgg16,zf}]
Faster R-CNN demo
optional arguments:
-h, --help
show this help message and exit
--gpu GPU_ID
GPU device id to use [0]
Use CPU mode (overrides --gpu)
--net {vgg16,zf}
Network to use [vgg16]
Ross Girshick大神在上的搭建说明
小咸鱼_同学的
庞贝船长的
O Captain !My Captain!&>&Faster-RCNN 训练过程错误记录
Faster-RCNN 训练过程错误记录
上传大小:22KB
该文档是本人利用Faster-rcnn
python版本训练VOC2007数据集时遇到的错误记录
综合评分:0(0位用户评分)
所需积分:
下载个数:2
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var q = $("#form1").serializeArray();
console.log(q);
var res_area_r = $.trim($(".res_area_r").val());
if (res_area_r == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
var mess = $(".res_area_r").val();
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
$(".res_area_r").val($.trim($(".res_area").val()));
评论共有0条
审核通过送C币
东南大学 崇志宏:多模态大数据的认知计算(2)-应用中的典型问题 (暑期讨论班PPT和参考书)
创建者:chognzhihong_seu
人工智能之深度学习
东南大学 崇志宏:多模态大数据的认知计算(1)--联结主义套路 (暑期讨论班PPT和参考书)
创建者:chognzhihong_seu
上传者其他资源上传者专辑
人工智能热门标签
VIP会员动态
前端开发重难点
17年软考最新真题及解析
物联网全栈开发专题
二十大技术领域优质资源
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
CSDN&VIP年卡&4000万程序员的必选
Faster-RCNN 训练过程错误记录
会员到期时间:
剩余下载个数:
剩余C币:0
剩余积分:
积分不足!
资源所需积分
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分
当前拥有积分
当前拥有C币
(仅够下载10个资源)
全站1200个资源免积分下载
资源所需积分
当前拥有积分
当前拥有C币
全站1200个资源免积分下载
资源所需积分
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
全站1200个资源免积分下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
Faster-RCNN 训练过程错误记录用faster rcnn训练自己的数据? - 知乎5被浏览1072分享邀请回答0添加评论分享收藏感谢收起Faster R-CNN教程
我的图书馆
Faster R-CNN教程
http://blog.csdn.net/u/article/details/最后更新日期:日
本教程主要基于版本的,因为python layer的使用,这个版本会比的版本速度慢10%,但是准确率应该是差不多的。
目前已经实现的有两种方式:
Alternative training
Approximate joint training
推荐使用第二种,因为第二种使用的显存更小,而且训练会更快,同时准确率差不多甚至略高一点。
建立自己的数据集
训练和检测
1配置python layers
#In your Makefile.config, make sure to have this line uncommented
WITH_PYTHON_LAYER := 1
# Unrelatedly, it's also recommended that you use CUDNN
USE_CUDNN := 112341234
2安装几个依赖cython, python-opencv, easydict
sudo apt-get install python-opencv
sudo pip install cython easydict1212
git clone --recursive /rbgirshick/py-faster-rcnn.git11
2编译Cython模块
cd $FRCN_ROOT/lib
3编译caffe和pycaffe
cd $FRCN_ROOT/caffe-fast-rcnn
# Now follow the Caffe installation instructions here:
http://caffe.berkeleyvision.org/installation.html
# If you're experienced with Caffe and have all of the requirements installed
# and your Makefile.config in place, then simply do:
make -j8 && make pycaffe12345671234567
安装步骤完成后,就可以运行一下demo了。
cd $FRCN_ROOT
./tools/demo.py1212
训练自己的训练集
工程目录简介
首先工程的根目录简单的称为 FRCN_ROOT,可以看到根目录下有以下几个文件夹
caffe-fast-rcnn
这里是caffe框架目录
用来存放pretrained模型,比如imagenet上的,以及读取文件的cache缓存
experiments
存放配置文件以及运行的log文件,另外这个目录下有scripts可以用end2end或者alt_opt两种方式训练。
用来存放一些python接口文件,如其下的datasets主要负责读取,我们接下来的文件都是放在这个目录下的;config负责cnn一些训练的配置选项,建议根据自己的需要在experiment/cfgs/faster_rcnn_end2end.yml文件中进行设置覆盖config.py中的设置。
里面存放了三个模型文件,小型网络的ZF,大型网络VGG16,中型网络VGG_CNN_M_1024。推荐使用VGG16,如果使用端到端的approximate joint training方法,开启CuDNN,只需要3G的显存即可。
这里存放的是训练完成后的输出目录,默认会在faster_rcnn_end2end文件夹下
里面存放的是训练和测试的Python文件。
创建数据集
接下来我们就要创建自己的数据集了,这部分主要在lib目录里操作。这里下面存在3个目录:
在这里修改读写数据的接口主要是datasets目录下
主要存放的是python的训练和测试脚本,以及训练的配置文件config.py
做非极大抑制的部分,有gpu和cpu两种实现方式
roi_data_layer
主要是一些ROI处理操作
这就是RPN的核心代码部分,有生成proposals和anchor的方法
1构建自己的IMDB子类
1.1文件概述
可有看到datasets目录下主要有三个文件,分别是
factory.py
pascal_voc.py
factory.py 是个工厂类,用类生成imdb类并且返回数据库共网络训练和测试使用;imdb.py 这里是数据库读写类的基类,封装了许多db的操作,但是具体的一些文件读写需要继承继续读写;pascal_voc.py Ross在这里用pascal_voc.py这个类来操作。
1.2读取文件函数分析
接下来我来介绍一下pasca_voc.py这个文件,我们主要是基于这个文件进行修改,里面有几个重要的函数需要修改
def init(self, image_set, year, devkit_path=None)
这个是初始化函数,它对应着的是pascal_voc的数据集访问格式,其实我们将其接口修改的更简单一点。
def image_path_at(self, i)
根据第i个图像样本返回其对应的path,其调用了image_path_from_index(self, index)作为其具体实现
def image_path_from_index(self, index)
实现了 image_path的具体功能
def _load_image_set_index(self)
加载了样本的list文件
def _get_default_path(self)
获得数据集地址
def gt_roidb(self)
读取并返回ground_truth的db
def selective_search_roidb
读取并返回ROI的db,这个是fast rcnn用的,faster版本的不用管这个函数。
def _load_selective_search_roidb(self, gt_roidb)
加载预选框的文件
def selective_search_IJCV_roidb(self)
在这里调用读取Ground_truth和ROI db并将db合并
def _load_selective_search_IJCV_roidb(self, gt_roidb)
这里是专门读取作者在IJCV上用的dataset
def _load_pascal_annotation(self, index)
这个函数是读取gt的具体实现
def _write_voc_results_file(self, all_boxes)
voc的检测结果写入到文件
def _do_matlab_eval(self, comp_id, output_dir=’output’)
根据matlab的evluation接口来做结果的分析
def evaluate_detections
其调用了_do_matlab_eval
def competition_mode
设置competitoin_mode,加了一些噪点
1.3训练数据格式
在我的检测任务里,我主要是在SED数据集上做行人检测,因此我这里只有background 和person 两类物体,为了操作方便,我像pascal_voc数据集里面一样每个图像用一个xml来标注。如果大家不知道怎么生成xml文件,可以用这个工具 ?
这里我要特别提醒一下大家,一定要注意坐标格式,一定要注意坐标格式,一定要注意坐标格式,重要的事情说三遍!!!要不然你会犯很多错误都会是因为坐标不一致引起的报错。
1.4修改读取接口
这里是原始的pascal_voc的init函数,在这里,由于我们自己的数据集往往比voc的数据集要更简单的一些,在作者代码里面用了很多的路径拼接,我们不用去迎合他的格式,将这些操作简单化即可,在这里我会一一列举每个我修改过的函数。这里按照文件中的顺序排列。
修改后的初始化函数:
class hs(imdb):
def __init__(self, image_set, devkit_path=None):
# modified
imdb.__init__(self, image_set)
self._image_set = image_set
self._devkit_path =
devkit_path
#datasets路径
self._data_path = os.path.join(self._devkit_path,image_set)
#图片文件夹路径
self._classes = ('__background__', # always index 0
#two classes
self._class_to_ind = dict(zip(self.classes, xrange(self.num_classes))) # form the dict{'__background__':'0','person':'1'}
self._image_ext = '.jpg'
self._image_index = self._load_image_set_index('ImageList.txt')
# Default to roidb handler
self._roidb_handler = self.selective_search_roidb
self._salt = str(uuid.uuid4())
self._comp_id = 'comp4'
# PASCAL specific config options
self.config = {'cleanup'
'use_salt'
'use_diff'
'matlab_eval' : False,
'rpn_file'
'min_size'
#小于16个像素的框扔掉
assert os.path.exists(self._devkit_path),
'VOCdevkit path does not exist: {}'.format(self._devkit_path)
assert os.path.exists(self._data_path),
'Path does not exist: {}'.format(self._data_path)
12345678910111213141516171819202122232425262728291234567891011121314151617181920212223242526272829
修改后的image_path_from_index:
def image_path_from_index(self, index): #modified
Construct an image path from the image's "index" identifier.
image_path = os.path.join(self._data_path,index +'.jpg')
assert os.path.exists(image_path),
'Path does not exist: {}'.format(image_path)
return image_path1234567812345678
修改后的_load_image_set_index:
def _load_image_set_index(self,imagelist): # modified
Load the indexes listed in this dataset's image set file.
# Example path to image set file:
# self._devkit_path + /VOCdevkit2007/VOC2007/ImageSets/Main/val.txt
image_set_file = os.path.join(self._devkit_path, imagelist)
assert os.path.exists(image_set_file),
'Path does not exist: {}'.format(image_set_file)
with open(image_set_file) as f:
image_index = [x.strip() for x in f.readlines()]
return image_index123456789101112123456789101112
gt_roidb(self):
这个函数里有个生成ground truth的文件,我需要特别说明一下,如果你再次训练的时候修改了数据库,比如添加或者删除了一些样本,但是你的数据库名字函数原来那个,必须要在data/cache/目录下把数据库的缓存文件.pkl给删除掉,否则其不会重新读取相应的数据库,而是直接从之前读入然后缓存的pkl文件中读取进来,这样修改的数据库并没有进入网络,而是加载了老版本的数据。
修改的_load_pascal_annotation(self, index):
def _load_pascal_annotation(self, index):
Load image and bounding boxes info from XML file in the PASCAL VOC
filename = os.path.join(self._devkit_path, 'Annotations', index + '.xml')
tree = ET.parse(filename)
objs = tree.findall('object')
if not self.config['use_diff']:
# Exclude the samples labeled as difficult
non_diff_objs = [
obj for obj in objs if int(obj.find('difficult').text) == 0]
# if len(non_diff_objs) != len(objs):
print 'Removed {} difficult objects'.format(
len(objs) - len(non_diff_objs))
objs = non_diff_objs
num_objs = len(objs)
boxes = np.zeros((num_objs, 4), dtype=np.uint16)
gt_classes = np.zeros((num_objs), dtype=np.int32)
overlaps = np.zeros((num_objs, self.num_classes), dtype=np.float32)
# "Seg" area for pascal is just the box area
seg_areas = np.zeros((num_objs), dtype=np.float32)
# Load object bounding boxes into a data frame.
for ix, obj in enumerate(objs):
bbox = obj.find('bndbox')
# Make pixel indexes 0-based
x1 = float(bbox.find('xmin').text)
y1 = float(bbox.find('ymin').text)
x2 = float(bbox.find('xmax').text)
y2 = float(bbox.find('ymax').text)
cls = self._class_to_ind[obj.find('name').text.lower().strip()]
boxes[ix, :] = [x1, y1, x2, y2]
gt_classes[ix] = cls
overlaps[ix, cls] = 1.0
seg_areas[ix] = (x2 - x1 + 1) * (y2 - y1 + 1)
overlaps = scipy.sparse.csr_matrix(overlaps)
return {'boxes' : boxes,
'gt_classes': gt_classes,
'gt_overlaps' : overlaps,
'flipped' : False,
'seg_areas' : seg_areas}123456789101112131415161718192021222324252627282930313233343536373839404142434445123456789101112131415161718192021222324252627282930313233343536373839404142434445
因为我和Pascal用了一样的xml格式,所以这个函数我的改动不多。如果你想用txt文件保存ground truth,做出相应的修改即可。
想采用txt方式存储的童鞋,可以参考文末博客的写法。
坐标的顺序强调一下,要左上右下,并且x1必须要小于x2,这个是基本,反了会在坐标水平变换的时候会出错,坐标从0开始,如果已经是0,则不需要再-1。如果怕出错,可以直接把出界的的直接置0.
记得在最后的main下面也修改相应的路径
from datasets.hs import hs
d = hs('hs', '/home/zyy/workspace/wangml/py-faster-rcnn/lib/datasets/')
res = d.roidb
from IP embed()12341234
OK,在这里我们已经完成了整个的读取接口的改写。
2修改factory.py
当网络训练时会调用factory里面的get方法获得相应的imdb,
首先在文件头import 把pascal_voc改成hs
# --------------------------------------------------------
# Fast R-CNN
# Copyright (c) 2015 Microsoft
# Licensed under The MIT License [see LICENSE for details]
# Written by Ross Girshick
# --------------------------------------------------------
"""Factory method for easily getting imdbs by name."""
__sets = {}
from datasets.hs import hs
import numpy as np
# # Set up voc_&year&_&split& using selective search "fast" mode
# for year in ['2007', '2012']:
for split in ['train', 'val', 'trainval', 'test']:
name = 'voc_{}_{}'.format(year, split)
__sets[name] = (lambda split=split, year=year: pascal_voc(split, year))
# # Set up coco_2014_&split&
# for year in ['2014']:
for split in ['train', 'val', 'minival', 'valminusminival']:
name = 'coco_{}_{}'.format(year, split)
__sets[name] = (lambda split=split, year=year: coco(split, year))
# # Set up coco_2015_&split&
# for year in ['2015']:
for split in ['test', 'test-dev']:
name = 'coco_{}_{}'.format(year, split)
__sets[name] = (lambda split=split, year=year: coco(split, year))
name = 'hs'
devkit = '/home/zyy/workspace/wangml/py-faster-rcnn/lib/datasets/'
__sets['hs'] = (lambda name = name,devkit = devkit: hs(name,devkit))
def get_imdb(name):
"""Get an imdb (image database) by name."""
if not __sets.has_key(name):
raise KeyError('Unknown dataset: {}'.format(name))
return __sets[name]()
def list_imdbs():
"""List all registered imdbs."""
return __sets.keys()123456789101112131415161718192021222324252627282930313233343536373839404142434445123456789101112131415161718192021222324252627282930313233343536373839404142434445
训练和检测
1.预训练模型介绍
首先在data目录下,有两个目录
faster_rcnn_models/
imagenet_models/
faster_rcnn_model文件夹下面是作者用faster rcnn训练好的三个网络,分别对应着小、中、大型网络,大家可以试用一下这几个网络,看一些检测效果,他们训练都迭代了80000次,数据集都是pascal_voc的数据集。
imagenet_model文件夹下面是在Imagenet上训练好的通用模型,在这里用来初始化网络的参数.
在这里我比较推荐大型网络,训练也挺快的,差不多25小时(titan black 6G)。
还有一个比较奇怪的现象,开启CuDNN一般情况是可以加速的,但是在训练ZF模型的时候,开启CuDNN反而会特别慢,所以大家如果训练特别慢,可以尝试关掉CuDNN。
2.修改模型文件配置
模型文件在models下面对应的网络文件夹下,在这里我用大型网络的配置文件修改为例子
比如:我的检测目标物是person ,那么我的类别就有两个类别即 background 和 person
因此,首先打开网络的模型文件夹,打开train.prototxt
修改的地方重要有三个
分别是这几个地方
首先在data层把num_classes 从原来的21类 20类+背景 ,改成 2类 人+背景
把RoI Proposal的’roi-data’层的 num_classes 改为 2
接着在cls_score层把num_output 从原来的21 改成 2
在bbox_pred层把num_output 从原来的84 改成8, 为检测类别个数乘以4,比如这里是2类那就是2*4=8
测试的时候,test.prototxt也需要做相应的修改。
OK,如果你要进一步修改网络训练中的学习速率,步长,gamma值,以及输出模型的名字,需要在同目录下的solver.prototxt中修改。
3.启动Fast RCNN网络训练
python ./tools/train_net.py --gpu 1 --solver models/hs/faster_rcnn_end2end/solver.prototxt --weights data/imagenet_models/VGG16.v2.caffemodel --imdb hs --iters 80000 --cfg experiments/cfgs/faster_rcnn_end2end.yml11
参数讲解:
这里的–是两个-,不要输错
train_net.py是网络的训练文件,之后的参数都是附带的输入参数
–gpu 代表机器上的GPU编号,如果是nvidia系列的tesla显卡,可以在终端中输入nvidia-smi来查看当前的显卡负荷,选择合适的显卡
–solver 代表模型的配置文件,train.prototxt的文件路径已经包含在这个文件之中
–weights 代表初始化的权重文件,这里用的是Imagenet上预训练好的模型,大型的网络我们选择用VGG16.v2.caffemodel
–imdb 这里给出的训练的数据库名字需要在factory.py的_sets中,我在文件里面有_sets[‘hs’],train_net.py这个文件会调用factory.py再生成hs这个类,来读取数据
4.启动Fast RCNN网络检测
可以参考tools下面的demo.py 文件,来做检测,并且将检测的坐标结果输出到相应的txt文件中。
鉴于之前我用的版本是15年11月的版本,有些小伙伴在使用此教程时会有一些错误,所以我重新做了部分修订,目前能够在日版本的版本上成功运行,如果有问题,随时联系我。
参考博客:
TA的最新馆藏
喜欢该文的人也喜欢

我要回帖

更多关于 怎样才能训练兔子 的文章

 

随机推荐