(tensorflow)FCN:极其详细明白的部署自己数据集教程

最近要做分割,所以尝试下FCN。作为分割领域的开创者,本以为应该很快搞定,不曾想被网上一大堆坑爹教程狠狠坑了几把。愤而记录一下,目标是真真实实的把事情说清楚,弄明白,不清不楚的说就是坑人啊!!

一.下载源码

1.github上有多个版本的,我推荐原版的。原版是tf0.12,py2.7的,很多人应该跟我一样因为版本问题没有用原版,可是之后下载了3个版本,都有问题,而原版我tf1.12,py3.6竟然没有任何问题跑通了!此乃第一大坑,最浪费时间。(9.7测试在py3.7,tf1.14部署成功。)

https://github.com/shekkizh/FCN.tensorflow

二.下载网络和数据

2.1.下载VGG网络的权重参数,下载好后的文件路径为./Model_zoo/imagenet-vgg-verydeep-19.mat.

网址:http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat

2.2.下载训练会用到的数据集,并解压到路径: ./Data_zoo/MIT_SceneParsing/ADEChallengeData2016。

网址:http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip

代码会自动下载,但是比较慢,所以注释read_MITSceneParsingData.py第9行

2.3.文件结构如下所示:

三.测试

3.1.训练时把FCN.py中的全局变量mode该为“train”,运行该文件。

3.1.1这时在MIT_SceneParsing文件夹下面因该生成数据集打包文件MITSceneParsing.pickle文件,如果数据集出错这个文件不会出现。

3.1.2在logs文件夹下面应该会出现checkpoint.txt和权重记录文件。

3.1.3在logs/train logs/validation 文件夹下面出现tensorbord日志文件。使用

tensorboard --logdir=./logs/train

查看训练状况。

3.2.测试时改为“visualize”运行即可。

可以在logs文件夹下面看到分割结果。结果是灰度图。

import cv2
import os
img=cv2.imread("./pread.png")
img=img*50
cv2.imwrite("./pretest.png",img)
cv2.imshow("im",img)
cv2.waitKey(0)

可以看清楚一点。

四.到这步为止可能出现的问题

4.1.预测出来是白色雪花:

这意味着训练没有进行,检查数据集。务必下载原版数据集。

4.2.loss下降到3左右不再下降

耐心等待,如果一直不降,改小lr。也可能是代码问题,务必下载原版代码。

4.3.loss显示为nan

这意味着训练没有进行,检查数据集。务必下载原版数据集。

4.4 AttributeError: module 'scipy.misc' has no attribute 'imread'

scipy版本过高导致的:

pip install scipy==1.2.1

五.训练自己的数据集

5.1.安装labelme

pip install labelme

5.2.使用labelme打标签,生成的应该是json格式文件

5.3 关键大坑:将json转换成png格式label

网上大量的脚本是错的,这里坑了我很长时间。以防万一先我们采用labelme官方转换命令:

labelme_json_to_dataset ./挑一个测试json.json

以生成的png作为参照,应该有5个文件 info.yaml label_names.txt label_viz.png label.png 原图.png

因为labelme没有批量转换功能,所以要替换我的脚本。(所有代码文末尾github给出)

5.4批量生成json文件,网上的批量生成有很多的问题,用我的版本json_to_dataset.py来规避这些问题(所有代码文末尾github给出)基本代码感谢https://blog.csdn.net/xjtdw/article/details/94741984提供(他的代码独热编码转换部分存在问题,请用我的版本)

Labelme标注工具 json批量生成,解决了生成的label.png中,标注物体label不具备统一性的问题。

 python json_to_dataset.py ./你的json路径

注意在使用的时候要修改为你的分类

NAME_LABEL_MAP = {
    '_background_': 0,
    "cat": 1,
    "dog": 2,
}

LABEL_NAME_MAP = ['0: _background_',
                  '1: cat',
                  '2: dog']

5.5用move.py移动到网络数据data所在位置(所有代码文末尾github给出)

这里注意要好好修改文件路径

*5.6将png的原图改成jpg格式 transferjpg.py(所有代码文末尾github给出)

这一步也是个坑,有的博客说要把原图改为png,其实官网数据集给的就是jpg格式。所以最好还是用jpg格式的。png也可以,需要改下代码,所以可选。

如果不用jpg格式的话:

read_MITSceneParsingData.py 47行改成png

*5.7超级无敌大坑:将png的标注文件改成采用独热编码的灰度图(采用2019.11.12版本的json_to_dataset直接是就是独热编码的,不需要这一步)

这里很多很多博客没有提到,如果直接用labelme生成的图是不行的,需要转成灰度图。可是一转成灰度图很多人发现,跑也能跑,结果很差。这是因为没有将label独热编码。意思就是说一种类别对应一个灰度值。具体方法如下:

比如说我要做三分类:

首先采用showoneshot.py脚本查看当前图像转化成灰度图后的灰度值。结果为[0 34 125]

运行oneshot.py将图像转化成[0,1,2]

5.8修改分类数

FCN.py中NUM_OF_CLASSESS改为自己训练数据的类别数,注意加上背景,即分类物体+1。

这里有一个可能出现的问题:如果没有在5.7转化成独热编码,直接改了151这个数字,这是因为灰度值大于3了,会报错!!!!千万注意,很多人一直没搞明白这里!!

六.训练过程中需要注意的

6.1每次更换数据集需要删掉MITSceneParsing.pickle重新生成

6.2每次重新训练需要把log下面的checkpoint.txt和权重记录文件删除

所有提到的文件下载地址:https://github.com/liuzehao/FCN-tools

补充,数据增强:https://blog.csdn.net/liu506039293/article/details/103084672

注意:增强之后要改名字train-xxx的格式

luo-keras

  • 4
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 73
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值