一. 描述:
Mask RCNN是迄今为止比较先进的实例分割框架,厉害之处就在于,他不仅能够分类出物体所属类别,而且还能绘制出图片中物体的轮廓,速度,精确度都不错,但是制作自己的数据集一直没有一个比较好的教程,本篇博客就讲一下怎样制作自己的数据集。
二. 图片标注及转化
(1)安装labelme工具(https://github.com/wkentaro/labelme)
先安装anaconda,
再依次执行命令:
conda create --name=labelme python=3.6
conda activate labelme
pip install pyqt5
pip install labelme
执行完后,从控制台直接输入命令: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