Mask-RCNN数据集制作
Posted my0213
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mask-RCNN数据集制作相关的知识,希望对你有一定的参考价值。
转自https://blog.csdn.net/pingushen2100/article/details/80513043
一.Mask-RCNN数据集
1.1 训练Mask-RCNN用的到的文件有三种:原图像(jpg),mask(png),info.yaml
也就是训练的训练图像,掩模(mask),info.yaml里存放的是label的名字:分为背景,物体1,物体2.......的名字
1.2 图像的重命名:
1.3这里我们先创建一个叫train的文件夹,在文件里存放训练的文件图像(之后的操作基本都在这里面)
我的训练图像格式是bmp格式的,所以先转格式---使用以下python脚本
#-*- coding:utf-8 -*- from PIL import Image import os import glob os.chdir(r‘./‘)#图片所在文件夹 for file_names in glob.glob(‘*.bmp‘):#找出所有的后缀为bmp的格式的图片 print(file_names) file_path = r‘./‘+‘//‘+file_names#拼接出图片的完整url print(file_path) out_path = os.path.splitext(file_path)[0]+‘.jpg‘ Image.open(file_path).save(out_path) print(‘转换成功‘)
把脚本放在图片所在文件夹,在当前文件夹下打开终端: sudo python3 脚本名字.py 即可
1.4 labelme图像标注工具
Github链接: https://github.com/wkentaro/labelme
注意事项:在train下新建一个json文件夹用于labelme生成的json文件
1.5编写 .sh 脚本 去生成标签等数据 我这里是20张图,21这个参数根据自己的设定
#!/bin/bash s1="/home/attach/datasets/train/json/rgb_" s2=".json" for((i=1;i<21;i++)) do s3=${i} labelme_json_to_dataset ${s1}${s3}${s2} done
1.6rgb_X_json里面的label是16位深的,而opencv读取的是8位的,所以新建一个mask文件夹用于生成label.png
#include <iostream> #include <opencv2/opencv.hpp> #include <string> #include <stdio.h> using namespace std; using namespace cv; int main(void){ char buff1[100]; char buff2[100]; for(int i=1;i<21;i++){ sprintf(buff1,"/home/attach/datasets/train/json/rgb_%d_json/label.png",i); sprintf(buff2,"/home/attach/datasets/train/mask/%d.png",i); Mat src; src=imread(buff1,CV_LOAD_IMAGE_UNCHANGED); Mat ff=Mat::zeros(src.rows,src.cols,CV_8UC1); for(int k=0;k<src.rows;k++){ for(int kk=0;kk<src.cols;kk++){ int n=src.at<ushort>(k,kk); ff.at<uchar>(k,kk)=n; } } imwrite(buff2,ff); } return 0; }
使用如下命令:
sudo g++ tran16_8.cpp -lpthread -o tran16_8 `pkg-config --cflags --libs opencv`
新建rgb用于存放训练的rgb_x.jpg
Mask-RCNN训练的图像需要是2的倍数(困惑,你知道了告诉我哈~)
以下放出两个resize的python脚本
resizejpg的,放在rgb文件夹下,在rgb下打开终端直接运行:(sudo python3 你的脚本名字.py)
#-*- coding:utf-8 -*- from PIL import Image import os.path import glob def convertjpg(jpgfile,outdir,width=512,height=512): img=Image.open(jpgfile) try: new_img=img.resize((width,height),Image.BILINEAR) new_img.save(os.path.join(outdir,os.path.basename(jpgfile))) except Exception as e: print(e) for jpgfile in glob.glob("./*.jpg"): convertjpg(jpgfile,"./")
resizepng的脚本是放在mask文件夹下运行:
#-*- coding:utf-8 -*- from PIL import Image import os.path import glob def convertpng(pngfile,outdir,width=512,height=512): img=Image.open(pngfile) try: new_img=img.resize((width,height),Image.BILINEAR) new_img.save(os.path.join(outdir,os.path.basename(pngfile))) except Exception as e: print(e) for pngfile in glob.glob("./*.png"): convertpng(pngfile,"./")
当你看到这里的时候,恭喜你!你的Mask-RCNN数据集做好了
最后的小tips:放在rgb mask 跑的脚本记得去掉,不然训练的时候读取会报错out of range噢!
以上是关于Mask-RCNN数据集制作的主要内容,如果未能解决你的问题,请参考以下文章
图像语义分割标注工具labelme制作自己的数据集用于mask-rcnn训练
mask-rcnn代码解读:rpn_feature_maps数据的处理