项目要点
一 基于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)