25- 基于MASK-RCNN框架的气球检测项目 (TensorFlow系列) (项目二十五)

项目要点

  • 通过语义分割识别气球


一 基于MASK-RCNN框架的气球检测项目

  • 项目介绍
  • 项目流程
  • 下载数据集
  • 下载MASK-RCNN框架源码
  • MASK-RCNN模型介绍
  • FPN层特征提取原理解读
  • FPN网络架构实现解读
  • 生成框比例设置
  • 基于不同尺度特征图生成所有框
  • RPN层的作用与实现解读
  • 候选框过滤方法
  • Proposal层实现方法
  • DetectionTarget层的作用
  • 正负样本选择与标签定义
  • RoiPooling层的作用与目的
  • RorAlign操作的效果
  • 整体框架回顾
  • Lableme工具安装
  • 使用Labelme对数据与标签进行标注
  • MASK-RCNN源码修改方法
  • 基于标注数据训练所需任务
  • 测试与展示模块

数据处理部分代码

import os
import json

import skimage
import skimage.draw
import numpy as np

from mrcnn.config import Config
from mrcnn import utils
from mrcnn import visualize

# 定义气球的配置文件
class BalloonConfig(Config):
    NAME = 'balloon'
    STEPS_PER_EPOCH = 100
    NUM_CLASSES = 1 + 1  # bg + balloon
    DETECTION_MIN_CONFIDENCE = 0.9
    print('aa')

config = BalloonConfig()
# config.display()

class BalloonDataset(utils.Dataset):
    def load_balloon(self, dataset_dir, subset):
        self.add_class('balloon', 1, 'balloon')

        assert subset in ['train', 'val']
        dataset_dir = os.path.join(dataset_dir, subset)

        # 从 via 产生的json 标注文件中提取标注信息
        with open(os.path.join(dataset_dir, 'via_region_data.json')) as fp:
            annotations = json.load(fp)   # 标记信息

        # 去其中的value值
        annotations = list(annotations.values())
        annotations = [a for a in annotations if a['regions']]

        for a in annotations:
            polygons = [r['shape_attributes'] for r in a['regions'].values()]
            image_path = os.path.join(dataset_dir, a['filename'])
            # 打开图片
            img = skimage.io.imread(image_path)
            height, width = img.shape[:2]

            self.add_image('balloon', image_id=a['filename'],
                           path=image_path,
                           width=width, height=height,
                           polygons=polygons)

    def load_mask(self, image_id):
        # 根据image_id 查到image的信息
        image_info = self.image_info[image_id]
        if image_info['source'] != 'balloon':
            return super().load_mask(image_id)

        # 产生和原图同样大小的背景图
        mask = np.zeros([image_info['height'], image_info['width'], len(image_info['polygons'])],
                 dtype=np.uint8)

        for i, p in enumerate(image_info['polygons']):
            rr, cc = skimage.draw.polygon(p['all_points_y'], p['all_point_x'])
            mask[rr, cc, i] = 1
        return mask, np.ones([mask.shape[-1]], dtype=np.int32)

    def image_reference(self, image_id):

        info = self.image_info[image_id]
        if info['source'] == 'balloon':
            return info['path']
        else:
            super().image_reference(image_id)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值