"语义分割"最原始的版本-->>
Fully Convolutional Networks for Semantic Segmentation
-->>FCNs
.理解FCN是理解当前最先进的
deepLab-V3+
的基础
# python3.6
# tensorflow1.8
# GTX1060
这里引用博客大神的解释:
先看CNN结构图:
CNN结构图这里不难理解,很简单了.
再进一步看FCN结构:
FCN结构图 FCN总图 进一步理解图这里我简单说一下.其它基础自己
多了一个全连接层,也就是在VGG的第五层加上三层全连接,其中前五层的Weight和Bias直接用VGG的参数当做初始值(迁移学习),后面三层参数高斯初始化设置.
然后使用三层"反卷积"接在第八层之后,这里的参数都是使用高斯初始化的.最后得到和输入图一样大小的图(
end to end
)如何训练?这里比较麻烦,我看见网上很多人在问这个问题,我刚开始也一直纠结.
举个例子:假设训练目标种类为
151
,输入一张图[28X28]
,而输出就是[28X28X151]
,这里对应CNN中的输出[1X151]
一样的,不过FCN是基于像素的end to end
.其中每一张图代表一个种类,图上的像素越大代表属于这个类的种类越大.最后经过softmax
,这个函数简单理解就是归一化
.反卷积?这也是一个难点,我特意写了一篇文章去说明,请看我的 深入理解反卷积
最后说明以下代码问题:
- 关于版本的问题就不说啦,网上百度都是.
- Pickle 读取不了文件No Model:如果你安装了pillow,那就是由于文件
MITSceneParsing.pickle
生成的有问题,这里我将好的文件放在网上,你点击文件下载- 关于卡死读取数据:把读取的数据弄小一点,肯定会影响训练model,看下面的代码~~
- 关于如何测试图片:网上很多人不会测试图片,这里我没测试(因为笔记本训练不了,训练小数据结果太差了).关于如何读取,请看下面代码.
train_records, valid_records = scene_parsing.read_dataset(FLAGS.data_dir)
print(len(train_records)) # 长度
print(len(valid_records))
train_records = train_records[0:100]
#valid_records = valid_records[0:1000]
elif FLAGS.mode == "visualize":
# 可视化,这里是读入的数据,直接在这里把valid_images/valid_annotations改成你的训练图片和标签图,你可以在线看一下格式,读取进来做个修改就行了.
valid_images, valid_annotations = validation_dataset_reader.get_random_batch(FLAGS.batch_size)
# pred_annotation预测结果图
pred = sess.run(pred_annotation, feed_dict={image: valid_images, annotation: valid_annotations,
keep_probability: 1.0})
valid_annotations = np.squeeze(valid_annotations, axis=3)
pred = np.squeeze(pred, axis=3)
for itr in range(FLAGS.batch_size):
utils.save_image(valid_images[itr].astype(np.uint8), FLAGS.logs_dir, name="inp_" + str(5+itr))
utils.save_image(valid_annotations[itr].astype(np.uint8), FLAGS.logs_dir, name="gt_" + str(5+itr))
utils.save_image(pred[itr].astype(np.uint8), FLAGS.logs_dir, name="pred_" + str(5+itr))
print("Saved image: %d" % itr)
参考资料:
网友评论