轉自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噢!
