yolov3實現之coco數據集目標檢測準備

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的內容,僅展示部分:

具體的標籤信息,以第一個爲例:

水平有限,若有不當之處,請指教,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章