Mask R-CNN 训练自己的数据集(balloon过程+报错解释)

因项目需要,识别带有多边形标注的图像,舍弃了速度快精度高的yolov3,使用Mask R-CNN网络。作为一名深度学习小白,在摸爬滚打中查找资料修改代码以及不断地调整训练集,途中踩了不少坑,终于达到预期的效果。

一、配置说明

以下是本人跑Mask R-CNN的配置说明:

  • Python 3.52
  • tensorflow 1.12.0
  • keras 2.2.4
  • Jupyter Notebook
  • 一块gpu

二、标注训练集、验证集

使用的是VIA,标记了三百张,训练集和验证集的比例是8:2。对于VIA,使用感受如下:
优点是:网络版、不用下载,标注比较快,可直接生成1个json文件
缺点是:网速不好就标记不上,电脑死机就全没了,有时候崩得特别厉害标注不上

VIA网站:http://www.robots.ox.ac.uk/~vgg/software/via/via.html
VIA的使用教程:https://blog.csdn.net/heiheiya/article/details/81530952

新建datasets文件夹,在里面再新建两个文件夹“tarin”,和“val”,将训练集的图片及对应json放入train文件夹,验证集的图片及对应json放入val文件夹。
这个datasets文件夹放在根目录下(和sample,mrcnn文件夹同目录)。

三、代码修改

下载mask R-CNN的代码包:https://github.com/matterport/Mask_RCNN
本文使用的是balloon文件夹下的。之后训练使用的是balloon.py的,且主要也是在balloon.py里修改。网上有很多对于训练多类的代码,不过都有一些问题,主要是从json取信息出错,不知道是版本问题还是VIA输出问题。
主要修改以下三段:
首先是Config的修改,可以不用在config.py中修改,直接在balloon.py中修改就行。不过如果是为了对比另外几个训练效果的话,还是建议在config.py中修改如下数值。

class BalloonConfig(Config):
    """
    从基本Config中修改一些数值
    """
    # 命名配置
    NAME = "balloon"
 
    # 如果显卡显存不大,建议填1
    IMAGES_PER_GPU = 1
 
    # 类别数量(包括背景),因本项目又6类
    NUM_CLASSES = 1 + 6  # 背景+类别数
    
    # 每个epoch训练的步数
    # 在每个epoch的最后也会更新验证的状态,这会花费一些时间
    # 本项目设置的是1000,建议如果显存不够的朋友们设置小一点
    # 但不建议太小,不要低于验证的步数
    STEPS_PER_EPOCH = 1000

    #在每个训练epoch的结尾进行验证的步数。
    #用的是验证集里的图片和数据
    VALIDATION_STEPS = 50

    #图片最大像素及最小像素,不要求图片固定大小
    IMAGE_MIN_DIM = 448
    IMAGE_MAX_DIM = 640
 
    # 忽略置信度小于0.9的检测
    DETECTION_MIN_CONFIDENCE = 0.9

在Dataset中增加类别,和改变对json的识别。如果是用矩形标注的图像也可以使用,但是需要修改代码。

class BalloonDataset(utils.Dataset):
    def load_balloon(self, dataset_dir, subset):    
        """Load a subset of the Balloon dataset.    
        dataset_dir: Root directory of the dataset.    
        subset: Subset to load: train or val    """    
        # 添加你需要增加的类别,前面双引号里的是配置命名,然后是编号,最后是类名
        self.add_class("balloon", 1, "xxxx")    
        self.add_class("balloon", 2, "xxxx")
        self.add_class("balloon", 3, "xxxx")
        self.add_class("balloon", 4, "xxxx")
        self.add_class("balloon", 5, "xxxx")
        self.add_class("balloon", 6, "xxxx")
      
        assert subset in ["train", "val"]
        dataset_dir = os.path.join(dataset_dir, subset
  • 10
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 59
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 59
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值