Mask RCNN分割balloon案列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

                                                                                                                                    

一、配置介绍

二、数据处理

1.数据介绍

2.读取图片数据集json文件

3.加载mask的函数封装

4.完整的BalloonDataset类

5.画出数据集对应的mask以及计算Bbox

三、config配置 

四、模型训练

五、模型预测

六、分割效果展示

总结                                                                                                                       

作为初学者,个人认为在理解了算法之后,想要跑通这个算法最重要的一步就是处理数据,我们需要理解输入的特征和对应的标签是什么,这样才能理解模型是如何去计算损失,进行反向传播的。GitHub开源了非常多的深度学习的算法,我们需要做的就是去处理我们的数据,使数据变为符合这些开源算法的格式,然后就可以将我们的数据送入这个算法中去进行训练了,当然这里我们拥有什么计算资源也非常重要。到了后期,有了一些积累之后,就可以去慢慢阅读复现这个算法源码,这个过程感觉还是非常痛苦的。下面主要是介绍Mask RCNN分割balloon案列,显示了一些主要的代码。

一、配置介绍

计算资源:8核32G CPU 资源

环境配置:Python 3.7 TensorFlow 2.6 PyTorch 1.8

使用算法:github高星实现版本的Maskrcnn

预训练权重:在ImageNet上进行训练的ResNet-50

二、数据处理

数据处理是深度学习流程中至关重要的一环,在训练一个模型的时候,最令人烦躁的就是数据处理的过程,我们需要面对各种格式的数据,需要做的就是将这个数据处理成符合输入算法的格式,形成一个数据流的形式,这个过程需要耗费非常多的时间。这个案列中,我们处理的数据储存在了JSON文件。

1.数据介绍

数据集分为train和val两个文件夹,里面各自对应原始的png图片,所有图片对应的id、分割信息等储存在了json文件中,可以通过这个json文件去进行都去,下图是训练集中的形式,验证集同理。

json数据形式如下图所示,对应储存了图片的一些信息,其中regions区域代表对于原图片的分割区域信息。比如第二张图片的标记中的regions中有7个编号,代表的是第二张图片中有七个标记分割的物体。如第一个标注0中,all_points_x和all_points_y即代表了第一个分割物体的像素点的坐标,这些坐标组合起来,就是第一个分割物体的标注的分割区域了!

2.读取图片数据集json文件

json文件中提取原始图片的路径和对应的分割的信息

下面的这里封装了一个从json文件中提取对应数据的类,在开源的maskrcnn中,提供了一个utils文件,我们可以直接class BalloonDataset(utils.Dataset)。这样可以直接去继承其中的Dataset,里面封装了一些处理数据的函数,下面的这里为了方便去进行阅读,使用原始版本的。

import os
import json
import sys
import numpy as np
from mrcnn import utils, visualize
from mrcnn.config import Config
import skimage


class BalloonDataset():
    def __init__(self, class_map=None):
        self.image_info = []
        self.class_info = [{"source": "", "id": 0, "name": "BG"}]

    def add_class(self, source, class_id, class_name):
        assert "." not in source, "Source name cannot contain a dot"
        for info in self.class_info:
            if info['source'] == source and info["id"] == class_id:
                return
        self.class_info.append({
            "source": source,
            "id": class_id,
            "name": class_name,
        })

    def add_image(self, source, image_id, path, **kwargs):
        image_info = {
            "id": image_id,
            "source": source,
            "path": path,
        }
        image_info.update(kwargs)
        self.image_info.append(image_info)

    def load_balloon(self, dataset_dir, subset):
        self.add_class("balloon", 1, "balloon")
        assert subset in ["train", "val"], "subset should be either 'train' or 'val'"
        dataset_dir = os.path.join(dataset_dir, subset)
        annotations = json.load(open(os.path.join(dataset_dir, "via_region_data.json")))
        annotations = [a for a in annotations.values() if a['regions']]
        
        for a in annotations:
            if isinstance(a['regions'], dict):
                polygons = [r['shape_attributes'] for r in a['regions'].values()]
            else:
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值