利用FCN-32s,FCN-16s和FCN-8s训练自己制作的数据集

前言

之前写过一篇博客是制作自己的数据集利用FCN-32s模型训练,对FCN-16s和FCN-8s训练写的比较粗略,所以写这篇博客主要是补充FCN-16s和FCN-8s训练过程。

训练前准备

在使用fcn之前需要配置caffe环境,可以参考win10+vs2013+caffe+gpu+python环境配置这篇博客,对如何制作自己的数据集以及FCN-32s训练过程可以参考FCN制作自己的数据集并训练和测试这篇博客

训练过程

训练FCN-16s
如果你的fcn-32s模型训练好之后,会在路径D:\caffe\caffe-master\fcn-master\voc-fcn32s\snapshot(这是我fcn-master代码的路径)中看到train_iter_100000.caffemodel文件,这个文件就是FCN-32s模型权重。如果你的fcn-32s模型训练好之后,会在路径D:\caffe\caffe-master\fcn-master\voc-fcn32s\snapshot(这是我fcn-master代码的路径)中看到train_iter_100000.caffemodel文件,这个文件就是FCN-32s模型权重。
在这里插入图片描述
接着在fcn-master目录下找到所有py文件复制到voc-fcn16s文件夹中,同时新建文件夹snapshot
在这里插入图片描述
你的文件夹中可能没有deploy.prototxt文件,这里给出下载地址deploy,里面有两个文件,将deploy_fcn16.prototxt重命名为deploy.prototxt并复制到到voc-fcn16s文件夹中
在这里插入图片描述
用vs打开solver.prototxt文件,这里面是一些参数配置,由于我的图片较少,所以我把test_iter参数改为2,这个参数是指在测试时一次测试多少张图片。其他参数默认就行。
在这里插入图片描述
对于train.prototxt,val.prototxt和voc_layers.py三个文件修改的方法和训练fcn-32s时一模一样,所以参考上述的FCN制作自己的数据集并训练和测试的博客就行。

打开solve.py文件,修改代码为下

import caffe
import surgery, score

import numpy as np
import os
import sys
sys.path.append('D:/caffe/caffe-master/python')
try:
    import setproctitle
    setproctitle.setproctitle(os.path.basename(os.getcwd()))
except:
    pass

weights = 'D:/caffe/caffe-master/fcn-master/voc-fcn32s/snapshot1/train_iter_100000.caffemodel'

# init
#caffe.set_device(int(sys.argv[1]))
caffe.set_mode_gpu()
caffe.set_device(0)

solver = caffe.SGDSolver('solver.prototxt')
solver.net.copy_from(weights)


# surgeries
interp_layers = [k for k in solver.net.params.keys() if 'up' in k]
surgery.interp(solver.net, interp_layers)

# scoring
val = np.loadtxt('D:/caffe/caffe-master/fcn-master/data/pascal/VOCdevkit/VOC2012/ImageSets/Segmentation/seg11valid.txt', dtype=str)

for _ in range(25):
    solver.step(4000)
    score.seg_tests(solver, False, val, layer='score')

到这所有准备工作都已结束,下面开始训练。
在cmd命令窗口中,指定到fcn-master\voc-fcn16s目录下,输入python solve.py命令,如下所示。
在这里插入图片描述
等待漫长的训练后,在voc-fcn16s\snapshot目录下生成train_iter_100000.caffemodel文件
在这里插入图片描述

测试单张图片
打开infer.py文件,修改代码如下,其中data文件夹是我在voc-fcn16s目录下创建的,不是fcn-master目录下的data

import numpy as np
from PIL import Image

import caffe
import vis
import sys
sys.path.append('D:/caffe/caffe-master/python')

# 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('data/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)

# visualize segmentation in PASCAL VOC colors
voc_palette = vis.make_palette(5)
out_im = Image.fromarray(vis.color_seg(out, voc_palette))
out_im.save('data/output.png')
masked_im = Image.fromarray(vis.vis_seg(im, out, voc_palette))
masked_im.save('data/visualization.jpg')

到此所有的fcn-16s模型训练工作都已结束。

训练FCN-16s用的是FCN-32s的权重,训练FCN-8s用的是FCN-16s的权重,所以对于FCN-8s模型的训练和FCN-16s训练的过程一模一样,所以在这就不在重复叙述了,如果又不懂的地方可以随时问我,我的邮箱是905885574@q.com,欢迎一起交流探讨。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: FCN-8sFCN-16sFCN-32s是基于全卷积神经网络(Fully Convolutional Network,FCN)的语义分割模型。它们分别使用了8倍、16倍、32倍的下采样和上采样,以实现对输入图像的像素级别的分类和分割。其中,FCN-8s是最早提出的模型,FCN-16sFCN-32s则是在其基础上进行了改进和优化。这些模型在图像分割领域取得了很好的效果,被广泛应用于自动驾驶、医学图像分析等领域。 ### 回答2: FCN是全卷积神经网络(Fully Convolutional Networks)的缩写,是在CNN(卷积神经网络)的基础上进行修改和扩展得到的一个特殊网络结构。FCN的主要特点是可以处理图像的变换和尺度变化,能够输出与输入图像大小相同的特征图,是语义分割和目标识别领域常用的方法之一。 FCN-8sFCN-16sFCN-32sFCN的三种不同变种。其中的数字表示网络最后一层的步长(stride)。简单来说,stride指的是卷积核在对图像进行卷积时每次移动的像素数。步长为1时,卷积核每次移动一个像素;步长为2时,每次移动两个像素。 FCN-32s是最简单的FCN结构,它的输出尺寸为输入图像尺寸的1/32,每层卷积后,特征图的尺度会缩小2倍,因此需要先将输入图像缩小32倍,然后送入网络进行训练和测试。FCN-32s的性能较低,适合处理相对较小的图像。 FCN-16sFCN-8sFCN网络中比较优秀的版本。他们的输出分别为输入图像尺寸的1/16和1/8。FCN-16sFCN-32s的主要区别在于初始化策略不同。在FCN-16s中,使用了另一个FCN-32s模型的参数来进行初始化,同时保留了FCN-32s中的pool5层,这样可以利用FCN-32s中的pool5层提取的高层特征来进行计算,从而提高分割的精度。在FCN-8s中,使用了FCN-16s模型的参数来进行初始化,同时再加入一个新的迭代层来进行计算,提取更多的低层特征,从而进一步提高分割的精度。 总之,FCN-32sFCN-16sFCN-8s是一系列针对不同需求的图像语义分割神经网络。在实际应用中,可以根据具体需求和计算资源等因素选择不同的FCN结构,以获得更好的分割效果。 ### 回答3: FCN(Fully Convolutional Network)是一种基于卷积神经网络的语义分割网络模型。FCN架构的出现,使得我们可以用卷积神经网络来解决图像语义分割问题。FCN-8sFCN-16sFCN-32sFCN网络的不同版本,下面我将分别介绍它们的特点和应用。 FCN-8s FCN-8s是第一个被提出并被广泛应用的FCN版本。它的主要特点是将VGG-16网络的最后三层全连接层(FC6,FC7和FC8)替换为卷积层。这个替换过程将输入图像映射到相应的feature map,以此来解决图像中像素级别的物体分类问题。FCN-8s包含了三个分辨率的feature map,分别是14×14,28×28和56×56。这三个特征图分别代表了高层次,中层次和低层次的图像特征。FCN-8s性能达到了目前最好的语义分割模型。 FCN-16s FCN-16sFCN的改进版本。它是在FCN-8s的基础上加入了额外的pooling层,从而使得feature map的分辨率减小了,并提高了模型的速度。FCN-16s包含了两个分辨率的feature map,分别是14×14和28×28。它的主要应用是在对速度要求较高的任务中进行物体的语义分割。 FCN-32s FCN-32s是最简单的FCN版本。它是将VGG-16网络的所有全连接层都替换为卷积层,并且只有一个feature map,分辨率为32×32。FCN-32s训练速度和推断速度都很快,并且是一个参数较少的模型。但是,它的性能要略低于FCN-16sFCN-8s。 总之,FCN-8sFCN-16sFCN-32s都是基于卷积神经网络的图像语义分割模型,它们分别在速度和准确性方面有所不同,并适用于不同类型的场景。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花生米生花@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值