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`
2.最後補充
新建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數據集制作