coco数据集不仅可以用于做目标检测还可以用于进行语义分割,这里主要讲解基于yolov3进行目标检测的数据准备。由于coco数据集的标签信息是以.json的格式存储的,因此有必要转换为具体的格式来进行模型训练与评估。具体的实现方式如下:
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 2 11:41:44 2019
@author: Administrator
"""
#from __feature__ import print_function
import os,sys,zipfile
import json
import glob
def convert(size,box):
dw = 1. / (size[0])
dh = 1. / (size[1])
x = box[0] + box[2] / 2.0
y = box[1] + box[3] / 2.0
w = box[2]
h = box[3]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x,y,w,h)
def get_coco_data(path):
data = json.load(open(path,'r'))
imgs = data['images']
annotations = data['annotations']
print(len(imgs))
for img in imgs:
filename = img['file_name']
img_w = img['width']
img_h = img['height']
img_id = img['id']
ana_txt_name = filename.split('.')[0] + '.txt'
f_txt = open(os.path.join('./labels',ana_txt_name),'w')
for ann in annotations:
if ann['image_id'] == img_id:
box = convert((img_w,img_h),ann['bbox'])
f_txt.write('%s %s %s %s %s\n'%(ann['category_id'],box[0],box[1],box[2],box[3]))
f_txt.close()
def get_file_name(path,save_name):
filenames = list(glob.iglob(os.path.join(path,'*.txt')))
print('file_len = ',len(filenames))
f_txt = open(save_name,'w')
for filename in filenames:
img_name = filename.split('.')[1]
img_name = img_name.split('\\')[-1]
f_txt.write('%s\n'%(img_name))
f_txt.close()
def get_img_name(path,save_name):
imgnames = list(glob.iglob(os.path.join(path,'*.jpg')))
print('img_len = ',len(imgnames))
f_txt = open(save_name,'w')
for imgname in imgnames:
imgname = imgname.split('.')[-2]
imgname = imgname.split('\\')[-1]
f_txt.write('%s\n'%(imgname))
f_txt.close()
def save_img_path(path,save_name):
filenames = list(glob.iglob(os.path.join(path,'*.jpg')))
f_txt = open(save_name,'w')
for filename in filenames:
filename0 = filename.split('\\')[0]
filename1 = filename.split('\\')[-1]
filename2 = filename0 + '/' + filename1
f_txt.write('%s'%(filename2))
f_txt.close()
if __name__ == '__main__':
#存储数据的类别和标签信息,每张图片对应一个txt文件
#path = 'F:/dataset/coco2017/annotations/instances_val2017.json'
#get_coco_data(path)
#保存图像的具体路径信息
save_img_path('F:/dataset/coco2017/train2017/images','train.txt')
#save_img_path('F:/dataset/coco2017/val2017/images','val.txt')
具体可以根据自己的数据集路径,对上面的代码做适当的修改就可以获取v3模型训练与评估所需要的格式了。
这里的存储如下:
images的内容,仅展示部分:
labels的内容,仅展示部分:
具体的标签信息,以第一个为例:
水平有限,若有不当之处,请指教,谢谢!