FCN 全卷积网络训练

2024-08-23 13:58
文章标签 训练 网络 卷积 fcn

本文主要是介绍FCN 全卷积网络训练,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原理我已经在上篇博客说过,大家可以参考FCN原理篇

代码

FCN有官方的代码,具体地址是FCN官方代码 
不过我用的不是这个代码,我用的是别人修改官方的版本的代码,使用Chainer框架实现的,Chainer的源码链接: 
Chainer框架源码,如果大家使用过Keras的话,应该对它不会感到特别的陌生,Chainer: a neural network framework

好了,我使用的代码是FCN的Chainer implementation, 具体地址是FCN Chainer implementation

安装

安装很简单,直接pip或者源码安装都可以,但是我在我的机器上装过几次,发现使用pip的方式最后fcn.data_dir这个变量的值会指向到你系统的Python下的dist-packages这个目录,但是这个目录需要root权限,所以不推荐使用pip直接安装的方式; 关于此问题的说明见: 
fcn.data_dir的问题

所以我最后使用的是源码安装的方式,这里推荐使用virtualenv工具建立虚拟环境,实践中发现这是最不会出错的方式,推荐使用!

clone代码

Git clone https://github.com/wkentaro/fcn.git –recursive

使用virtualenv安装

sudo pip install virtualenv #安装virtualenv 
创建虚拟目录 
virtualenv test-fcn 
cd test-fcn 
激活虚拟环境 
source ./bin/activate 
克隆fcn代码 
git clone https://github.com/wkentaro/fcn.git –recursive 
cd fcn 
安装fcn 
python setup.py develop

demo

下载VOC2012数据集,放入fcn-data-pascal-VOC2012路径下 
1. 转换caffe model为Chainer model 
./scripts/caffe_to_chainermodel.py 
2. load model,进行分割 
./scripts/fcn_forward.py –img-files data/pascal/VOC2012/JPEGImages/2007_000129.jpg

训练自己的数据

这个前后搞了快一个月,才把最终的训练搞定,其中艰辛很多,在这里写出来供大家参考

准备自己的数据集

数据集做成VOC2012segementClass的样子,下图是示例,上面一张是原图,下面一张是分割图

ori 
seg

但是每一种label指定的物体都有对应的具体的颜色,这个我们犯了很多错,最后跟踪代码找出来的,具体的每一类的RGB值如下:

Index RGB值
0 (0,0,0)
1 (0,128,0)
2 (128,128,0)
3 (0,0,128)
4 (128,0,128)
5 (0,128,128)
6 (128,128,128)
7 (64,0,0)
8 (192,0,0)
9 (62,128,0)
10 (192,128,0

这里只列出10类的值,更多类的可以看下面这段代码:

def bitget(byteval, idx):return ((byteval & (1 << idx)) != 0)def labelcolormap(N=256):cmap = np.zeros((N, 3))  #N是类别数目for i in xrange(0, N):id = ir, g, b = 0, 0, 0for j in xrange(0, 8):r = np.bitwise_or(r, (bitget(id, 0) << 7-j))g = np.bitwise_or(g, (bitget(id, 1) << 7-j))b = np.bitwise_or(b, (bitget(id, 2) << 7-j))id = (id >> 3)cmap[i, 0] = rcmap[i, 1] = gcmap[i, 2] = bcmap = cmap.astype(np.float32) / 255 #获得Cmap的RGB值return cmapdef _label_rgb_to_32sc1(self, label_rgb):assert label_rgb.dtype == np.uint8label = np.zeros(label_rgb.shape[:2], dtype=np.int32)label.fill(-1)cmap = fcn.util.labelcolormap(len(self.target_names)) cmap = (cmap * 255).astype(np.uint8)  #转换为整数值for l, rgb in enumerate(cmap):mask = np.all(label_rgb == rgb, axis=-1)label[mask] = lreturn label
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

按照此颜色表做图就没有问题,代码可以正确的读取分割的ground-truth结果 
原始的图像放在fcn/data/pascal/VOC2012/JPEGImages 
分割的图像放在fcn/data/pascal/VOC2012/SegmentationClass 
之后在fcn/data/pascal/VOC2012/ImageSets/Segmentationtrain.txt,trainval.txt,val.txt,写入需要进行相应任务的图片的编号

修改代码

  1. fcn/scripts/fcn_train.py
# setup optimizeroptimizer = O.MomentumSGD(lr=1e-10, momentum=0.99) #这里的lr一定要小,大的话程序会报错,我使用的是1e-9optimizer.setup(model)# traintrainer = fcn.Trainer(dataset=dataset,model=model,optimizer=optimizer,weight_decay=0.0005,test_interval=1000,max_iter=100000,snapshot=4000,gpu=gpu,)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  1. fcn/fcn/pascal.py
target_names = np.array(['background','aeroplane','bicycle','bird','boat','bottle','bus','car','cat','chair','cow','diningtable','dog','horse','motorbike','person','potted plant','sheep','sofa','train','tv/monitor',]) #修改成自己的,记得按照颜色表写
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  1. fcn/fcn/util.py
def resize_img_with_max_size(img, max_size=500*500):  #修改max_size,按照实际写"""Resize image with max size (height x width)"""from skimage.transform import rescaleheight, width = img.shape[:2]scale = max_size / (height * width)resizing_scale = 1if scale < 1:resizing_scale = np.sqrt(scale)img = rescale(img, resizing_scale, preserve_range=True)img = img.astype(np.uint8)return img, resizing_scale
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. fcn/fcn/models/fcn32s.py
def __init__(self, n_class=21):  #修改类别n_classself.n_class = n_classsuper(self.__class__, self).__init__(conv1_1=L.Convolution2D(3, 64, 3, stride=1, pad=100),conv1_2=L.Convolution2D(64, 64, 3, stride=1, pad=1),conv2_1=L.Convolution2D(64, 128, 3, stride=1, pad=1),conv2_2=L.Convolution2D(128, 128, 3, stride=1, pad=1),conv3_1=L.Convolution2D(128, 256, 3, stride=1, pad=1),conv3_2=L.Convolution2D(256, 256, 3, stride=1, pad=1),conv3_3=L.Convolution2D(256, 256, 3, stride=1, pad=1),conv4_1=L.Convolution2D(256, 512, 3, stride=1, pad=1),conv4_2=L.Convolution2D(512, 512, 3, stride=1, pad=1),conv4_3=L.Convolution2D(512, 512, 3, stride=1, pad=1),conv5_1=L.Convolution2D(512, 512, 3, stride=1, pad=1),conv5_2=L.Convolution2D(512, 512, 3, stride=1, pad=1),conv5_3=L.Convolution2D(512, 512, 3, stride=1, pad=1),fc6=L.Convolution2D(512, 4096, 7, stride=1, pad=0),fc7=L.Convolution2D(4096, 4096, 1, stride=1, pad=0),score_fr=L.Convolution2D(4096, self.n_class, 1, stride=1, pad=0),upscore=L.Deconvolution2D(self.n_class, self.n_class, 64,stride=32, pad=0),)self.train = False
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

训练

./scripts/fcn_train.py

  1. 其会在fcn/data/ 下创建一个目录叫做SegmentationClassDataset_db,里面存放训练的图片的pickle数据,如果需要修改原始的训练图片则需要将此目录删除,否则默认读取此目录内的pickle数据作为图像的原始数据

  2. 会在fcn下创建snapshot这个目录,里面有训练保存的model,日志文件等,重新训练的话,建议删除此目录

使用自己训练的model

./scripts/fcn_forward.py -c path/to/your/model -i path/to/your/image 
结果存放在fcn/data/forward_out

这篇关于FCN 全卷积网络训练的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099581

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络 服务器端配置 在服务器端,你需要确保安装了必要的驱动程序和软件包,并且正确配置了网络接口。 安装 OFED 首先,安装 Open Fabrics Enterprise Distribution (OFED),它包含了 InfiniBand 所需的驱动程序和库。 sudo