• 您当前的位置:首页 > 科技新闻 > 互联网新闻 > Github代码实践:Pytorch实现的语义分割器!
  • Github代码实践:Pytorch实现的语义分割器!

    时间:2018-05-04  来源:其他  作者:PConline

    这个代码是按照Detectron的安装架构来实现的,仅支持部分功能性。

    Github代码实践:Pytorch实现的语义分割器

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

    Github代码实践:Pytorch实现的语义分割器

    从Detectron输出的相关示例

    Github代码实践:Pytorch实现的语义分割器

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

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

    1. 根据草图训练模型;

    2. 通过使用Detectron中得到预训练权重(*.pk)来进行推断;

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

    这个工具有以下特征:

    • 这个完全是Pytorch代码,当然了,也有一些CUDA代码。

    • 它支持多图像的批处理加工训练。

    • 它支持多GPUs训练。

    • 它支持三种合并方法,但是需要注意的是只有roialign能被改进去匹配Caffe2的安装。所以,尽管去用就好了。

    • 它可以高效利用内存。对于数据的批处理,这儿有两种可选择的技术去减少显存使用量:1)根据类别分组:同批次的一组图像是有相似的类别比率2)根据类别剪裁:剪裁图像太长了。类别分组是在Detectron运行,所以用来默认,类别剪裁是来自jwyang/faster-rcnn.pytorch,所以它不能用来默认。

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

    支持的网络模型

    • 主要架构:

    ResNetseries:ResNet50_conv4_body,ResNet50_conv5_body,ResNet101_Conv4_Body,ResNet101_Conv5_Body,ResNet152_Conv5_BodyFPN: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也被运行了但是还没有测试。

    • Boxhead:ResNet_roi_conv5_head,roi_2mlp_head

    • Maskhead:mask_rcnn_fcn_head_v0upshare,mask_rcnn_fcn_head_v0up,mask_rcnn_fcn_head_v1up4convs,mask_rcnn_fcn_head_v1up

    • Keypointshead: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]。

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

    • SOLVER.WARM_UP_ITERS,SOLVER.WARM_UP_FACTOR,SOLVER.WARM_UP_METHOD:在纸上做预热训练Accurate,LargeMinibatchSGD:在一小时内训练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/bgclass类的输出预测,在jwyang'simplementation,它把输出路径数字确定为512而且使用softmax为激活函数。

    我的nn.DataParallel

    TBA

    开始

    克隆这个仓库:

    gitclonehttps://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。

    • 一个NVIDAIGPU和CUDA8.0或者更高。一些操作只有gpu安装。

    • 注意:不同版本的Pytorch安装包有不同的显存使用量。

    编写

    编写CUDA代码:

    cdlib#pleasechangetothisdirectory

    shmake.sh

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

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

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

    数据准备

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

    cd{repo_root}

    mkdirdata

    • 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

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

    ln-spath/to/cocodata/coco

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

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

    预训练模型

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

    • ResNet50,ResNet101,ResNet152

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

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

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

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

    pythontools/download_imagenet_weights.py

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

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

    训练

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

    pythontools/train_net.py--datasetcoco2017--cfgconfigs/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上展示损失函数的对数值。

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

    pythontools/train_net.py--datasetcoco2017--cfgconfigs/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网络

    pythontools/train_net.py--datasetkeypoints_coco2017...

    • Detectron预训练权重的调整

    pythontrain_net.py--datasetcoco2017--cfgcfgs/e2e_mask_rcnn_R-50-C4.yml--load_detectron{path/to/detectron/weight}--bs{batch_size}

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

    推断结果

    pythontools/infer_simple.py--datasetcoco--cfgcfgs/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

    训练命令行:pythontools/train_net.py--datasetkeypoints_coco2017--cfgconfigs/e2e_keypoint_rcnn_R-50-FPN.yaml--bs8

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

    数据集:keypoints_coco_2017_val

    任务:框定盒

    Github代码实践:Pytorch实现的语义分割器

    任务:关键点

    表格中的值为Detectrone2e_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代码实践:Pytorch实现的语义分割器Github代码实践:Pytorch实现的语义分割器

    Github代码实践:Pytorch实现的语义分割器

    Github代码实践:Pytorch实现的语义分割器

    关键词:
    最近更新
    推荐资讯