深度学习图像分割算法—FCN代码实现

2023-11-01

FCN(全卷积网络)

原论文链接:https://arxiv.org/pdf/1411.4038.pdf

官方源代码:https://github.com/shelhamer/fcn.berkeleyvision.org截图如下

data文件夹:官方提供的四个数据集相关的文件,允许代码下载的数据集放在这个文件夹中

demo:官方代码提供的演示效果

nyud、pascalcontext、sififlow、voc开头的文件夹分别对应caffe网络及训练参数文件,由对应的名称可做对应的实验

nyud_layer.py,pascalcontext_layer.py,sififlow_layer.py,voc_layer.py分别是四个数据集对应的训练层

infer.py:测试需要的文件

score.py:求取分割得分的文件

surgery.py:权重转换文件

vis.py:可视化文件

官方开源代码提供了PASCAL VOC models,SIFT Flow models,PASCAL-Context models的完整(32s,16s,8s)的代码,但对于NYUD只提供了32s的代码,这里我们就以NYUD作为例子说明一下FCN-8s训练的完整过程。

源代码下载和数据集预处理

下载官方源代码:

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

下载VGG16的预训练模型,放在FCN源代码文件夹ilsvrc-nets下:

cd fcn.berkeleyvision.org/ilsvrc-nets
wget http://www.robots.ox.ac.uk/~vgg/software/very_deep/caffe/VGG_ILSVRC_16_layers.caffemodel

获取相对应的deploy文件,放到ilsvrc-nets文件夹下:

wget https://gist.githubusercontent.com/ksimonyan/211839e770f7b538e2d8/raw/0067c9b32f60362c74f4c445a080beed06b07eb3/VGG_ILSVRC_16_layers_deploy.prototxt

下载数据集到源代码data/nyud文件夹下,并解压数据集:

cd data/nyud
wget http://dl.caffe.berkeleyvision.org/nyud.tar.gz
tar -xvf nyud.tar.gz

解压以后的文件夹有

benchmarkData/groundTruth中存储着所有我们需要的分割的真值,data/images文件夹存储着原始的RGB文件。由于源代码设置的groundTruth路径和现有的路径不同,所以我们需要把groundTruth文件copy到指定路径:

mkdir segmentation
cp /home/bxx-mct/fcn.berkeleyvision.org/data/nyud/nyud/benchmarkData/groundTruth/*.mat segmentation/

 合并train.txt和val.txt:在nyud文件夹中新建一个空白文件命名为trainval.txt,然后将train.txt和val.txt中的内容Copy过去。

cat train.txt>>trainval.txt
cat val.txt>>trainval.txt

 nyud文件夹下面的内容

 FCN-32s网络的训练:

  • 将要用的.py文件Copy到nyud-fcn32s-color文件夹:包括infer.py、score.py、surgery.py、vis.py、nyud_layer.py
cp /home/bxx-mct/fcn.berkeleyvision.org/infer.py nyud-fcn32s-color
cp /home/bxx-mct/fcn.berkeleyvision.org/score.py nyud-fcn32s-color
cp /home/bxx-mct/fcn.berkeleyvision.org/surgery.py nyud-fcn32s-color
cp /home/bxx-mct/fcn.berkeleyvision.org/vis.py nyud-fcn32s-color
cp /home/bxx-mct/fcn.berkeleyvision.org/nyud_layers.py nyud-fcn32s-color
  • 修改solver.prototxt文件

该文件参数参考:https://blog.csdn.net/weixin_42702666/article/details/87794310

 

修改nyud-fcn32s-color/solve.py文件

import caffe
import surgery, score

import numpy as np
import os
import sys

try:
    import setproctitle
    setproctitle.setproctitle(os.path.basename(os.getcwd())) #获得当前路径(返回最后的文件名)
    #比如os.getcwd()获得的当前路径为/home/bxx-mct/fcn,则os.path.basename()为fcn;
    #setproctitle是用来修改进程入口名称,如C++中入口为main()函数
    
except:
    pass

#weights = '../ilsvrc-nets/vgg16-fcn.caffemodel'
vgg_weights = '../ilsvrc-nets/VGG_ILSVRC_16_layers.caffemodel'  #用来fine-tune的FCN参数
vgg_proto = '../ilsvrc-nets/VGG_ILSVRC_16_layers_deploy.prototxt'    #VGGNet模型

# init
#caffe.set_device(int(sys.argv[1])) 获取命令行参数,其中sys.argv[0]为文件名,argv[1]为紧随其后的那个参数
caffe.set_device(1) #GPU型号id,这里指定第二块GPU
caffe.set_mode_gpu()

#solver = caffe.SGDSolver('solver.prototxt')
#solver.net.copy_from(weights) #这个方法仅仅是从vgg-16模型中拷贝参数,但是并没有改造原先的网络,这才是不收敛的根源
solver = caffe.SGDSolver('solver.prototxt') #调用SGD(随即梯度下降)Solver方法,solver.prototxt为所需参数
vgg_net = caffe.Net(vgg_proto, vgg_weights, caffe.TRAIN)  #vgg_net是原来的VGGNet模型(包括训练好的参数)
surgery.transplant(solver.net, vgg_net)  #FCN模型(参数)与原来的VGGNet模型之间的转化
del vgg_net  #删除VGGNet模型 

# surgeries
interp_layers = [k for k in solver.net.params.keys() if 'up' in k] #interp_layers为upscore层
surgery.interp(solver.net, interp_layers) #将upscore层中每层的权重初始化为双线性内核插值

# scoring
test = np.loadtxt('../data/nyud/test.txt', dtype=str) #载入测试图片信息

for _ in range(50):
    solver.step(2000) #每2000次训练迭代执行后面的函数
    score.seg_tests(solver, False, val, layer='score') #测试图片

 (1)修改setup方法

  • 同时由于路径原因,需要修改nyud_layers.py中load_label function 的内容:

(2)修改 load_label方法

训练

以上配置全部结束,开始进行模型训练

cd nyud-fcn32s-color
mkdir snapshot
python solve.py

 训练100000次的结果,可以和原文比较,已经很接近论文的结果了,如果迭代次数为150000次的话,会与原论文结果相似。

测试

接下来利用生成的模型进行测试,修改infer.py文件如下,这里会用到测试时的deploy.prototxt文件。

# -*- coding: utf-8 -*-
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
plt.switch_backend('agg')
import scipy.io

CAFFE_ROOT = "/home/bxx-mct/caffe"
import sys
sys.path.insert(0, CAFFE_ROOT + '/python')

import caffe
import vis

# the demo image is "2007_000129" from PASCAL VOC

# load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe
im = Image.open('../demo/image.jpg')
in_ = np.array(im, dtype=np.float32)
in_ = in_[:,:,::-1]
in_ -= np.array((104.00698793,116.66876762,122.67891434))
in_ = in_.transpose((2,0,1))

#加载网络文件,与模型文件,并设置为测试模型
# load net
net = caffe.Net('./deploy.prototxt', './snapshot/train_iter_100000.caffemodel', caffe.TEST)
# shape for input (data blob is N x C x H x W), set data
net.blobs['data'].reshape(1, *in_.shape)
net.blobs['data'].data[...] = in_
# run net and take argmax for prediction
net.forward()
out = net.blobs['score'].data[0].argmax(axis=0)
scipy.io.savemat('./out.mat', {'X': out})

# visualize segmentation in PASCAL VOC colors
plt.imshow(out)
plt.show()
plt.axis('off')
plt.savefig('../demo/testout_32s.png')
#voc_palette = vis.make_palette(21)
#out_im = Image.fromarray(vis.color_seg(out, voc_palette))
#out_im.save('demo/output.png')
#masked_im = Image.fromarray(vis.vis_seg(im, out, voc_palette))
#masked_im.save('demo/visualization.jpg')

nyud-fcn32s-color文件夹下没有deploy.prototxt文件,可以根据以下方法生成:

nyud-fcn32s-color的文件夹,里面有trainval.prototxt文件,将文件打开,全选,复制,新建一个名为deploy.prototxt文件,粘贴进去,然后ctrl+F 寻找所有名为loss的layer 将这个layer统统删除,并去除第一层的python层。

实际删除的是:

layer {
  name: "data"
  type: "Python"
  top: "data"
  top: "label"
  python_param {
    module: "nyud_layers"
    layer: "NYUDSegDataLayer"
    param_str: "{\'tops\': [\'color\', \'label\'], \'seed\': 1337, \'nyud_dir\': \'../data/nyud\', \'split\': \'trainval\'}"
  }
}
 
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "score"
  bottom: "label"
  top: "loss"
  loss_param {
    ignore_label: 255
    normalize: false
  }
}

 然后在第一层添加:

layer {
  name: "input"
  type: "Input"
  top: "data"
  input_param {
    # These dimensions are purely for sake of example;
    # see infer.py for how to reshape the net to the given input size.
    shape { dim: 1 dim: 3 dim: 480 dim: 640 }
  }
}

运行文件infer.py即可。

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习图像分割算法—FCN代码实现 的相关文章

  • MASK R-CNN网络介绍

    目录 前言 一 MASK R CNN网络 1 1 RoIPool和RoIAlign 1 2 MASK分支 二 损失函数 三 Mask分支预测 前言 在介绍MASK R CNN之前 建议先看下FPN网络 Faster R CNN和FCN的介绍
  • 【计算机视觉

    文章目录 一 分割 语义相关 20篇 1 1 VideoCutLER Surprisingly Simple Unsupervised Video Instance Segmentation 1 2 Compositional Semant
  • 上/下采样的方法

    下采样方式一般使用池化 pooling 操作 上采样 upsampling 的三种方式 插值法 Interpolation 插值就是在周围像素色彩的基础上用数学公式计算补充插入像素点的色彩 但必须注意的是插值并不能增加图像信息 如双线性插值
  • CVPR 2020

    性能优于PDA MDA和SWDA等网络 作者团队 北京航空航天大学 1 引言 近年来 在基于深度学习的目标检测中见证了巨大的进步 但是 由于domain shift问题 将现成的检测器应用于未知的域会导致性能显著下降 为了解决这个问题 本文
  • YoloV7目标检测(Pytorch版)【详解】

    文章目录 一 网络结构 1 总体网络结构 2 主干网络介绍 backbone 2 1 多分支模块堆叠 2 2 下采样网络结构 2 3 整个backbone代码 3 FPN特征金字塔 二 预测结果的解码 1 获得预测框 置信度 种类的数值 2
  • 语义分割简单介绍

    文章目录 什么是语义分割 语义分割和图像分割的区别 语义分割的步骤 数据准备 模型构建 模型训练 模型评估 预测和应用 常用工具和框架 总结 什么是语义分割 语义分割是计算机视觉领域的一种图像分割技术 其目标是将一张图像中的每个像素分配给预
  • 【计算机视觉

    文章目录 一 分割 语义相关 11篇 1 1 Two Approaches to Supervised Image Segmentation 1 2 Boundary Refined Prototype Generation A Gener
  • priorityQueue优先级队列 (python、c++)

    优先级队列 优先级队列 python C 最近用优先队列写了一个SNIC超像素分割的工程 有兴趣的可以下载看看 VIP大佬让我赚一点下载积分吧 感激不尽 https download csdn net download koffee f 1
  • 基于深度学习的图像分割总结

    一 图像分割类别 随着深度学习的发展 在分割任务中出现了许多优秀的网络 根据实际分割应用任务的不同 可以大致将分割分为三个研究方向 语义分割 实例分割 全景分割 这三种分割在某种意义上是具有一定的联系的 语义分割 像素级别的语义分割 对图像
  • 图像分割的衡量指标详解

    转载自 http m blog csdn net u011771047 article details 72777349 http blog csdn net u014593748 article details 71698246 fps
  • 【语义分割】分层多尺度注意力 Hierarchical multi-scale attention for semantic segmentation

    文章目录 1 摘要 2 引言 3 本文相关方法 3 1 Multi scale context methods 3 2 Relational context methods 3 3 Multi scale inference 3 4 Aut
  • mmsegmentation 训练自己的数据集

    一 MMSegmentation是什么 MMSegmentation 是一个基于 PyTorch 的语义分割开源工具箱 它是 OpenMMLab 项目的一部分 他与MMDetection类似 集成了各种语义分割算法 可以快速验证语义分割效果
  • 医学图像分割评判标准及程序代码

    文章目录 1 图像分割指标 2 两个问题 3 IOU和假阳性率 4 准确率 Accuracy 精确率 Precision 召回率 Recall 和F1 Measure 参考资源 1 https blog csdn net zichen zi
  • labelme安装过程

    在Windows上的安装 首先安装Anaconda 可以安装Python2 7版本或Python3 6版本 百度一下官网 选择对应版本即可 安装成功后 打开Anaconda Prompt 然后依次输入以下命令 python2 conda c
  • 局部自适应阈值分割方法

    github地址 https github com radishgiant ThresholdAndSegment git Local Yanowitz 由于光照的影响 图像的灰度可能是不均匀分布的 此时单一阈值的方法分割效果不好 Yano
  • Opencv系列1_opencv对单张DCM文件的读取并显示

    实例1 opencv对单张DCM文件的读取并显示 include
  • 【MATLAB教程案例23】基于MATLAB图像分割算法仿真——阈值分割法、Otsu阈值分割法、K均值聚类分割法等

    FPGA教程目录 MATLAB教程目录 目录 1 软件版本 2 通过二值图实现图像分割 3 通过Otsu阈值分割实现图像分割
  • 1.3 【Mask-RCNN训练自己的数据集】---- Part Three: 用自己训练的模型进行测试(全部流程总结+部分释义)

    三 模型测试 import os import sys sys path remove opt ros kinetic lib python2 7 dist packages import random import math import
  • 图像分割2021

    cvpr2022总结 CVPR 2022 图像分割论文大盘点 大林兄的博客 CSDN博客 图像分割最新论文 尽管近年来实例分割取得了长足的进步 但如何设计具有实时性的高精度算法仍然是一个挑战 本文提出了一种实时实例分割框架OrienMask
  • 1.1【Mask-RCNN训练自己的数据集】---- Part One:制作数据集(全部流程总结+部分释义)

    写在前面 该实现基于Tensorflow Keras框架 在Ubuntu16 04下运行 官方github MaskRCNN demo 一 制作数据集 1 1 下载安装Labelme Labelme用来制作图像分割数据集 在安装Labelm

随机推荐

  • react-router V6 版本的使用(自己封装了 Redirect,使用 useRoute 等)

    react router V6 版本的使用 自己封装了 Redirect等 IndexRouter js 使用useRoute 做全局路由的搭建 包括嵌套路由 路由重定向 路由拦截 自己封装 路由懒加载 做了一个简单的封装 等 import
  • 五线谱音名和组别对照表_五线谱简谱对照表(五线谱1234567表示图)

    五线谱音阶图 音乐符号是世界上常用的符号 用来记录笔记的五行平行线称为谱线 工作人员有5条线 在这5条线中有4个房间 每行和每个房间上方都有一个音符 五条线和四个房间是不够的 并且可以添加其他房间和线 在学习职员记号之后 将始终使用它 因为
  • 入职华为外包一个月后,我离职向“北上广深”流浪了...

    这次来聊一个大家可能也比较关心的问题 那就是就业城市选择的问题 而谈到这个问题 就不可避免地会谈到一些关于 机会 技术氛围 跳槽 薪资水平 等等一系列问题 正好 这也是大家所常问的 我只能说来聊聊我的感受吧 我觉得城市选择非常重要 尤其对我
  • 链表大小排序方法c语言,5 种排序算法--C语言链表

    源码地址 GitHub https github com GYT0313 C DataStructure blob master sortIn5 c 包括 冒泡排序 快速排序 选择排序 插入排序 希尔排序 运行 注意 快速排序的核心代码应该
  • C#中属性赋值的步骤以及语法详解

    首先我们要先知道什么是C C 是由微软 Microsoft 开发 其中还包括C 面向过程 C C 是一个简单的 现代的 通用的 面向对象的编程语言 面向对象 是一种解决问题的思想 那么什么是对象 在程序员的眼中自己身边万物都可以理解为对象
  • python运行js文件_python-execjs(调用js)

    一 安装 pip3 install PyExecJS 电脑上要有nodejs环境 二 使用 一 获取js字符串 首先将js保存至于本地文件或者你可以可以直接读到内存 必须让js以python基础教程字符串的形式展示 注意点 字符串中不要出现
  • Go 获取10分钟前的时间,一天前的时间。。。

    time Now Add time Minute 10 golang的time包里面有个AddDate方法 nTime time Now yesTime nTime AddDate 0 0 1 logDay yesTime Format 2
  • FireFox浏览器的about:config参数大全及其具体用途介绍

    FireFox浏览器的about config参数大全及其具体用途介绍 注意 这还远不是所有的about config参数 由于设置参数太多 官方也只提供英文版本的说明 这里提供的FireFox about config配置参数并不完整 希
  • MSP430F5529学习笔记(4)——按键点灯

    MSP430F5529学习笔记 3 实现LED闪烁和呼吸灯 独立按键工作原理 目录 按键扫描 原理图分析 写程序 按下s1点亮LED1 1 首先我们需要告诉单片机 P2 1是输入还是输出 2 配置IO是否允许上下拉 3 配置IO是上拉还是下
  • 入坑前端:一文搞懂 Flex 布局

    前言 Flex 这个布局前前后后看了3次 第一次学的时候 发现有十几个属性值没耐心看完就没往下学了 作罢 第二次去看的时候大概搞明了Flex每个属性的用法 可没过几天又全部忘光了 第三次了解 Flex 于是就有了这篇笔记 估计是全网最易懂的
  • MyBatis 特殊字符转义拦截器 针对(_、\、%)

    一 问题反馈 今天公司测试向我反馈 系统用户模糊查询功能在用户名称包含特殊字符时 无法正常查询结果 二 问题验证 1 当like中包含 时 查询仍为全部 即 like 查询出来的结果与like 一致 并不能查询出实际字段中包含有 特殊字符的
  • 构建Camel和Raspberry Pi物联网

    该项目基于Camel技术 项目为IoT社区提供了一些很棒的新东西 这些东西是将电子设备 i2c SPI gpio tinkerforge 和云 pubnub cloudlet mqtt 连接在一起的新的物联网组件 在本实验中 我们将展示如何
  • 卡特兰数——括号匹配问题

    卡特兰数的递推公式是F n k 1 n F k 1 F n k k 0 n 1 F k F n k 1 一般性公式为F n C 2n n n 1 可以描述的问题有 1 n个元素的二叉查找树有多少种 2 n n棋盘从左下角走到右上角而不穿过主
  • Go语言-log

    1 log包 作为程序调试手段和运行记录 log是非常重要的 现在多数情况下并不是通过某个调试器来进行debug了 而是通过打log的方式观察和调试程序 可以根据自己的需要实现log功能 Go语言本身也已经内置了log包 这里研究Go语言内
  • 排序1:几种基本的排序方法

    在数据结构课里 一般会将查找和排序放在一起 大部分人都会感觉查找比排序容易 但是我们研究过算法之后就会发现查找远远难于排序 因为常见的排序方法是相对固定的 而查找除了最基本的二分查找外 还包含非常广的内容 二叉树 各种树 Hash 大数据下
  • Ubuntu更新动态链接库 sudo ldconfig

    error while loading shared libraries libg2o core so cannot open shared object file No such file or directory解决方法 在build文
  • 使有prometheus监控redis,mongodb,nginx,mysql,jmx(经典推荐!)

    以下操作在CENTOS7环境 使用prometheus做监控 使用grafana做dashboard的界面展示 因prometheus自带的监控web界面图形化展示方面比较弱 推荐使用grafana集成prometheus展示 一 软件安装
  • 运维日志排序_100分_B卷_自定义排序

    运维日志排序 题目描述 运维工程师采集到某产品线网运行一天产生的日志 n 条 现需根据日志时间先后顺序对日志进行排序 日志时间格式为 H M S N H表示小时 0 23 M表示分钟 0 59 S表示秒 0 59 N表示毫秒 0 999 时
  • Ubuntu16.04安装ns3.29过程

    安装ns3过程 版本ns3 29 在ns3的官方主页 http www nsnam org 上就能看到详细的安装文档 安装方式下载二进制文档进行编译 1 1 下载 点击Download 点击左侧ns 3 29 也可以自行下载其他版本 点击截
  • 深度学习图像分割算法—FCN代码实现

    FCN 全卷积网络 原论文链接 https arxiv org pdf 1411 4038 pdf 官方源代码 https github com shelhamer fcn berkeleyvision org截图如下 data文件夹 官方