1 VOC0712轉YOLO 只要行人

2021-09-28 21:21:01 字數 4587 閱讀 9827

大部分都是參考yolo從零開始:基於yolov3的行人檢測入門指南,不過他這個還得分幾步,各種配置也比較麻煩,因此進行了優化,直接一步到位。

原來的voc2007和voc2012的路徑是這樣的:

建立乙個data資料夾,這樣直接按照相對路徑去寫和標註檔案位置,方便自己使用

執行下面**

import xml.etree.elementtree as et

import pickle

import os

from os import listdir

from os.path import join

import shutil

# 資料集之間的標註轉換

def convert(size, box):

dw = 1./(size[0])

dh = 1./(size[1])

x = (box[0] + box[1])/2.0 - 1

y = (box[2] + box[3])/2.0 - 1

w = box[1] - box[0]

h = box[3] - box[2]

x = x*dw

w = w*dw

y = y*dh

h = h*dh

return (x,y,w,h)

def convert_annotation(year, image_id, root, labels_dir):

in_file = open(os.path.join(root, 'voc%s/annotations/%s.xml'%(year, image_id)))

out_file = open(os.path.join(labels_dir, image_id + '.txt'), 'w')

tree=et.parse(in_file)

root = tree.getroot()

size = root.find('size')

w = int(size.find('width').text)

h = int(size.find('height').text)

for obj in root.iter('object'):

# difficult = obj.find('difficult').text

cls = obj.find('name').text

# if cls not in classes or int(difficult)==1:

# 保留困難的資料集

if cls not in classes:

continue

cls_id = classes.index(cls)

xmlbox = obj.find('bndbox')

b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))

bb = convert((w,h), b)

out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

if __name__ == '__main__':

sets = [('2007', 'trainval'), ('2007', 'test'), ('2012', 'trainval')]

classes = ['person']

src_dir = '/home/common/wangsong/voc/vocdevkit' # 存放voc2007 voc2012的路徑

dst_dir = '/home/wangsong/data' # 轉換的yolo資料集的路徑

images_dir = os.path.join(dst_dir, 'images') # data/images

labels_dir = os.path.join(dst_dir, 'labels') # data/labels

# 建立yolo這倆資料夾images_dir labels_dir

if not os.path.exists(images_dir):

os.makedirs(images_dir)

if not os.path.exists(labels_dir):

os.makedirs(labels_dir)

for year, image_set in sets:

# 讀取voc的main裡面的txt,得到trainval.txt/test.txt裡面的id

image_ids = open(os.path.join(src_dir, 'voc%s/imagesets/main/%s.txt' % (year, image_set))).read().strip().split()

# yolo需要的訓練集驗證集所在路徑

# 這裡先分別寫,後面再根據需要彙總即可

list_file = open(os.path.join(dst_dir, '%s_%s.txt' % (year, image_set)), 'w')

for image_id in image_ids:

# 判斷有木有行人目標的標誌

objcount = 0

# 開啟voc的xml標註檔案

in_file = open(os.path.join(src_dir, 'voc%s/annotations/%s.xml' % (year, image_id)))

# yolo所需要的標註檔案

out_file = open(os.path.join(labels_dir, image_id + '.txt'), 'w')

# 解析voc標註檔案xml

tree = et.parse(in_file)

root = tree.getroot()

size = root.find('size')

w = int(size.find('width').text)

h = int(size.find('height').text)

for obj in root.iter('object'):

# difficult = obj.find('difficult').text

cls = obj.find('name').text

# if cls not in classes or int(difficult)==1:

# 保留困難的資料集

if cls not in classes:

continue

# 說明有行人目標了

objcount += 1

cls_id = classes.index(cls)

xmlbox = obj.find('bndbox')

b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),

float(xmlbox.find('ymax').text))

bb = convert((w, h), b)

out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

# 如果這個含有行人目標

if objcount > 0:

# 將這路徑加入yolo的訓練驗證txt

# list_file.write('data/images/%s.jpg\n' % image_id) # 相對路徑

list_file.write( os.path.join(dst_dir, 'images/%s.jpg\n' % image_id) ) # 絕對路徑

# 將這複製到yolo資料夾的images_dir

shutil.copy(src_img, dst_img)

else:

# 如果這沒有行人,那麼就直接刪除了這個標註檔案

# 不需要複製和標註檔案了,也不要寫進訓練驗證txt

del out_file

os.remove(os.path.join(labels_dir, image_id + '.txt'))

list_file.close()

# os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")

# os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")

深度學習 YOLOV3在VOC07資料集測試

來自voc07,the pascal visual object classification,此資料集分訓練集與測試集,其中訓練集,5011張,測試集4952張。去訓練集中10 用作驗證集,階段一 50個epoch,lr 1e 3,batch size 32,耗時350s左右 epoch。階段二 ...

C語言1部落格作業07

第三章 分支結構3.3使學生學生熟悉多分枝語句switch的使用 這個作業屬於哪個課程 c語言程式設計ll 這個作業的要求在 我在這個課程的目標是 學習好c語言的基本操做 這個作業在哪個具體方面幫助我實現目標 學會使用switch語句 參考文獻 教材 7 12 統計學生成績 15 分 本題要求編寫程...

day07 物件導向程式設計(1)

修飾符 class 類名 概念 如何由類建立物件以及實現功能的呼叫 物件的記憶體解析 格式修飾符 資料型別 屬性名 初始化值 成員變數 vs 區域性變數 相同點 都是變數,定義的格式相同的。都有作用域,在其宣告的作用域內是有效的。不同點 類中宣告的位置不同 成員變數 直接宣告在類中 區域性變數 方法...