文章目录
前言
参考的代码Mask_Rcnn
修改后的文件目录:
1. 数据集制作
1.1 数据集准备
1.1.1 样本
网上随便找的猫、狗、牛图片,有8张图(图名字和尺寸都需要统一格式),我用的数据集不是这个,目前项目没做完,所以就用这些图做个示范,主要用来记录这个过程,免得忘了!!!
1.1.2 rename.py 重命名
# -*- coding: utf-8 -*-
import os
path = "C:/Users/Administrator/Desktop/Mask_RCNN-master/make_dataset/jpg"
# 改名字和后缀
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
count=1
for file in filelist:
print(file)
for file in filelist: #遍历所有文件
Olddir=os.path.join(path,file) #原来的文件路径
if os.path.isdir(Olddir): #如果是文件夹则跳过
continue
filename=os.path.splitext(file)[0] #文件名
filetype=os.path.splitext(file)[1] #文件扩展名
# Newdir=os.path.join(path+str(count)+'.png') #用字符串函数zfill 以0补全所需位数
Newdir=os.path.join(path,str(count).zfill(6)+'.jpg')
os.rename(Olddir,Newdir)#重命名
count+=1
1.1.3 resize.cpp 统一图片的尺寸
可以用python的opencv,我是正好在做c++ opencv相关的东西,就用这个做了。
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>
#include <fstream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;
int main() {
String path = "C:/Users/Administrator/Desktop/Mask_RCNN-master/make_dataset/jpg/"; //待处理图片文件夹地址
String dest = "C:/Users/Administrator/Desktop/Mask_RCNN-master/make_dataset/jpg/"; //处理后图片的保存地址
String savedfilename;
vector<cv::String> filenames;
glob(path, filenames); //opencv里面用来读取指定路径下文件名的一个很好用的函数
int num = filenames.size();
printf("The number of file is %d", num);
for (int k = 0; k < filenames.size(); k++)
{
Mat src = imread(filenames[k]);
resize(src, src, Size(448, 512));
int len = path.length();
savedfilename = dest + filenames[k].substr(len);
imwrite(savedfilename, src);
waitKey(30);
}
return 0;
}
1.2 labelme标记得到json文件
安装和基本使用参考 labelme标记
1.3 json_to_dataset.py将json文件转为label.png
import argparse
import json
import os
import os.path as osp
import warnings
import PIL.Image
import yaml
# import draw
from labelme import utils
import base64
def main():
count = os.listdir("./before/")
for i in range(0, len(count)):
path = os.path.join("./before", count[i])
if os.path.isfile(path) and path.endswith('json'):
data = json.load(open(path))
if data['imageData']:
imageData = data['imageData']
else:
imagePath = os.path.join(os.path.dirname(path), data['imagePath'])
with open(imagePath, 'rb') as f:
imageData = f.read()
imageData = base64.b64encode(imageData).decode('utf-8')
img = utils.img_b64_to_arr(imageData)
label_name_to_value = {'_background_': 0}
for shape in data['shapes']:
label_name = shape['label']
if label_name in label_name_to_value:
label_value = label_name_to_value[label_name]
else:
label_value = len(label_name_to_value)
label_name_to_value[label_name] = label_value
# label_values must be dense
label_values, label_names = [], []
for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
label_values.append(lv)
label_names.append(ln)
assert label_values == list(range(len(label_values)))
lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)
captions = ['{}: {}'.format(lv, ln)
for ln, lv in label_name_to_value.items()]
lbl_viz = utils.draw_label(lbl, img, captions)
out_dir = osp.basename(count[i]).replace('.', '_')