使用yolov5训练PASCAL VOC2012数据集以及遇到的坑
首先是pascal voc標簽數據格式轉yolo標簽數據格式,這兩種有什么區別,歡迎翻看之前的博客 PASCAL VOC格式的標注格式和YOLO格式的txt標記文件
import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join# 要生成的文件夾 sets = [('2012', 'train'), ('2012', 'val')]# 類別 classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus","car", "cat", "chair", "cow", "diningtable", "dog", "horse","motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]def convert(size, box):dw = 1. / size[0]dh = 1. / size[1]x = (box[0] + box[1]) / 2.0y = (box[2] + box[3]) / 2.0w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn (x, y, w, h)def convert_annotation(year, image_id,image_set):# 讀取Annntation文件中的xml文件in_file = open('F:/data/VOCdevkit/VOC%s/Annotations/%s.xml' % (year, image_id))out_file = open('VOC2012/labels/%s/%s.txt' % (image_set,image_id ), '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').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_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')# wd = getcwd()# 遍歷sets = [('2012', 'train'), ('2012', 'val')] for year, image_set in sets:# 在當前路徑創建文件if not os.path.exists('VOC2012/labels/''%s' % (image_set)):os.makedirs('VOC2012/labels/%s' % (image_set))image_ids = open('F:/data/VOCdevkit/VOC%s/ImageSets/Main/%s.txt'% (year, image_set)).read().strip().split()if not os.path.exists('VOC2012/images/%s' % (image_set)):os.makedirs('VOC2012/images/%s' % (image_set))list_file = open('VOC2012/images/%s.txt' % (image_set), 'w')for image_id in image_ids:# 在images中創建一個txt寫入每一個圖片數據的絕對路徑list_file.write('F:/data/VOCdevkit/VOC2012/JPEGImages/%s.jpg\n' % (image_id))convert_annotation(year, image_id,image_set)list_file.close()VOC 數據集文件夾
建立一個文件夾VOC2012
其中train.txt存放的是圖片的絕對路徑
labels中存放的是每個圖片的標簽信息,yolo格式
創建一個yaml文件voc2012.yaml
看似是把一切弄好了是吧,結果瘋狂報錯,找不到label信息?WTF
好的,debug看看吧,最后找到了原因:
好吧,發現之前訓練coco的時候就注意到這個函數過,然而一點印象沒有,這個函數要做什么事情,如果你的images中的train和val亦或者還有test,你在里面存放的是圖片,那向上面那么做,train一點事情沒有,然而如果你的images中放的是train.txt和val.text那么,這個函數會把路徑中的’JPEGImages’ 轉換成’labels’那么我們必須去絕對路徑中的那個文件夾中放置一個labels的文件夾,程序是實時讀取這個文件夾中的txt文件
注意這里有我創建的一個labels文件夾,注意這里不區分為文件夾,將所有圖片的label的標注信息txt文件都放在文件夾中即可
所以不需要在當前項目目錄中創建labels文件夾了,照樣可以train,當然可以不用這個函數,直接讀取我們想要讀取的地址應該也可以,但是這里就不做更改了,如果有人做了,并且有讀者朋友看到了,麻煩評論區指路一下, 我去觀摩一下,自己太懶不想改了,但是這樣就比較麻煩的是如果用服務器讀取的話,還是相對路徑比較簡單的,這里還是更改一下比較好,個人認為,以上就是全部內容。
補:使用服務器訓練yolov5
根據所用的gpu顯存來決定batch size大小:
BATCH_SIZE設置越大,那么所有訓練樣本數據完成一次訓練(完成一個epoch)要進行的參數更新次數會更少,那么訓練耗時更短,BATCH_SIZE設置越小,一個epoch訓練完所有樣本數據要進行的參數更新次數會更多,因此訓練耗時更長。
總結
以上是生活随笔為你收集整理的使用yolov5训练PASCAL VOC2012数据集以及遇到的坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python编程学习:中兴LTE网管MM
- 下一篇: 群晖校园网认证