制作自己的COCO格式数据集,附代码!
最近做了一个细胞检测的练习项目。之前的思路是参考其他大神的代码,后来发现其他人的代码有很多自定义的内容,包括读取的数据格式等等,小白表示看不懂所以改变思路,用最简单的方法——选择mmdetection2.0中自带的Faster RNN网络进行训练。但是网络对数据格式有要求,有VOC、COCO等几种格式,我选择了COCO格式。
一、COCO2017数据集格式
COCO_ROOT #根目录├── annotations # 存放json格式的标注│ ├── instances_train2017.json │ └── instances_val2017.json└── train2017 # 存放图片文件│ ├── 000000000001.jpg │ ├── 000000000002.jpg │ └── 000000000003.jpg └── val2017 ├── 000000000004.jpg └── 000000000005.jpg
COCO所有目标框标注都放在json文件中,json文件解析出来是一个字典,格式如下:
{"info": info, "images": [image], "annotations": [annotation], "categories": [categories],"licenses": [license],
}
制作自己的数据集的时候info
和licenses
是不需要的。只需要images,annotations和categories三个字段即可。
其中images是一个字典的列表,储存图像的文件名,高宽和id,id是图象的编号,在annotations中也用到,是唯一的。有多少张图片,该列表就有多少个字典。
# json['images'][0]
{'file_name': '000000397133.jpg','height': 427,'width': 640,'id': 397133
}
categories
表示所有的类别,有多少类就定义多少,类别的id从1开始,0为背景。格式如下:
[{'supercategory': 'person', 'id': 1, 'name': 'person'},{'supercategory': 'vehicle', 'id': 2, 'name': 'bicycle'},{'supercategory': 'vehicle', 'id': 3, 'name': 'car'},{'supercategory': 'vehicle', 'id': 4, 'name': 'motorcycle'},{'supercategory': 'vehicle', 'id': 5, 'name': 'airplane'},{'supercategory': 'vehicle', 'id': 6, 'name': 'bus'},{'supercategory': 'vehicle', 'id': 7, 'name': 'train'},{'supercategory': 'vehicle', 'id': 8, 'name': 'truck'},{'supercategory': 'vehicle', 'id': 9, 'name': 'boat'}# ....
]
annotations
是检测框的标注,一个bounding box的格式如下:
{'segmentation': [[]],'area': 240.000,'iscrowd': 0,'image_id': 289343,'bbox': [0., 0., 60., 40.],'category_id': 1,'id': 1768}
其中segmentation
是分割的多边形,我对这个键的含义不是很懂,而且我用到的标注只有bbox,所知直接设置成了[[]]
,注意一定是两个列表嵌套,area
是分割的面积,bbox
是检测框的[x, y, w, h]
坐标,category_id
是类别id,与categories
中对应,image_id
图像的id,id
是bbox
的id
,每个检测框是唯一的,有几个bbox,annotations
里就有几个字典。
二、现有标注格式
使用的数据来自阿里天池宫颈癌风险检测竞赛的数据集,经过预处理后获得图像及其对应的json文件标注信息,如下所示:
三、格式转换
1.建立目录
按照COCO数据集格式建立目录,这一步很简单,没啥可说的。
2.生成train和val图片名文本文件
from glob import glob
import random# 该目录存储图片数据
patch_fn_list = glob('D:/data/TianChi/Train/roi_train_total/*.jpg')
# 返回存储图片名的列表,不包含图片的后缀
patch_fn_list = [fn.split('\\')[-1][:-4] for fn in patch_fn_list]
# 将图片打乱顺序
random.shuffle(patch_fn_list)# 按照7:3比例划分train和val
train_num = int(0.7 * len(patch_fn_list))
train_patch_list = patch_fn_list[:train_num]
valid_patch_list = patch_fn_list[train_num:]# produce train/valid/trainval txt file
split = ['train_total', 'val_total', 'trainval_total']for s in split:# 存储文本文件的地址save_path = 'D:/data/TianChi/Train/' + s + '.txt'if s == 'train':with open(save_path, 'w') as f:for fn in train_patch_list:# 将训练图像的地址写入train.txt文件f.write('%s\n' % fn)elif s == 'val':with open(save_path, 'w') as f:for fn in valid_patch_list:# 将验证图像的地址写入val.txt文件f.write('%s\n' % fn)elif s == 'trainval':with open(save_path, 'w') as f:for fn in patch_fn_list:# 将所有图像名的编号写入trainval.txt文件f.write('%s\n' % fn)print('Finish Producing %s txt file to %s' % (s, save_path))
3.将图片移动至对应目录下
import shutildef my_move(datadir, trainlistdir,vallistdir,traindir,valdir):# 打开train.txt文件fopen = open(trainlistdir, 'r') # 读取图片名称file_names = fopen.readlines()for file_name in file_names:file_name=file_name.strip('\n')# 图片的路径traindata = datadir + file_name+'.jpg'# 把图片移动至traindir路径下# 若想复制可将move改为copyshutil.move(traindata, traindir)# 同上fopen = open(vallistdir, 'r')file_names = fopen.readlines()for file_name in file_names:file_name=file_name.strip('\n')valdata = datadir + file_name+'.jpg'shutil.move(valdata, valdir)# 图片存储地址
datadir=r'D:\data\TianChi\Train\roi_uniform_hue\\'
# 存储训练图片名的txt文件地址
trainlistdir=r'D:\data\TianChi\Train\ImageSets\Main\train.txt'
# 存储验证图片名的txt文件地址
vallistdir=r'D:\data\TianChi\Train\ImageSets\Main\val.txt'
# coco格式数据集的train2017目录
traindir=r'D:\data\TianChi\Train\COCO_ROOT\train2017'
# coco格式数据集的val2017目录
valdir=r'D:\data\TianChi\Train\COCO_ROOT\val2017'
my_move(datadir, trainlistdir,vallistdir,traindir,valdir)
4.生成json文件
import json
import glob
import cv2 as cv
import osclass tococo(object):def __init__(self, jpg_paths, label_path, save_path):self.images = []self.categories = []self.annotations = []# 返回每张图片的地址self.jpgpaths = jpg_pathsself.save_path = save_pathself.label_path = label_path# 可根据情况设置类别,这里只设置了一类self.class_ids = {'pos': 1}self.class_id = 1self.coco = {}def npz_to_coco(self):annid = 0for num, jpg_path in enumerate(self.jpgpaths):imgname = jpg_path.split('\\')[-1].split('.')[0]img = cv.imread(jpg_path)jsonf = open(self.label_path + imgname + '.json').read() # 读取jsonlabels = json.loads(jsonf)h, w = img.shape[:-1]self.images.append(self.get_images(imgname, h, w, num))for label in labels:# self.categories.append(self.get_categories(label['class'], self.class_id))px,py,pw,ph=label['x'],label['y'],label['w'],label['h']box=[px,py,pw,ph]print(box)self.annotations.append(self.get_annotations(box, num, annid, label['class']))annid = annid + 1self.coco["images"] = self.imagesself.categories.append(self.get_categories(label['class'], self.class_id))self.coco["categories"] = self.categoriesself.coco["annotations"] = self.annotations# print(self.coco)def get_images(self, filename, height, width, image_id):image = {}image["height"] = heightimage['width'] = widthimage["id"] = image_id# 文件名加后缀image["file_name"] = filename+'.jpg'# print(image)return imagedef get_categories(self, name, class_id):category = {}category["supercategory"] = "Positive Cell"# id=0category['id'] = class_id# name=1category['name'] = name# print(category)return categorydef get_annotations(self, box, image_id, ann_id, calss_name):annotation = {}w, h = box[2], box[3]area = w * hannotation['segmentation'] = [[]]annotation['iscrowd'] = 0# 第几张图像,从0开始annotation['image_id'] = image_idannotation['bbox'] = boxannotation['area'] = float(area)# category_id=0annotation['category_id'] = self.class_ids[calss_name]# 第几个标注,从0开始annotation['id'] = ann_id# print(annotation)return annotationdef save_json(self):self.npz_to_coco()label_dic = self.coco# print(label_dic)instances_train2017 = json.dumps(label_dic)# 可改为instances_train2017.jsonf = open(os.path.join(save_path+'\instances_val2017.json'), 'w')f.write(instances_train2017)f.close()# 可改为train2017,要对应上面的
jpg_paths = glob.glob('D:\data\TianChi\Train\COCO_ROOT\\val2017\*.jpg')
# 现有的标注文件地址
label_path = r'D:\data\TianChi\Train\roi_label\\'
# 保存地址
save_path = r'D:\data\TianChi\Train\COCO_ROOT\annotations'
c = tococo(jpg_paths, label_path, save_path)
c.save_json()
至此就完成了COCO数据格式的转换,就可以用来跑模型了。上述程序仅适用于本人使用的数据集,大家可根据自己的数据进行修改,想了解更多关于COCO数据集格式的信息可参考目标检测 – 解析VOC和COCO格式并制作自己的数据集
制作自己的COCO格式数据集,附代码!相关推荐
- 使用tensorflow训练模型时制作自己的mnist集(附代码)
(该方法存在问题,待改正)使用tensorflow训练模型时制作自己的mnist集(附代码) 探索过程 代码(python) 想法 探索过程 (ps:第一次写,写的不好多多见谅!) mnist集合是一 ...
- 【mmdetection小目标检测教程】三、使用sahi库切分高分辨率图片,一键生成coco格式数据集
[mmdetection小目标检测教程]三.使用sahi库切分高分辨率图片,一键生成coco格式数据集 1.确认是否需要切分图像 2.子图切分 (1)安装sahi库 (2)基于sahi切图 本文我们将 ...
- 【数据集|COCO】COCO格式数据集制作与数据集参数计算
文章目录 1. 批量修改 JSON 文件中的参数 1.1 问题背景 1.2 代码实现 2. 划分训练集和测试集 2.1 问题背景 2.2 环境配置 2.3 代码实现 3. 生成 JSON 标签文件 3 ...
- 制作自己的 tusimple 格式数据集
tusimple 格式数据集制作与标注小结 最近在看 LaneNet ,然后参考网上的博客记录一下自己制作个人 tusimple 格式数据集的过程. 1.前期准备 工具: labelme 3.6.12 ...
- COCO格式数据集制作并使用yolact网络训练
前言:本文制作的数据集只有5张,仅供演示使用. 环境搭建请参考前文: ubuntu18.04环境下的darknet+yolov3搭建及程序演示 本实验平台软硬件环境参数: gpu:GTX 1060 c ...
- Winform中实现图片格式转换(附代码下载)
场景 选择一张照片并选择保存位置和要转换的图片格式实现图片格式转换. 项目运行效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸 ...
- 【Python】全文3000字,Pyecharts制作可视化大屏全流程! (附代码分享)
就在上一篇的文章当中 干货分享 | 用Pyecharts绘制20钟不同风格的炫酷交互式图表,建议收藏 有粉丝提到说是不是可以写一篇用Pyecharts模块做可视化大屏的相关教程,小编立马就答应了他的请 ...
- C语言制作电子时钟程序(内附代码)
今天来用C语言制作一款电子时钟程序,相信你们一定能用的上. 效果展示 1.窗口创建 2.基本绘图 3.时间获取 4.代码展示 绘制表盘部分代码: #include <stdio.h> ...
- Python 玩出花了!一文教你用 Python 制作吃豆人游戏! | 附代码
作者 | 李秋键 责编 | Carol 封图 | CSDN 下载自视觉中国 近几年来Python语言得到了快速发展,而Pygame作为Python开发应用和游戏必备的库更是展现了Python的优越性. ...
最新文章
- 一文详解ORB-SLAM3
- 移动通信网络协议 — GTP 协议
- 构建基于Nginx的web服务器
- 【Blog.Core开源】快速预览Admin界面效果
- servlet如何使用session把用户的手机号修改_SpringBoot源码学习系列之嵌入式Servlet容器...
- 免费mac虚拟机下载 快速安装win系统
- 数字图像学笔记——6. 噪音生成(椒盐噪音、高斯噪音、泊松噪音)
- python调用virustota接口api实现上传文件返回查毒结果
- 已知ip地址和其子网掩码如何求网络号子网号主机号
- 国内首款众筹刷单破亿的产品诞生,监管缺乏下京东刷单文化盛行
- Knowledge based | 如何获取某类肿瘤中所有已被报道的相关突变基因?
- 数数(数学题运算分配律)
- 补货中估计提前期不确定的需求分布公式推导
- Catia 滚动轴承设计
- 七夕将至,在线感受程序员男友的浪漫,不要再叫我们直男了好吗!!!
- Facebook员工跳楼轻生——没有任何工作比生命重要
- 不使用microscale库从siwarex ms读重量值
- 为Android Studio配置JDK1.8
- Keil软件添加新源文件
- 因子IC、IR信息系数和信息比率的介绍