提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
作为初学者,个人认为在理解了算法之后,想要跑通这个算法最重要的一步就是处理数据,我们需要理解输入的特征和对应的标签是什么,这样才能理解模型是如何去计算损失,进行反向传播的。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: