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的內容,僅展示部分:
具體的標籤信息,以第一個爲例:
水平有限,若有不當之處,請指教,謝謝!