大部分都是參考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 區域性變數 相同點 都是變數,定義的格式相同的。都有作用域,在其宣告的作用域內是有效的。不同點 類中宣告的位置不同 成員變數 直接宣告在類中 區域性變數 方法...