上次使用mnist对caffe进行了初步了解,这一次就要开始对毕设的任务进行尝试了。这次打算对ImageNet进行fine tune,使用的是行人检测数据集INRIA。

首先下载下来INRIA数据集,发现有Train和Test文件夹里的图片大小不固定,而且没有进行crop。而其中有两个子文件夹96X160H96和70X134H96下的图片是crop好的,可以直接拿来用作行人检测的正样本。但因为INRIA并不是针对caffe设计的,所以需要先对它进行一定处理。这里就需要明确哪些数据作为训练数据,哪些数据作为测试数据。因为只是对fine tuning进行测试,所以我这里没有对准备训练数据花很多精力,直接拿96X160H96/Train/pos文件夹下的图片作为训练正样本,Train/neg/下的图片作为训练负样本,70X134H96/Test/pos下的作为测试正样本,Test/neg/下的作为测试负样本。

然后需要做的是从这些数据产生lmdb数据,我直接借鉴了ImageNet的配置文件create_imagenet.sh稍作修改写了一个create_pedenet.sh。

为了方便管理路径起见,我又单独建立了一个data/pedestrian文件夹,下面有两个子文件夹train和val,分别装训练和测试数据,每个文件夹下又分别有pos和neg两个文件夹装正负样本。

在create_pedenet文件中,首先将DATA、EXAMPLE、TRAIN_DATA_ROOT和VAL_DATA_ROOT几个变量设置如下:

EXAMPLE=project/pedestrian/newdata/(是处理好之后的lmdb数据存储的路径,事先这个路径下一定不能有pedenet_train_lmdb和pedenet_val_lmdb两个文件夹)
DATA=data/pedestrian/(是存储图片路径的train.txt和val.txt两个文件的路径)
TOOLS=build/tools

TRAIN_DATA_ROOT=data/pedestrian/train/(存储训练数据的路径,TRAIN_DATA_ROOT + train.txt的每一行路径就对应着每个图片文件)
VAL_DATA_ROOT=data/pedestrian/val/(同上)

然后需要做的就是生成对应各个样本路径的train.txt和val.txt文件。这里我自己写了一个几十行的C程序专门生成这两个文件,将每个文件写成如下的格式:

pos/person_and_bike_209b.png   1
neg/00000002a.png   0

其中1表示正样本,0表示负样本(其实这个只是自己约定的label,机器并不知道哪个是正,哪个是负)。需要注意的是在windows系统中文件路径的分隔号是\\,而在linux系统中合法的分隔号是/,要注意区分,否则会出现找不到文件的错误:

E0321 21:50:27.440016  2448 io.cpp:80] Could not open or find file data/pedestrian/val/pos\person_037a.png

然后执行create_pedenet.sh,完成数据预处理:

~/caffe-master$ ./project/pedestrian/create_pedenet.sh
Creating train lmdb...
I0321 21:58:04.069706  2493 convert_imageset.cpp:82] Shuffling data
I0321 21:58:05.401593  2493 convert_imageset.cpp:85] A total of 3328 images.
I0321 21:58:05.402035  2493 db_lmdb.cpp:23] Opened lmdb project/pedestrian/newdata//pedenet_train_lmdb
I0321 21:58:19.187896  2493 convert_imageset.cpp:146] Processed 1000 files.
I0321 21:58:31.109478  2493 convert_imageset.cpp:146] Processed 2000 files.
I0321 21:58:43.797771  2493 convert_imageset.cpp:146] Processed 3000 files.
I0321 21:58:47.886440  2493 convert_imageset.cpp:152] Processed 3328 files.
Creating val lmdb...
I0321 21:58:48.577513  2502 convert_imageset.cpp:82] Shuffling data
I0321 21:58:49.921418  2502 convert_imageset.cpp:85] A total of 1426 images.
I0321 21:58:49.921867  2502 db_lmdb.cpp:23] Opened lmdb project/pedestrian/newdata//pedenet_val_lmdb
I0321 21:58:59.190737  2502 convert_imageset.cpp:146] Processed 1000 files.
I0321 21:59:03.346020  2502 convert_imageset.cpp:152] Processed 1426 files.
Done.

这样就完成了数据的预处理,产生的文件data.mdb和lock.mdb存储在EXAMPLE路径下面。

下一步就是计算图像的平均值。这个步骤在imagenet中是通过compute_imagenet_mean.sh脚本来进行的,这里我就直接把这个文件拿过来修改了一下它的变量,就可以直接使用:

EXAMPLE=project/pedestrian/newdata(是存储处理后的图片的路径)
DATA=data/pedestrian(是生成的目标文件pedenet_mean.binaryproto的存储路径)
TOOLS=build/tools

$TOOLS/compute_image_mean $EXAMPLE/pedenet_train_lmdb \
  $DATA/pedenet_mean.binaryproto

这样就生成了data/pedestrian/pedenet_mean.binaryproto文件,网络训练的前期准备工作完成了。

下面需要对网络的核心配置文件进行编辑,主要是train_val.prototxt和solver.prototxt两个文件。

solver.prototxt主要是训练阶段的一些配置,首先net变量要修改为train_val.prototxt文件的路径,然后根据caffe官网上的提示,为了使网络中除了最后一层之外的其它层权重改变尽可能的缓慢,最好把网络前部的学习率lr改小一些,为了方便,直接将全局的base_lr变量调小,我第一次试验将其从0.01改到了0.005。

train_val.prototxt主要是对网络结构和参数的定义,因为我是对imagenet网络进行调优,所以这里我直接在imagenet的配置文件的基础上进行修改,主要是需要修改一下TRAIN和TEST两个阶段分别对应的data层的数据输入路径,然后还需要修改fc8层的输出数量,从1000改到了2(是否是行人),然后顺便将fc8层的名称改为fc8_pede以便区分。除此之外,为了让结构改变的fc8_pede的权重学习速度加快,要将这一层的lr_mult调大一些,因为前面base_lr减小了一半,我直接将这一层的lr_mult提高了10倍。

这样就完成了两个核心配置文件的修改。这里发现,要对已经训练好的imagenet进行参数的fine-tuning,现在服务器上没有这个网络已经训练好的权重...所以现下载一个权重数据caffemodel文件。这可以执行如下的命令行:

./scripts/download_model_binary.py models/bvlc_reference_caffenet

这个数据文件大约200多M,下载过程视网速而定,我往实验室的服务器上下载的速度只有10k/s左右,大约需要7~8个小时= = 所以果断选择了先用迅雷下载到本地,再传到服务器上。下载的链接可以在./models/bvlc_reference_caffenet/readme.md文件里找到,其他需要调优的参数权重也可以用类似的方法找到。

然后修改train_pedenet.sh脚本为:

caffe % ./build/tools/caffe train -solver project/pedestrian/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel -gpu 0

然后执行这个脚本文件,就开始了网络的训练。首先会跳出一些提示信息显示网络的结构正在搭建,然后就开始了optimization过程,每1000次迭代都会显示一次accuracy,开始迭代之前accuracy是0.492,1000次之后是0.7897,再之后每1000次基本都维持在这个水平上。我分析这个网络精度不高的原因之一是网络的训练样本数量较少(训练正样本只有2400多,负样本只有1200多),与imagenet原来使用的动辄上万的训练样本量相差太大,而且网络结构上面主要优化的是最后一个全连接层的参数,所以参数的优化很快就达到了“饱和”状态,没有了继续提升的空间。因此要想提升网络的性能,一方面要用更大的数据集去进行训练,另一方面也需要考虑是否需要对网络结构进行调整。

caffe上手:使用INRIA行人数据集对BVLC Caffe进行fine-tuning相关推荐

  1. caffe上手2:使用INRIA行人数据集对BVLC Caffe进行fine-tuning

    上次使用mnist对caffe进行了初步了解,这一次就要开始对毕设的任务进行尝试了.这次打算对ImageNet进行fine tune,使用的是行人检测数据集INRIA. 首先下载下来INRIA数据集, ...

  2. C++调用YOLOv4模型对INRIA行人数据集进行识别

    C++调用YOLOv4模型对INRIA行人数据集进行识别 本文主要介绍了使用C++调用YOLOv4模型测试,并对INRIA行人数据集进行识别,识别率可达86.62% 一.编程环境 1.OpenCV4. ...

  3. 【计算机视觉】INRIA 行人数据集 (INRIA Person Dataset)

    官网: http://pascal.inrialpes.fr/data/human/ 下载地址: ftp://ftp.inrialpes.fr/pub/lear/douze/data/INRIAPer ...

  4. INRIA Person Dataset(INRIA 行人数据集)介绍

    该文主要内容为译文:http://pascal.inrialpes.fr/data/human/ 该数据集是原作者在行人检测研究工作中在图像和视频中收集的直立人样本,该研究的细节见论文: Histog ...

  5. VS+Opencv3.3下用HOG+SVM实现INRIA行人检测

    利用SVM训练一个分类器,用训练好的分类器对测试集里的数据进行检测. 这里是数据下载地址:INRIA行人数据集 点击页面下方的蓝色here即可下载. 下载完成之后,解压缩(为方便操作,建议放于项目目录 ...

  6. python caffe框架_ubuntu14.04 intel集成显卡配置caffe框架(用cpu跑)+pycharm自带python导入caffe框架...

    用cpu跑,不用安装CUDA. 1.安装依赖库 安装[build-essentials] 安装开发所需要的一些基本的包, sudo apt-get install build-essential BL ...

  7. 数据集cifar10到Caffe支持的lmdb/leveldb转换的实现

    在 http://blog.csdn.net/fengbingchun/article/details/53560637 对数据集cifar10进行过介绍,它是一个普通的物体识别数据集.为了使用Caf ...

  8. pythonvbb转换txt_Caltech行人数据集转化VOC数据集

    Caltech行人数据集转化VOC数据集 发布时间:2018-04-09 17:31, 浏览次数:1213 , 标签: Caltech VOC CaltechPestrian2VOC 代码仓库地址 1 ...

  9. 红绿灯交通标志机动车行人数据集

    文章目录 前言 数据集介绍 前言 红绿灯,交通标志,机动车,行人数据集,总共24000+张已标注图片,采用VOC数据集格式,每种标签独立保持,可单独训练,也可融合训练(xml标注,可转txt).需要可 ...

  10. CrowdHuman密集行人数据集转换代码(可任意选择某些类别的框)

    CrowdHuman密集行人数据集转换代码 转换顺序: (odgt--->voc--->coco) 1. odgt--->voc from xml.dom import minido ...

最新文章

  1. React 项目使用 React-router-dom 4.0 以上版本时使用 HashRouter 怎么控制 history
  2. 把对象的创建交给spring来管理——  1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期
  3. 点击下载!《阿里云SRE技术期刊》2021年5月刊发布啦!
  4. jmeter java接口,jmeter并发测试java接口 | 学步园
  5. java中哪些可以私有化_《Java基础学习笔记》JAVA修饰符之私有化(Private)
  6. 牙齿间隙变大怎么办_牙齿之间的间隙越来越大怎么办?
  7. [Ext JS]5.1.1 分组标题的表格(Grouped Header Grid)与使用技巧
  8. 解决allwinner bootlogo.bmg 开机logo 修改 后变绿
  9. 最新服务器处理器天梯,2019服务器CPU天梯图之性能排行榜(双路三路四路) - 服务器百科...
  10. 在上海社保千万不要断,如果断了,一定要这样做!
  11. excel能改编码_如何修改Excel的编码-excel编码设置,查看excel编码格式
  12. 微信公众号如何申请原创声明功能
  13. C语言if 语句的基本用法
  14. python教程55--D-Tale使用介绍
  15. Apache NiFi简介
  16. 二维图画法入门_手绘的基础(入门)
  17. Maltab GUI课程设计——LSTM长短期记忆网络回归预测
  18. vue-router 有哪几种导航钩子
  19. 线索二叉树的前序遍历
  20. 客户端访问https时应无浏览器(含终端)安全警告信息;_Http升级Https(Let#x27;s Encrypt)...

热门文章

  1. cesium之地图显示坐标、比例尺、海拔高度效果篇
  2. 1月10日云栖精选夜读:专访金榕:四年蜕变,阿里iDST是如何登上浪潮之巅的?...
  3. Lambda表达式实现有限状态机
  4. iOS.Debug.Simulator
  5. Redis笔记 -- 链表和链表节点的API函数(三)
  6. 粗略写了使用GD2制作文字图像demo
  7. Web API 2 入门——使用Web API与ASP.NET Web窗体(谷歌翻译)
  8. hihoCoder - 1079 - 离散化 (线段树 + 离散化)
  9. POJ 3274 Gold Balanced Lineup 哈希,查重 难度:3
  10. C++习题 对象数组输入与输出