FCN从原理到代码的理解

"语义分割"最原始的版本-->>Fully Convolutional Networks for Semantic Segmentation-->>FCNs.

理解FCN是理解当前最先进的deepLab-V3+的基础

#   python3.6
#   tensorflow1.8
#   GTX1060

这里引用博客大神的解释:

先看CNN结构图:

这里不难理解,很简单了.

CNN结构图

再进一步看FCN结构:

这里我简单说一下.其它基础自己Google.

  1. 多了一个全连接层,也就是在VGG的第五层加上三层全连接,其中前五层的Weight和Bias直接用VGG的参数当做初始值(迁移学习),后面三层参数高斯初始化设置.

  2. 然后使用三层"反卷积"接在第八层之后,这里的参数都是使用高斯初始化的.最后得到和输入图一样大小的图(end to end)

  3. 如何训练?这里比较麻烦,我看见网上很多人在问这个问题,我刚开始也一直纠结.

    举个例子:假设训练目标种类为151,输入一张图[28X28],而输出就是[28X28X151],这里对应CNN中的输出[1X151]一样的,不过FCN是基于像素的end to end.其中每一张图代表一个种类,图上的像素越大代表属于这个类的种类越大.最后经过softmax,这个函数简单理解就是归一化.

  4. 反卷积?这也是一个难点,我特意写了一篇文章去说明,请看我的 深入理解反卷积

FCN结构图
FCN总图
进一步理解图

最后说明以下代码问题:

  1. 关于版本的问题就不说啦,网上百度都是.
  2. Pickle 读取不了文件No Model:如果你安装了pillow,那就是由于文件MITSceneParsing.pickle生成的有问题,这里我将好的文件放在网上,你点击文件下载
  3. 关于卡死读取数据:把读取的数据弄小一点,肯定会影响训练model,看下面的代码~~
  4. 关于如何测试图片:网上很多人不会测试图片,这里我没测试(因为笔记本训练不了,训练小数据结果太差了).关于如何读取,请看下面代码.
    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)

代码训练+测试下载

参考资料:

引用图

其它资料没来急记录,请谅解

你可能感兴趣的:(FCN从原理到代码的理解)