文档章节

使用FCN训练自己的数据集

KyJason
 KyJason
发布于 2017/06/28 16:21
字数 1213
阅读 4.8K
收藏 0

精选30+云产品,助力企业轻松上云!>>>

最近需要用到FCN来分割一些物体,所以一直在苦苦学习中,光是跑FCN就用了挺久的时间,最重要的是在数据集的格式上。现在做一下总结,针对小白。如果有错误希望能及时指出。谢谢!


准备工作

我用的是caffe和fcn,caffe可以从这里获得

git clone https://github.com/BVLC/caffe.git

caffe的安装可以根据我的另一片博客深度学习ssd配置并在VGG模型上训练自己的数据来安装。

fcn使用这个fcn.berkeleyvision.org

git clone https://github.com/shelhamer/fcn.berkeleyvision.org.git

把fcn这个文件放在caffe目录中就可以了,如图:输入图片说明

现在准备用voc-fcn32s这个来训练。先把预先需要的模型下载了。在voc-fcn32s/solve.py中可以看到: 输入图片说明

所以我下载了一个vgg16的模型,地址:VGG_ILSVRC_16_layers


准备数据集

这个是最重要的,大部分不成功的原因都来自这里。 在voc-fcn32/train.prototxt中:输入图片说明 在val.prototxt中 输入图片说明

可以看到是使用sbd这个数据集进行训练,使用voc的数据集进行测试。在这里我们只需要更换'../data/sbdd/dataset'和'../data/pascal/VOC2011'就可以了。

**注意: **如果不想使用sdb那种存放数据格式的话,我们可以使用自己的数据格式。

打开voc_layers.py文件,可以看到有两个类,一个是处理voc数据集格式的,一个是处理sbd数据集格式的。 对于voc格式来说,目录的大概结构是这样的

VOC2011
|____JPEGImages
|____SegmentationClass
|____ImageSets
        |______Segmentation
  • JPEGImages中存放.jpg格式的彩色图片
  • SegmentationClass中存放label图片。重点注意: label图片一定是要单通道的!而且每个像素的值只能是从0开始到N。N为你定义的类别数+1,这个1是背景类,黑的。
  • Segmentation中存放写有图片的名字的train.txt,这个txt的名字要和上面图片中split参数决定,比如train.prototxt的split参数是train,而val.prototxt中的split参数则是seg11valid,所以就要叫做seg11valid.txt。txt文件中的图片名字不带路径和后缀。比如你的图片名字叫a.jpg,bb.jpg,ccc.jpg,那么里面在txt中就写
a
bb
ccc

这些目录结构可以对应代码中的:


# load indices for images and labels
split_f  = '{}/ImageSets/Segmentation/{}.txt'.format(self.voc_dir,self.split)
self.indices = open(split_f, 'r').read().splitlines()
self.idx = 0

...
...
...

def load_image(self, idx):

        im = Image.open('{}/JPEGImages/{}.jpg'.format(self.voc_dir, idx))
        in_ = np.array(im, dtype=np.float32)
        in_ = in_[:,:,::-1]
        in_ -= self.mean
        in_ = in_.transpose((2,0,1))
        return in_


def load_label(self, idx):

        im = Image.open('{}/SegmentationClass/{}.png'.format(self.voc_dir, idx))
        label = np.array(im, dtype=np.uint8)
        label = label[np.newaxis, ...]
        return label

如果想要把sbd的数据集像voc的一样简单的话可以按照这个代码把SBDDSegDataLayer类中的load_label函数改成

def load_label(self, idx):
        im = Image.open('{}/SegmentationClass/{}.png'.format(self.sbdd_dir, idx))
        label = np.array(im, dtype=np.uint8)
        label = label[np.newaxis, ...]
        return label

在load_image函数中的图片路径也需要改一改,还有加载txt的地方也要改一下。


训练

全部改完后就可以开始训练了。如果爆出一下文件找不到问题,那就自己修改下路径。 如果说surger,score找不到 那么修改solve.py文件,把import sys提前,并加入路径,如下:

import sys
sys.path.append('/your-path-to-caffe/caffe/fcn.berkeleyvision.org')
import caffe
import surgery, score

import numpy as np
import os

然后开心的运行这个文件开始训练:

输入图片说明

loss有点大,先观望一下,如果有错误我会及时更新。


后继 发现loss一直很到,直到结束依旧这样。输入图片说明

网上查了下原因,是说deconvolution layer没有初始化什么的,要加入weight filler 和bias filler,http://www.cnblogs.com/lvlvlvlvlv/p/6353637.html。 fcn中有提示说如果输出或者参数是0的话,可以加个surgery.transplant()

Why are all the outputs/gradients/parameters zero?: This is almost universally due to not initializing the weights as needed. 

To reproduce our FCN training, or train your own FCNs, it is crucial to transplant the weights from the corresponding ILSVRC net such as VGG16. The included surgery.transplant() method can help with this.

然后这个帖子 中发现使用规则

base_net = caffe.Net('vgg16.prototxt', 'vgg16.caffemodel', caffe.TEST)
surgery.transplant(solver.net, base_net)
del base_net

具体实现可以参考这个帖子,对于处理voc-fcn写的很详细。参照这个改完后200次迭代loss就下降了一半。

参考

ubuntu下caffe的FCN8模型训练

caffe GPU版本使用fcn分割自己的图像

caffe下fcn数据集制作的简化

图像分割实验:FCN数据集制作,网络模型定义,网络训练(提供数据集和模型文件,以供参考)

FCN网络训练 终极版

FCN模型训练中遇到的困难

FCN学习:Semantic Segmentation

FCN 论文笔记

FCN-for-semantic-image-segmentation 训练过程的一些坑记录

caffe的FCN的loss居高不下和执行训练命令的脚本有关是怎么回事?

caffe下用FCN做图像分割,如何制作训练集?

用 caffe做图像分割实验时,loss值很诡异

KyJason
粉丝 11
博文 67
码字总数 46303
作品 0
杭州
程序员
私信 提问
加载中
请先登录后再评论。
Jetson-inference

这是一个在NVIDIA Jetson TX1/TX2上部署基于TensorRT的深度学习推理和深度视觉感知的指导教程。 部署深度学习 欢迎使用我们针对NVIDIA DIGITS 和 Jetson TX1/TX2的推理和深度视觉实时运行库的...

CSDNhuaong
2017/12/20
0
0
R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记

R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记 深度学习班和视觉班寒老师和李老师讲过图像检测与识别,这篇笔记主要记录R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验。 R-FCN paper:...

osc_s8kmhvea
2019/03/17
5
0
图像语义分割代码实现(1)

谷歌最新语义图像分割模型 DeepLab-v3+ 现已开源 https://www.oschina.net/news/94257/google-open-sources-pixel-2-portrait-code https://blog.csdn.net/zizi7/article/details/77163969 ......

osc_hsi1evvg
2018/06/23
0
0
论文学习之路:训练第一个FCN

20K step gtx1060 6G 预计 2.7h 9:32-10.05 4000 step,33分钟*5=165分钟,GPU使用率99% Fully Convolutional Networks forSemantic Segmentation 这是CVPR 2015拿到best paper候选的论文。 ......

万三豹
05/15
0
0
FCN和U-Net

本文为转载,原博客地址:https://blog.csdn.net/justpsss/article/details/77170004# FCN 论文《Fully Convolutional Networks for Semantic Segmentation》 这篇论文作为用CNN来做语义分割......

咸鱼半条
03/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

垂直对齐div中的文本[复制] - Vertically align text within a div [duplicate]

问题: This question already has an answer here: 这个问题在这里已有答案: How do I vertically align text in a div? 如何在div中垂直对齐文本? 29 answers 29个答案 The code below (......

javail
17分钟前
7
0
OSChina 周一乱弹 —— 南方水到底多深

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: Various Artists-用印度乐器演奏苏联国歌(洛天侬 remix) 手机党少年们想听歌,请...

小小编辑
26分钟前
56
0
动态规划:LC121.买卖股票的最佳时机

题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 注意:你...

曦鱼violet
33分钟前
18
0
快递100云平台的安全措施--API限流

2、热点参数限流 注意: 若 entry 的时候传入了热点参数,那么 exit 的时候也一定要带上对应的参数(exit(count, args)),否则可能会有统计错误。 3、通过 ParamFlowRuleManager 的 loadRu...

bykk
44分钟前
19
0
在Bash中重定向stderr和stdout - Redirect stderr and stdout in Bash

问题: I want to redirect both stdout and stderr of a process to a single file. 我想将一个进程的stdout和stderr都重定向到一个文件。 How do I do that in Bash? 我该如何在Bash中做到...

富含淀粉
47分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部