Pytorch实现的语义分割器

使用Detectron预训练权重输出 *e2e_mask_rcnn-R-101-FPN_2x* 的示例

从Detectron输出的相关示例

使用Detectron预训练权重输出 *e2e_keypoint_rcnn-R-50-FPN_s1x*的示例

这个代码是按照Detectron的安装架构来实现的,仅支持部分功能性,你可以通过点击此链接来获取更多相关信息。

通过这个代码,你可以……

  1. 根据草图训练模型;
  2. 通过使用Detectron中得到预训练权重(*.pk)来进行推断;

这个储存器最早是建在jwyang/faster-rcnn.pytorch上的,但是经过多次的修改,这个结构已经变了很多了而且现在更类似于Detectron。为了直接从正式的预训练权重文件中重新得到结果,我刻意将所有东西弄得和Detectron的运行方法相似或者一致了。

这个工具有以下特征:

  • 这个完全是Pytorch代码,当然了,也有一些CUDA代码。
  • 它支持多图像的批处理加工训练。
  • 它支持多GPUs 训练。
  • 它支持三种合并方法,但是需要注意的是只有roi align能被改进去匹配 Caffe2的安装。所以,尽管去用就好了。
  • 它可以高效利用内存。对于数据的批处理,这儿有两种可选择的技术去减少显存使用量:1)根据类别分组:同批次的一组图像是有相似的类别比率 2)根据类别剪裁:剪裁图像太长了。 类别分组是在Detectron运行,所以用来默认,类别剪裁是来自jwyang/faster-rcnn.pytorch,所以它不能用来默认。

除此之外,我提供一个定制化的模型nn.DataParallel ,它能够使不同批次混乱的型号出现在不同的绘图处理器上。你可以在My nn.DataParallel 这节找到更多关于这个的详细内容。

支持的网络模型

  • 主要架构:

ResNet series: ResNet50_conv4_body, ResNet50_conv5_body, ResNet101_Conv4_Body, ResNet101_Conv5_Body, ResNet152_Conv5_Body

FPN: fpn_ResNet50_conv5_body, fpn_ResNet50_conv5_P2only_body, fpn_ResNet101_conv5_body,fpn_ResNet101_conv5_P2only_body, fpn_ResNet152_conv5_body, fpn_ResNet152_conv5_P2only_body

  • ResNeXt也被运行了但是还没有测试。
  • Box head: ResNet_roi_conv5_head, roi_2mlp_head
  • Mask head: mask_rcnn_fcn_head_v0upshare, mask_rcnn_fcn_head_v0up, mask_rcnn_fcn_head_v1up4convs, mask_rcnn_fcn_head_v1up
  • Keypoints head: roi_pose_head_v1convX

注意:这个命名和那个用在Detectron的是相似的。只是删掉前置的add_,如果有的话。

支持的数据集

现在只有COCO是被支持的。但是,整个数据集库运行几乎是和 Detectron的是一样的,所以用Detectron支持添加更多的数据集是很简单的。

配置选择

架构单一明确的配置文件是放在configs下的。 一般的配置文件lib/core/config.py里所有的选项都基本是和Detectron相同的默认值。所以把架构单一的configs转化到Detectron是非常轻松的。

怎样把配置文件从Detectron转化出来

1. 删除 MODEL.NUM_CLASSES 。在JsonDataset初赋值过程中被设置。

2. 删除 TRAIN.WEIGHTS,TRAIN.DATASETS 和TEST.DATASETS。

3. 在模型类型的选择中,

(比如: MODEL.CONV_BODY,FAST_RCNN.ROI_BOX_HEAD ……) 如果在数串中存在 add_,则将其删除。

4. 如果想给模型加载更多的ImageNet 预训练权重,添加指向预训练权重文件的RESNETS.IMAGENET_PRETRAINED_WEIGHTS 。如果没有就把MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS设置成 False

更多的细节

一些选项是不能使用的因为相关的功能性还没有实现。但是有一些不能被使用的原因是我用不同方法安装了程序。

这里有一些没有影响但值得注意的选项:

  • SOLVER.LR_POLICY, SOLVER.MAX_ITER, SOLVER.STEPS,SOLVER.LRS :就目前情况,训练指令被这些命令行参数控制:

--epochs:要训练多少 epochs 。一个 epoch意味着要遍历整个训练集并且将默认值设为6。

--lr_decay_epochs:每一epochs都是衰减学习率的。 衰减是发生在每个 epoch的开始。 Epoch 是 以0索引开始的,默认值是 [4, 5]。

要获得更多地命令行参数,请参考python train_net.py --help

  • SOLVER.WARM_UP_ITERS, SOLVER.WARM_UP_FACTOR, SOLVER.WARM_UP_METHOD: 在纸上做预热训练Accurate,Large Minibatch SGD:在一小时内训练 ImageNet 是不能被运行的。
  • OUTPUT_DIR :使用命令行参数来代替--output_base_dir 去明确化输出目录。

当更多地选项被提供:

  • MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS = True:是否载入 ImageNet的预训练权重。

    RESNETS.IMAGENET_PRETRAINED_WEIGHTS = ‘‘:预训练网络的权重文件路径。如果是以 ‘/‘ 开始的,那它就是一个绝对路径。否则就会被当作是一个和ROOT_DIR相关的路径。

  • TRAIN.ASPECT_CROPPING = False, TRAIN.ASPECT_HI = 2,TRAIN.ASPECT_LO = 0.:根据类别选项的剪裁去限制图像类别比率范围的选项。
  • RPN.OUT_DIM_AS_IN_DIM = True,RPN.OUT_DIM = 512 ,RPN.CLS_ACTIVATION = ‘sigmoid‘ :RPN的正式运行有相同的输入和输出特征通道,它们使用sigmoid作为激活函数作为对fg/bg class类的输出预测,在jwyang‘s implementation,它把输出路径数字确定为512而且使用softmax为激活函数。

我的nn.DataParallel

TBA

开始

克隆这个仓库:

git clone https://github.com/roytseng-tw/mask-rcnn.pytorch.git

命令

在 python3下测试。

  • python安装包

pytorch==0.3.1 (cuda80, cudnn7.1.2)

torchvision==0.2.0

numpy

scipy

opencv

pyyaml

pycocotools— COCO数据集专用,也可以通过 pip安装。

tensorboardX —可以在Tensorboard上记录losses。

  • 一个 NVIDAI GPU 和 CUDA 8.0 或者更高。一些操作只有gpu 安装。
  • 注意:不同版本的 Pytorch安装包有不同的显存使用量。

编写

编写CUDA代码:

cd lib # please change to this directory

sh make.sh

如果你在使用 Volta GPU, 在lib/mask.sh 文件中取消注释这一句并且记住在上面这行后打上一个反斜杠。CUDA_PATH 路径默认为/usr/loca/cuda 。如果你想要在不同路径下使用CUDA库,根据实际情况改变这行语句。

这条语句将会编译你需要的所有模块,包括NMS、 ROI_Pooing、ROI_Crop 和 ROI_Align模块。 (事实上GPU NMS模块从未被使用过...)

特别注意的是,如果你使用CUDA_VISIBLE_DEVICES 来设置GPU,确保在编译代码的时候至少有一个GPU可见。

数据准备

在repo下创建一个数据文件夹,

cd {repo_root}

mkdir data

  • COCO:下载coco图片数据 以及从coco网站上获得的注释

确保根据下面的文件结构将文件放置好:

coco

├── 注释

| ├── instances_minival2014.json

│ ├── instances_train2014.json

│ ├── instances_train2017.json

│ ├── instances_val2014.json

│ ├── instances_val2017.json

│ ├── instances_valminusminival2014.json

│ ├── person_keypoints_train2014.json

│ ├── person_keypoints_train2017.json

│ ├── person_keypoints_val2014.json

│ └── person_keypoints_val2017.json

└── 图片

├── train2014

├── train2017

├── val2014

└── val2017

下载instances_minival2014.json和instances_valminusminival2014.json的链接

随便将数据集放在任意想放的地方,然后将数据集软连接到data/ 文件夹下:

ln -s path/to/coco data/coco

推荐将图片输入SSD网络来使训练效果更加好。

根据我的经验来看, COCO2014针对相关的图片数据有一些不同尺寸(h,w)的掩码注释。可能 instances_minival2014.jsoninstances_valminusminival2014.json 包含了错误的掩码注释。然而COCO2017 数据集并没有这个问题.。据说 COCO train2017数据集 与 (COCO train 2014 + COCO minival 2014)相当 ,并且 COCO test 2017数据集 与COCO valminusminival 2014数据集相当。 因此,使用 COCO 2017 训练-验证切分集来重做结果是可以的。

预训练模型

我使用ImageNet数据在 Caffe中为骨干网络预训练权重。

  • ResNet50,ResNet101,ResNet152
  • VGG16 (vgg骨干网络现在还没有完成)

下载它们并把它们放在 {repo_root}/data/pretrained_model路径下。

你可以使用下面的命令行语句将它们全部下载下来:

- 额外需要的安装包:argparse_color_formater, colorama

python tools/download_imagenet_weights.py

注: Caffe的预训练权重比Pytorch 预训练的效果要稍好一些。我们使用Caffe 预训练上面链接的模型来重做结果。顺便提一点,Detectron(一个开源目标检测库)也使用Caffe预训练得到的权重。

如果你想用pytorch预训练模型,请记住将图片数据从BGR矩阵转化为RGB矩阵,并且也用pytorch预训练模型过程中相同的数据处理方法(去均值以及标准化)。

训练

  • 基于res50骨干网络从头开始训练mask-rcnn网络

python tools/train_net.py --dataset coco2017 --cfg configs/e2e_mask_rcnn_R-50-C4.yml --use_tfboard --bs {batch_size} --nw {num_workers}

使用 --bs 来将默认的批处理规模 (例如8)改变为适合你GPU的合适值。类似地还有--nw(数据加载线程在config.py中默认为4)。

使用 —use_tfboard 在Tensorboard上展示损失函数的对数值。

  • 在每个训练期结束的时候,通过完全相同的设置对训练效果进行概括性展示。

python tools/train_net.py --dataset coco2017 --cfg configs/e2e_mask_rcnn_R-50-C4.yml --resume --load_ckpt {path/to/the/checkpoint} --bs {batch_size}

w/ 和 w/o --resume的区别:如果规定了--resume,优化器状态将会被从 checkpoint文件中加载下来,否则将不会加载。

  • 训练 keypoint-rcnn网络

python tools/train_net.py --dataset keypoints_coco2017 ...

  • Detectron预训练权重的调整

python train_net.py --dataset coco2017 --cfg cfgs/e2e_mask_rcnn_R-50-C4.yml --load_detectron {path/to/detectron/weight} --bs {batch_size}

注:优化器状态 (SGD的动量) 没有被加载(或被实现)。

推断结果

python tools/infer_simple.py --dataset coco --cfg cfgs/e2e_mask_rcnn_R-50-C4.yml --load_detectron {path/to/detectron/weight} --image_dir {dir/of/input/images} --output_dir {dir/to/save/visualizations}

--output_dir 默认为infer_outputs。

衡量标准

keypoint_rcnn

  • e2e_keypoint_rcnn_R-50-FPN

训练命令行: python tools/train_net.py --dataset keypoints_coco2017 --cfg configs/e2e_keypoint_rcnn_R-50-FPN.yaml --bs 8

以8张图片为一个批训练集,将数据集训练6个周期,从第5个和第6个训练周期开始后学习率以0.1倍速衰减。每个周期迭代 (113198 / 8) (向下取整)= 14149次。

数据集: keypoints_coco_2017_val

任务:框定盒

任务:关键点

表格中的值为Detectron e2e_keypoint_rcnn_R-50-FPN_1x网络得到的AP值,该网络以16张图片为批训练集迭代训练90000次,在第60000次和第80000次迭代开始后学习率以0.1倍速衰减。

可视化

从头开始基于coco_train_2017数据训练 e2e_mask_rcnn_R-50_C4 网络,以4张图片为一批进行处理,训练了1 个训练周期:

Github原址 https://github.com/roytseng-tw/Detectron.pytorch/blob/master/README.md

原文地址:https://www.cnblogs.com/cuiyubo/p/9000465.html

时间: 2024-10-30 10:50:33

Pytorch实现的语义分割器的相关文章

深度学习高分辨率遥感影像语义分割【转】

原文link: https://www.cnblogs.com/wzp-749195/p/11114624.html 深度学习大家都知道,在计算机视觉领域取得了很大的成功,在遥感影像自动解译方面,同样带来了快速的发展,我在遥感影像自动解译领域,也做了一些微薄的工作,发表几篇论文,我一直关注遥感影像自动解译领域, 在北京出差的这段时间,终于可以沉下心来,好好研究下深度学习,目前在语义分割领域,也有部分心得,在此同大家分享,权当是互相学习.本篇博文就是论述现有的state-of-art方法在遥感影像

MaskLab-实例分割(使用语义分割和方向特征精细化目标检测)

MaskLab: Instance Segmentation by Refining Object Detection with Semantic and Direction Features 这是一篇2018年cvpr关于实例分割的网络模型,模型主要有三个输出:边界框.语义分割.方向预测. 整体框架 整个模型使用ResNet-101作为特征提取器,构建于Faster-RCNN之上.使用Faster-RCNN检测到目标框之后,使用相应的类别选取对应的语义通道并裁剪,接着结合方向预测再通过1x1的

语义分割之车道线检测(tensorflow版)

      由于项目需要,参考了多篇相关车道线检测论文与源码,设计了一套Tensorflow版车道线检测功能. 二.基本结构:       该模型主要由以下部分组成: 1.数据源:包括所有原始数据,分组后的数据: 2.数据预处理:包括数据的准备,数据的导入,数据的提取,数据的分组(训练与测试): 3.配置文件:包括各种参数与超参数,如:训练周期,训练步长,批量数据,学习率,卷积核大小,全连接大小,训练模型存放路径(checkpoint),摘要存放路径(summary)等: 4.基础网络:包括基本

语义分割之车道线检测Lanenet(tensorflow版)

Lanenet 一个端到端的网络,包含Lanenet+HNet两个网络模型,其中,Lanenet完成对车道线的实例分割,HNet是一个小网络结构,负责预测变换矩阵H,使用转换矩阵H对同属一条车道线的所有像素点进行重新建模 将语义分割和对像素进行向量表示结合起来的多任务模型,最近利用聚类完成对车道线的实例分割. 将实例分割任务拆解成语义分割和聚类,分割分支负责对输入图像进行语义分割(对像素进行二分类,判断像素属于车道线还是背景),嵌入分支对像素进行嵌入式表示,可将分割后得的车道线分离成不同的车道实

CVPR2020论文解读:手绘草图卷积网络语义分割

Sketch GCN: Semantic Sketch Segmentation with Graph Convolutional Networks 论文链接:https://arxiv.org/pdf/2003.00678.pdf 摘要 介绍了一种用于手绘草图语义分割和标注的图形卷积神经网络SketchGCN.我们将输入草图视为二维点集,并将笔划结构信息编码为图形节点/边缘表示.为了预测每个点的标签,我们的SketchGCN使用图卷积和全局分支网络结构来提取笔划内和笔划间的特征.SketchG

文件分割器,一个读取流,相应多个输出流,并且生成的碎片文件都有有序的编号

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; public class FileSpilte { /** * @param args * @throws IOException */

JAVA学习课第五 — IO流程(九)文件分割器合成器

文件分割器 private static final int SIZE = 1024 *1024; public static void splitFile(File file) throws IOException{ //用读取流关联文件(不确定文件格式) FileInputStream fis = new FileInputStream(file);//源是一个 byte[] by = new byte[SIZE];//定义1M的缓冲区 FileOutputStream fos = null

深度卷积网络CNN与图像语义分割

转载请注明出处: http://xiahouzuoxin.github.io/notes/ 级别1:DL快速上手 级别2:从Caffe着手实践 级别3:读paper,网络Train起来 级别3:Demo跑起来 读一些源码玩玩 熟悉Caffe接口,写Demo这是硬功夫 分析各层Layer输出特征 级别4:何不自己搭个CNN玩玩 级别5:加速吧,GPU编程 关于语义分割的一些其它工作 说好的要笔耕不缀,这开始一边实习一边找工作,还摊上了自己的一点私事困扰,这几个月的东西都没来得及总结一下.这就来记录

caffe初步实践---------使用训练好的模型完成语义分割任务

caffe刚刚安装配置结束,乘热打铁! (一)环境准备 前面我有两篇文章写到caffe的搭建,第一篇cpu only ,第二篇是在服务器上搭建的,其中第二篇因为硬件环境更佳我们的步骤稍显复杂.其实,第二篇也仅仅是caffe的初步搭建完成,还没有编译python接口,那么下面我们一起搞定吧! 首先请读者再回过头去看我的<Ubuntu16.04安装配置Caffe>( http://www.cnblogs.com/xuanxufeng/p/6150593.html  ) 在这篇博文的结尾,我们再增加