概述

Mask-RCNN,是一个处于像素级别的目标检测手段.目标检测的发展主要历程大概是:RCNN,Fast-RCNN,Fster-RCNN,Darknet,YOLO,YOLOv2,YOLO3(参考目标检测:keras-yolo3之制作VOC数据集训练指南),Mask-RCNN.本文参考的论文来源于https://arxiv.org/abs/1703.06870.

下面,开始制作用于Mask训练的数据集。

首先展示一下成果,由于个人设备有限,cpu仅迭代5次的结果。

使用labelme进行图片标注

注意:

  **标注之前将图片的名字通过linux或者python脚本改名,改为有序即可,我的命名格式为升序,下面为linux脚本。

i=; for x in *; do mv $x $i.png; let i=i+; done

  **将所有图片的尺寸改为600*800.(一般设置为2的整数次幂,否则,后序训练时会报错).脚本自取https://github.com/hyhouyong/Mask-RCNN/blob/master/train_data/resize.py

pip install labelme
labelme

1.新建文件夹train_data,并创建子文件夹json,将标注后的json格式的文件放入该文件夹中

2.当你安装lableme的时候,默认安装到了Anaconda目录下/envs/名字/Scripts/下,使用labelme_json_to_dataset.exe将json文件转化为5个文件

  转化方法,切换到labelme安装目录下,执行:

labelme_json_to_dataset.exe [文件名]

注意:文件名为绝对路径   . eg:(chineseocr) D:\anaconda\envs\chineseocr\Scripts>labelme_json_to_dataset.exe F:\samples\shapes\train_data\json\1.json

  ***这样只能一次转化一个json文件,故开始批量转。

    切换到D:\anaconda\envs\py3.6\Lib\site-packages\labelme\cli下,修改json_to_dataset.py,然后切换到Scripts,执行命令:

labelme_json_to_dataset.exe [存放json文件夹的绝对路径]

  ***生成的json文件夹会在当前目录,将文件夹拷贝到train_data下的labelme_json文件夹中

import argparse
import json
import os
import os.path as osp
import warnings import PIL.Image
import yaml from labelme import utils
import base64 def main():
warnings.warn("This script is aimed to demonstrate how to convert the\n"
"JSON file to a single image dataset, and not to handle\n"
"multiple JSON files to generate a real-use dataset.")
parser = argparse.ArgumentParser()
parser.add_argument('json_file')
parser.add_argument('-o', '--out', default=None)
args = parser.parse_args() json_file = args.json_file
if args.out is None:
out_dir = osp.basename(json_file).replace('.', '_')
out_dir = osp.join(osp.dirname(json_file), out_dir)
else:
out_dir = args.out
if not osp.exists(out_dir):
os.mkdir(out_dir) count = os.listdir(json_file)
for i in range(0, len(count)):
path = os.path.join(json_file, count[i])
if os.path.isfile(path):
data = json.load(open(path)) if data['imageData']:
imageData = data['imageData']
else:
imagePath = os.path.join(os.path.dirname(path), data['imagePath'])
with open(imagePath, 'rb') as f:
imageData = f.read()
imageData = base64.b64encode(imageData).decode('utf-8')
img = utils.img_b64_to_arr(imageData)
label_name_to_value = {'_background_': 0}
for shape in data['shapes']:
label_name = shape['label']
if label_name in label_name_to_value:
label_value = label_name_to_value[label_name]
else:
label_value = len(label_name_to_value)
label_name_to_value[label_name] = label_value # label_values must be dense
label_values, label_names = [], []
for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
label_values.append(lv)
label_names.append(ln)
assert label_values == list(range(len(label_values))) lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value) captions = ['{}: {}'.format(lv, ln)
for ln, lv in label_name_to_value.items()]
lbl_viz = utils.draw_label(lbl, img, captions) out_dir = osp.basename(count[i]).replace('.', '_')
out_dir = osp.join(osp.dirname(count[i]), out_dir)
if not osp.exists(out_dir):
os.mkdir(out_dir) PIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))
#PIL.Image.fromarray(lbl).save(osp.join(out_dir, 'label.png'))
utils.lblsave(osp.join(out_dir, 'label.png'), lbl)
PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, 'label_viz.png')) with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
for lbl_name in label_names:
f.write(lbl_name + '\n') warnings.warn('info.yaml is being replaced by label_names.txt')
info = dict(label_names=label_names)
with open(osp.join(out_dir, 'info.yaml'), 'w') as f:
yaml.safe_dump(info, f, default_flow_style=False) print('Saved to: %s' % out_dir)
if __name__ == '__main__':
main()

3.生成Mask文件,由于labelme生成的掩码标签 label.png为16位存储,opencv默认读取8位,需要将16位转8位

   脚本自取https://github.com/hyhouyong/Mask-RCNN/blob/master/train_data/uint16_to_uint8.py

4.最后生成的文件夹结构如下:

开始训练:

1.安装环境

pip install -r requirements.txt

2.下载预训练模型mask_rcnn_coco.h5

  百度云链接:https://pan.baidu.com/s/1CmcfVleyw7QpVZRo3JxS2w   提取码:tf7f

3.执行命令:

python train_shape.py

开始测试:

1.将想要测试的图片放入imges文件夹中

2.执行命令:

python test_shape.py

详细代码见:我的github自取。欢迎Fork和Star并交流

Mask-RCNN:教你如何制作自己的数据集进行像素级的目标检测的更多相关文章

  1. 多目标检测分类 RCNN到Mask R-CNN

    最近做目标检测需要用到Mask R-CNN,之前研究过CNN,R-CNN:通过论文的阅读以及下边三篇博客大概弄懂了Mask R-CNN神经网络.想要改进还得努力啊... 目标检测的经典网络结构,顺序大 ...

  2. [Network Architecture]Mask R-CNN论文解析(转)

    前言 最近有一个idea需要去验证,比较忙,看完Mask R-CNN论文了,最近会去研究Mask R-CNN的代码,论文解析转载网上的两篇博客 技术挖掘者 remanented 文章1 论文题目:Ma ...

  3. 物体检测丨从R-CNN到Mask R-CNN

    这篇blog是我刚入目标检测方向,导师发给我的文献导读,深入浅出总结了object detection two-stage流派Faster R-CNN的发展史,读起来非常有趣.我一直想翻译这篇博客,在 ...

  4. Faster R-CNN:详解目标检测的实现过程

    本文详细解释了 Faster R-CNN 的网络架构和工作流,一步步带领读者理解目标检测的工作原理,作者本人也提供了 Luminoth 实现,供大家参考.   Luminoth 实现:https:// ...

  5. 目标检测--之RCNN

    目标检测--之RCNN 前言,最近接触到的一个项目要用到目标检测,还有我的科研方向caption,都用到这个,最近电脑在windows下下载数据集,估计要一两天,也不能切换到ubuntu下撸代码~.所 ...

  6. (五)目标检测算法之Faster R-CNN

    系列博客链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...

  7. (四)目标检测算法之Fast R-CNN

    系列博客链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...

  8. 手把手教你使用LabVIEW实现Mask R-CNN图像实例分割

    前言 前面给大家介绍了使用LabVIEW工具包实现图像分类,目标检测,今天我们来看一下如何使用LabVIEW实现Mask R-CNN图像实例分割. 一.什么是图像实例分割? 图像实例分割(Instan ...

  9. 目标检测网络之 Mask R-CNN

    Mask R-CNN 论文Mask R-CNN(ICCV 2017, Kaiming He,Georgia Gkioxari,Piotr Dollár,Ross Girshick, arXiv:170 ...

随机推荐

  1. 没有安装提供程序“System.Data.SqlServerCe.3.5”的解决方法

    在Windows 8.1系统下运行带数据库功能的应用,报错并提示:“System.InvalidOperationException”类型的未经处理的异常在 System.Data.Linq.dll ...

  2. Cannot read property 'apply' of undefined

    ...TypeError: Cannot read property 'apply' of undefined :一般都是作用域不对 ...TypeError: Cannot read propert ...

  3. QT 那些事

    一直做的是windows开发,有2个小项目想做到手机.看来看去,选择了QT.本文介绍自己的学习的一些心得,希望对你有帮助.1.选择QT2.安卓的一些事3.QML调用C++4.资源集成(比较有用,网上资 ...

  4. 判断一个窗口是否被挂起(发WM_NULL消息,或者调用IsHungAppWindow API进行测试)

    判断一个窗口是否被挂起了(就是没有响应了),在多窗口编程了经常会用到,在给别的窗口发消息前,为了目的窗口能确定收到消息,常常在之前先检测窗口是否被挂起了,我们以前常用的方式的是使用下面的方法: //  ...

  5. C#每天进步一点--异步编程模式

    C#可以有一个简单易用的机制用于异步执行方法,那就是委托.下面我介绍三种模式,对于这三种模式来说,原始线程都发起了一个异步方法,然后做一些其他处理.然而这些模式不同的是,原始线程获取发起的线程已经完成 ...

  6. Qt元类型(MetaType)注册入门(附一些官方文档的关键摘录)

    昨天调试项目时,突然发现如下消息: QObject::connect: Cannot queue arguments of type 'ERROR_LEVEL' (Make sure 'ERROR_L ...

  7. django自带的cache

    cache语法 from django.core.cache import cache #存入内存 cache.set("aaa",123) #从内存中获取 cache.get(& ...

  8. java设计模式-原型(prototype)

    有时候创建对象是需要耗费很多资源,但是每个对象之间又有大量的重复.我们可以选择在创建好一个对象后,以之作为模板克隆出其他对象,稍作修改,即可用于其他地方. 需要实现Cloneable接口,重写clon ...

  9. 使用 python 提取照片中的手机信息

    使用 python 提取照片中的手机信息 最近在做一个项目,有一个很重要的点是需要获取使用用户的手机信息,这里我选择从照片中获取信息.有人会问为什么不从手机里面直接获取设备信息.由于现在android ...

  10. 08 Javascript的函数

    函数:就是将一些语句进行封装,然后通过调用的形式,执行这些语句. 函数的作用: 将大量重复的语句写在函数里,以后需要这些语句的时候,可以直接调用函数,避免重复劳动. 简化编程,让编程模块化. cons ...