Bootstrap

制作自己的Mask RCNN数据集

制作自己的Mask RCNN数据集

一. 描述:

Mask RCNN是迄今为止比较先进的实例分割框架,厉害之处就在于,他不仅能够分类出物体所属类别,而且还能绘制出图片中物体的轮廓,速度,精确度都不错,但是制作自己的数据集一直没有一个比较好的教程,本篇博客就讲一下怎样制作自己的数据集。

二. 图片标注及转化

Windows环境下:
(1)安装labelme工具(https://github.com/wkentaro/labelme)
   先安装anaconda,
   再依次执行命令:
conda create --name=labelme python=3.6
conda activate labelme
pip install pyqt5
pip install labelme
(2)安装opencv-3.4.0(https://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.4.0/opencv-3.4.0-vc14_vc15.exe/download)
执行完后,从控制台直接输入命令:labelme就可以打开该工具,如果提示“不是内部或外部命令,也不是可运行的程序处理文件”,可以直接进入anaconda安装目录搜索 labelme.exe,然后打开也可以打开该工具。




(2)工具的使用

点击open选择要标记的原图片,选择对目标区域进行标注。标注点收尾相连时会弹出一个框,填入标记的类名,点击ok,然后点击save按钮,会生成一个json文件。【github也有使用说明】

(3)标注后的json文件转化
说明:

通过使用labelme自带的程序可以将标注后生成的json文件需要转换为我们需要的标签文件,转化一般会生成5个文件,如下图


其中需要用的只有info.yaml以及label.png。

(4) 转化label.png为可用格式

需要安装opencv,这里使用的是opencv-3.4.0,


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

这里提供一个JAVA编写的程序,可以实现以上需要的转化:
/**
	 * 说明 : 16位灰度图 转化为 8位灰度图
	 */
	public void transform(String originPath, String transformPath) {
		
		if(!new File(originPath).exists()) {
			System.out.println("文件不存在!");
			return;
		}
		
		//原图片
		Mat src = Imgcodecs.imread(originPath, Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);
		
		//生成的图片
		Mat mat = Mat.zeros(src.rows(), src.cols(), CvType.CV_8SC1);
		for (int r = 0; r < src.rows(); r++) {
			for(int c = 0; c < src.cols(); c++){
				mat.put(r, c, src.get(r, c));
			}
		}
		
		Imgcodecs.imwrite(transformPath, mat);
		
	}

使用的时候类里面要加上:

static {
		//注意程序运行的时候需要在VM option添加该行 指明opencv的dll文件所在路径  
        //-Djava.library.path=$PROJECT_DIR$\opencv\x64
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
	}

并且 运行的时候要注意:选中该类,右键Run As -> Run Configurations -> VM arguments中配置:

-Djava.library.path=E:\python\opencv\opencv\build\java\x64

具体路径视个人安装opencv路径而言。

转化后的label.png图片即可用于训练了。


最后提供一套JAVA的程序,用于标注后文件的转化,下载地址:

https://download.csdn.net/download/qq_27063119/10346736




;