Pytorch版Mask-RCNN图像分割实战(自定义数据集)

这篇具有很好参考价值的文章主要介绍了Pytorch版Mask-RCNN图像分割实战(自定义数据集)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Mask-RCNN概述

训练自己数据步骤

工具Labelme

标注数据

源码需要改动地方

训练之后的测试结果

Mask-RCNN概述

Mask R-CNN是一种广泛应用于目标检测和图像分割任务的深度学习模型,它是由Faster R-CNN(一种快速目标检测模型)和Mask R-CNN(一种实例分割模型)组成的。Mask R-CNN将Faster R-CNN中的RPN和RoI Pooling层替换成了RPN和RoI Align层,以实现像素级的图像分割,能够同时检测出多个对象,并对每个对象进行像素级的分割。

Mask R-CNN的主要思路是在Faster R-CNN的基础上增加一个分支网络,即Mask分支,该分支网络可以对检测出来的物体进行像素级的分割操作,得到每个物体实例的分割掩码。与 Faster R-CNN 相似, Mask R-CNN同样使用RPN产生候选框,在RoIPooling层和ROIAlign层中对候选框中的特征进行提取。在RoIAlign层中,Mask R-CNN通过双线性插值从特征图中提取出精确的特征,然后送入Mask分支中进行像素级别的分割,最终得到每个实例的精确掩码。

pytorch版mask rcnn,图像算法,深度学习,深度学习,机器学习,人工智能

Facebook AI Research 开源了 Faster R-CNN 和 Mask R-CNN 的 PyTorch 1.0 实现基准:MaskRCNN-Benchmark。相比 Detectron 和 mmdetection,MaskRCNN-Benchmark 的性能相当,并拥有更快的训练速度和更低的 GPU 内存占用

优势如下:

  • PyTorch 1.0:相当或者超越 Detectron 准确率的 RPN、Faster R-CNN、Mask R-CNN 实现;
  • 非常快:训练速度是 Detectron 的两倍,是 mmdection 的 1.3 倍;
  • 节省内存:在训练过程中使用的 GPU 内存比 mmdetection 少大约 500MB;
  • 使用多 GPU 训练和推理;
  • 批量化推理:可以在每 GPU 每批量上使用多张图像进行推理;
  • 支持 CPU 推理:可以在推理时间内于 CPU 上运行。
  • 提供几乎所有参考 Mask R-CNN 和 Faster R-CNN 配置的预训练模型,具有 1x 的 schedule。

基于Mask RCNN开源项目源码地址:https://github.com/facebookresearch/maskrcnn-benchmark

训练自己数据步骤

  • 安装Labelme
  • 标注数据
  • 源码需要改动地方
  • 训练之后测试结果

工具Labelme

1、安装labelme工具

pip install labelme
pip install pyqt5
pip install pillow==4.0.0

pytorch版mask rcnn,图像算法,深度学习,深度学习,机器学习,人工智能

标注数据

 1、使用labelme标注得到.json文件,将.json文件和原始图片放在一个文件夹里;

2、批量量转换:将labelme标注数据转换成coco数据集;

  • 运行labelmetococo.py文件;
  • 在我当前目录的dataset文件夹下,生成coco文件夹;
  • coco文件夹下有annotations文件夹和images文件夹;
  • annotations文件夹存放2个json文件;
  • images文件夹存放train (存放:划分的用于训练的图像数据)和val (存放:划分的用于验证的图像数据) 两个文件夹;

下面是labelmetococo.py文件代码:

import os
import json
import numpy as np
import glob
import shutil
import cv2
from sklearn.model_selection import train_test_split

np.random.seed(41)

# 0为背景
classname_to_id = {
    "class1": 1

}
# 注意这里
# 需要从1开始把对应的Label名字写入:这里根据自己的Lable名字修改

class Lableme2CoCo:

    def __init__(self):
        self.images = []
        self.annotations = []
        self.categories = []
        self.img_id = 0
        self.ann_id = 0

    def save_coco_json(self, instance, save_path):
        json.dump(instance, open(save_path, 'w', encoding='utf-8'), ensure_ascii=False, indent=1)  # indent=2 更加美观显示

    # 由json文件构建COCO
    def to_coco(self, json_path_list):
        self._init_categories()
        for json_path in json_path_list:
            obj = self.read_jsonfile(json_path)
            self.images.append(self._image(obj, json_path))
            shapes = obj['shapes']
            for shape in shapes:
                annotation = self._annotation(shape)
                self.annotations.append(annotation)
                self.ann_id += 1
            self.img_id += 1
        instance = {}
        instance['info'] = 'spytensor created'
        instance['license'] = ['license']
        instance['images'] = self.images
        instance['annotations'] = self.annotations
        instance['categories'] = self.categories
        return instance

    # 构建类别
    def _init_categories(self):
        for k, v in classname_to_id.items():
            category = {}
            category['id'] = v
            category['name'] = k
            self.categories.append(category)

    # 构建COCO的image字段
    def _image(self, obj, path):
        image = {}
        from labelme import utils
        img_x = utils.img_b64_to_arr(obj['imageData'])
        h, w = img_x.shape[:-1]
        image['height'] = h
        image['width'] = w
        image['id'] = self.img_id
        image['file_name'] = os.path.basename(path).replace(".json", ".jpg")
        return image

    # 构建COCO的annotation字段
    def _annotation(self, shape):
        # print('shape', shape)
        label = shape['label']
        points = shape['points']
        annotation = {}
        annotation['id'] = self.ann_id
        annotation['image_id'] = self.img_id
        annotation['category_id'] = int(classname_to_id[label])
        annotation['segmentation'] = [np.asarray(points).flatten().tolist()]
        annotation['bbox'] = self._get_box(points)
        annotation['iscrowd'] = 0
        annotation['area'] = 1.0
        return annotation

    # 读取json文件,返回一个json对象
    def read_jsonfile(self, path):
        with open(path, "r", encoding='utf-8') as f:
            return json.load(f)

    # COCO的格式: [x1,y1,w,h] 对应COCO的bbox格式
    def _get_box(self, points):
        min_x = min_y = np.inf
        max_x = max_y = 0
        for x, y in points:
            min_x = min(min_x, x)
            min_y = min(min_y, y)
            max_x = max(max_x, x)
            max_y = max(max_y, y)
        return [min_x, min_y, max_x - min_x, max_y - min_y]


if __name__ == '__main__':

    # 需要把labelme_path修改为自己放images和json文件的路径
    labelme_path = "D:\\maskrcnn-benchmark-main\\dataset\\gps\\"
    # saved_coco_path = "../../../xianjin_data-3/"
    saved_coco_path = "D:\\maskrcnn-benchmark-main\\dataset\\"
    # saved_coco_path = "./"
    # 要把saved_coco_path修改为自己放生成COCO的路径,这里会在我当前COCO的文件夹下建立生成coco文件夹。
    print('reading...')
    # 创建文件
    if not os.path.exists("%scoco/annotations/" % saved_coco_path):
        os.makedirs("%scoco/annotations/" % saved_coco_path)
    if not os.path.exists("%scoco/images/train2017/" % saved_coco_path):
        os.makedirs("%scoco/images/train2017" % saved_coco_path)
    if not os.path.exists("%scoco/images/val2017/" % saved_coco_path):
        os.makedirs("%scoco/images/val2017" % saved_coco_path)
    # 获取images目录下所有的joson文件列表
    print(labelme_path + "\*.json")
    json_list_path = glob.glob(labelme_path + "\*.json")
    # json_list_path = glob.glob(labelme_path + "\*.png")
    print('json_list_path: ', len(json_list_path))
    # 数据划分,这里没有区分val2017和tran2017目录,所有图片都放在images目录下
    train_path, val_path = train_test_split(json_list_path, test_size=0.1, train_size=0.9)
    # 将训练集和验证集的比例是9:1,可以根据自己想要的比例修改。
    print("train_n:", len(train_path), 'val_n:', len(val_path))

    # 把训练集转化为COCO的json格式
    l2c_train = Lableme2CoCo()
    train_instance = l2c_train.to_coco(train_path)
    l2c_train.save_coco_json(train_instance, '%scoco/annotations/instances_train2017.json' % saved_coco_path)
    for file in train_path:
        # 存入png格式图片,原始图片有两种格式.png,.jpg
        # print("这里测试一下file:"+file)
        img_name = file.replace('json', 'png')
        # print("这里测试一下img_name:" + img_name)
        temp_img = cv2.imread(img_name)
        # 图像为空说明为.jpg格式
        if  temp_img is None:
            img_name_jpg = img_name.replace('png', 'jpg')
            temp_img = cv2.imread(img_name_jpg)

        filenames = img_name.split("\\")[-1]
        cv2.imwrite("D:\\maskrcnn-benchmark-main\\dataset\\coco\\images\\train2017/{}".format(filenames), temp_img)
        # print(temp_img) #测试图像读取是否正确


    for file in val_path:
        # shutil.copy(file.replace("json", "jpg"), "%scoco/images/val2017/" % saved_coco_path)

        img_name = file.replace('json', 'png')
        temp_img = cv2.imread(img_name)
        if temp_img is None:
            img_name_jpg = img_name.replace('png', 'jpg')
            temp_img = cv2.imread(img_name_jpg)
        filenames = img_name.split("\\")[-1]
        cv2.imwrite("D:\\maskrcnn-benchmark-main\\dataset\\coco\\images\\val2017/{}".format(filenames), temp_img)
        

    # 把验证集转化为COCO的json格式
    l2c_val = Lableme2CoCo()
    val_instance = l2c_val.to_coco(val_path)
    l2c_val.save_coco_json(val_instance, '%scoco/annotations/instances_val2017.json' % saved_coco_path)

执行程序,生成的文件夹

pytorch版mask rcnn,图像算法,深度学习,深度学习,机器学习,人工智能pytorch版mask rcnn,图像算法,深度学习,深度学习,机器学习,人工智能pytorch版mask rcnn,图像算法,深度学习,深度学习,机器学习,人工智能

源码需要改动地方:

假设你此时位于maskrcnn-benchmark/目录下,datasets的组织结构如下

datasets
-> coco
  -> annotations
    -> instances_train2014.json //训练标签
    -> instances_test2014.json  //验证标签
  -> train2014 //训练图片
  -> val2014  //验证图

为了方便建议仿照上面这样的coco标准命名,但上面的所有名字都不是一定要求这样写的,自己可以合理命名,只要程序中的各个与数据路径有关的地方一一对应上即可。

  1. maskrcnn-benchmark/configse/2e_mask_rcnn_R_50_FPN_1x.yaml为例下面蓝色圈出来的地方必须修改:
  2. 一个是类别,如果这里面没有类别,与default.py中的一致,那么程序会自动在defaults.py中寻找。
  3. 特别还有一个是DATASETS,这个是用来指定本次训练所使用的数据集,为了方便我这里没有修改,就借用了coco_2014_train的名字,名字可以随意起,但是在maskrcnn-benchmark/maskrcnn_benchmark/config/paths_catalog.py中需要有对应的数据集的路径描述,且该路径要与datasets/coco/里面的文件对应起来
  4. BASE_LR,迭代次数,保存间隔根据自己模型需要而定
  5. 修改maskrcnn_benchmark/utils下的checkpoint,需要注释65- 68行(self.optimizer.load_state..   self.scheduler.load_...)

pytorch版mask rcnn,图像算法,深度学习,深度学习,机器学习,人工智能

将myconfig下的paths_catalogs文件中的数据集路径改为自己的;

pytorch版mask rcnn,图像算法,深度学习,深度学习,机器学习,人工智能

maskrcnn-benchmark/maskrcnn_benchmark/config/defaults.py 这是模型的一个总的默认配置文件,需要作出一定修改

_C.INPUT = CN()
# Size of the smallest side of the image during training
_C.INPUT.MIN_SIZE_TRAIN = (400,)  # (800,)
# Maximum size of the side of the image during training
_C.INPUT.MAX_SIZE_TRAIN = 667
# Size of the smallest side of the image during testing
_C.INPUT.MIN_SIZE_TEST = 400
# Maximum size of the side of the image during testing
_C.INPUT.MAX_SIZE_TEST = 667
#下面的两处修改也需要特别注意!!!必须和自己的类别相对应,如果没有分类,那么就为2
_C.MODEL.ROI_BOX_HEAD.NUM_CLASSES = 2 #类别数量加1
_C.MODEL.RETINANET.NUM_CLASSES = 2 #类别数量加1
  • pytorch版mask rcnn,图像算法,深度学习,深度学习,机器学习,人工智能

pytorch版mask rcnn,图像算法,深度学习,深度学习,机器学习,人工智能文章来源地址https://www.toymoban.com/news/detail-692560.html

到了这里,关于Pytorch版Mask-RCNN图像分割实战(自定义数据集)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习目标检测项目实战(六)-基于Faster rcnn pytorch的遥感图像检测

    代码:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 使用RSOD遥感数据集,VOC的数据格式如下: RSOD是一个开放的目标检测数据集,用于遥感图像中的目标检测。数据集包含飞机,油箱,运动场和立交桥,以PASCAL VOC数据集的格式进行标注。 数据集包括4个文件夹,每个文件夹

    2024年02月06日
    浏览(53)
  • Mask RCNN训练自己的数据集

    Mask RCNN作为实例分割的经典算法,对于图像分割的初学者来说,还是很有必要了解下的。 原mask rcnn的Tensorflow版本是1.13,这里提供tf2.5的mask rcnn的github源码地址:https://github.com/zouyuelin/MASK_RCNN_2.5.0 目录 一、制作数据集 1.下载安装labelme  2.标注数据集 3.labelme数据集转化 二、模

    2024年02月15日
    浏览(30)
  • 【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割7(数据预处理)

    在上一节:【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理) 中,我们已经得到了与 mhd 图像同 seriesUID 名称的 mask nrrd 数据文件了,可以说是一一对应了。 并且, mask 的文件,还根据结节被多少人同时标注,区分成了4个文件夹,分别是标注了一、二、三、四次,

    2024年02月07日
    浏览(37)
  • 基于Faster rcnn pytorch的遥感图像检测

    代码:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 使用RSOD遥感数据集,VOC的数据格式如下: RSOD是一个开放的目标检测数据集,用于遥感图像中的目标检测。数据集包含飞机,油箱,运动场和立交桥,以PASCAL VOC数据集的格式进行标注。 数据集包括4个文件夹,每个文件夹

    2024年02月06日
    浏览(31)
  • 【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2(基础数据流篇)

    构建 pytorch 训练模型读取的数据,是有模版可以参考的,是有套路的,这点相信使用过的人都知道。我也会给出一个套路的模版,方便学习和查询。 同时,也可以先去参考学习之前的一篇较为简单的 3D 分类任务的数据构建方法,链接在这里:【3D图像分类】基于Pytorch的3D立体

    2024年02月05日
    浏览(41)
  • Mask2Former来了!用于通用图像分割的 Masked-attention Mask Transformer

    原理https://blog.csdn.net/bikahuli/article/details/121991697 源码解析 论文地址:http://arxiv.org/abs/2112.01527 项目地址:https://bowenc0221.github.io/mask2former Mask2Former的整体架构由三个组件组成: 主干特征提取器:主干特征提取器从输入图像中提取低分辨率特征。在Mask2Former中,主干特征提取器通

    2024年02月02日
    浏览(35)
  • Mask RCNN详解

            Mask R-CNN是对Faster R-CNN的直观扩展,网络的主干有RPN转换为主干网络为ResNet的 特征金字塔网络(FPN),同时 添加了一个分支用于预测每个感兴趣区域(RoI)上的分割掩模,与现有的用于分类和边界盒回归的分支并行(图1)。 掩模分支是一个应用于每个RoI的小FCN,以像素

    2023年04月11日
    浏览(24)
  • OpenCV中使用Mask R-CNN实现图像分割的原理与技术实现方案

    本文详细介绍了在OpenCV中利用Mask R-CNN实现图像分割的原理和技术实现方案。Mask R-CNN是一种先进的深度学习模型,通过结合区域提议网络(Region Proposal Network)和全卷积网络(Fully Convolutional Network),实现了对图像中物体的精确分割。本文首先阐述了Mask R-CNN的原理,然后详细

    2024年02月03日
    浏览(33)
  • 【3D 图像分割】基于 Pytorch 的 3D 图像分割6(数据预处理之LIDC-IDRI 标签 xml 标签转储及标记次数统计 )

    由于之前哔站作者整理的 LUNA16 数据处理方式过于的繁琐,于是,本文就对 LUNA16 数据做一个新的整理,最终得到的数据和形式是差不多的。但是,主要不同的是代码逻辑比较的简单,便于理解。 对于 LUNA16 数据集的学习,可以去参考这里:【3D 图像分类】基于 Pytorch 的 3D 立

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包