因项目需要,识别带有多边形标注的图像,舍弃了速度快精度高的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