網(wǎng)站建設(shè)分金手指排名四私域流量和裂變營(yíng)銷(xiāo)
文章目錄
- 關(guān)于PASCAL VOC數(shù)據(jù)集
- 目錄結(jié)構(gòu)
- ①創(chuàng)建VOC數(shù)據(jù)集的幾個(gè)相關(guān)目錄
- XML文件的形式
- ②讀取dcm文件與xml文件的配對(duì)關(guān)系
- ③創(chuàng)建VOC格式數(shù)據(jù)集
- ④創(chuàng)建訓(xùn)練、驗(yàn)證集
本文所用代碼見(jiàn)文末Github鏈接。
關(guān)于PASCAL VOC數(shù)據(jù)集
pascal voc數(shù)據(jù)集是關(guān)于計(jì)算機(jī)視覺(jué),業(yè)內(nèi)廣泛使用的一套具有標(biāo)準(zhǔn)格式的數(shù)據(jù)集。包括了圖像分類(lèi)、目標(biāo)檢測(cè)、語(yǔ)義分割等任務(wù)。
許多深度學(xué)習(xí)框架如Pytorch中寫(xiě)好的一些模型都是可以默認(rèn)讀取這種Pascal VOC格式的數(shù)據(jù)集的,這樣就方便我們對(duì)數(shù)據(jù)集進(jìn)行各種處理、實(shí)驗(yàn)。
Pascal VOC2012 train/val數(shù)據(jù)集官方下載地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
更多信息見(jiàn):官網(wǎng)。下載更多內(nèi)容可參考:鏡像站(可下載測(cè)試集)。
目錄結(jié)構(gòu)
它的格式信息(目錄結(jié)構(gòu))如下
我們目標(biāo)檢測(cè)主要使用上面的Annotation、JPEGImages、ImageSets/Main文件夾。
ImageSets/Main文件夾下train.txt包含了被納入訓(xùn)練集的圖片,里面是JPEGImages文件夾下圖片的文件名。
val.txt則是驗(yàn)證集的圖片文件名集合。
trainval.txt是以上兩者的合集。
展示:
圖片
標(biāo)注文件。
可以見(jiàn)到標(biāo)注文件xml的格式和Lung-PET-CT-Dx數(shù)據(jù)集中的標(biāo)注文件格式基本是一樣的。
①創(chuàng)建VOC數(shù)據(jù)集的幾個(gè)相關(guān)目錄
與目標(biāo)檢測(cè)相關(guān)的只有:
VOCdevkit/VOC2012/Annotation (存放xml標(biāo)注文件)
VOCdevkit/VOC2012/ImageSets/Main (存放train.txt、val.txt)
VOCdevkit/VOC2012/JPEGImages (存放圖像文件)
在上一節(jié)我們已經(jīng)進(jìn)行了數(shù)據(jù)整理,并建立了簡(jiǎn)易的Dataset數(shù)據(jù)集對(duì)象。
我們已創(chuàng)建了 [dcm圖片集] 和 [xml標(biāo)注集] 的一個(gè)對(duì)應(yīng)關(guān)系,我們?cè)囌咧匦聞?chuàng)建一個(gè)Pascal VOC格式的數(shù)據(jù)集,順便可以給數(shù)據(jù)集瘦瘦身。
我們先在項(xiàng)目目錄下創(chuàng)建如下目錄:
Windows資源管理器界面:
XML文件的形式
我們知道VOC數(shù)據(jù)集中,所有的圖片文件存在了JPEGImages文件夾,且有自己的文件名。
在A(yíng)nnotation文件夾下,xml標(biāo)注文件的文件名對(duì)應(yīng)了圖片的文件名,且xml文件中的 [filename] 項(xiàng)對(duì)應(yīng)了圖片的文件名+擴(kuò)展名。
我們的目標(biāo)是讓Lung-PET-CT-Dx也改成這樣的形式。
②讀取dcm文件與xml文件的配對(duì)關(guān)系
在上一篇文章已經(jīng)創(chuàng)建了這一配對(duì)表,直接讀取csv文件。
import pydicom
import matplotlib.pyplot as plt
import os
from tqdm import tqdm
import pandas as pd
import numpy as np
import cv2 as cv
from PIL import Image
import xml.etree.ElementTree as ETxml_file_dataset = pd.read_csv('xml_file_dataset.csv', index_col=0)
xml_file_dataset
我們添加新的一列,賦予它們新的名字:編號(hào)從 000000~03883。
xml_file_dataset['filename'] = xml_file_dataset.index.values
xml_file_dataset['filename'] = xml_file_dataset['filename'].astype(str)
xml_file_dataset['filename'] = xml_file_dataset['filename'].str.zfill(6)
xml_file_dataset
這列filename就是新的文件名。
③創(chuàng)建VOC格式數(shù)據(jù)集
思路:
- 將xml列的xml文件中的 [filename] 標(biāo)簽寫(xiě)入“filename列對(duì)應(yīng)名稱(chēng).jpg”(如:000000.jpg),并命名為“ filename列對(duì)應(yīng)名稱(chēng).xml” (如:000000.xml)保存到 VOCdevkit/VOC2012/Annotations 文件夾下。
- 將dcm列的dcm文件另存為 “filename列對(duì)應(yīng)名稱(chēng).jpg”(如:000000.jpg),存到 VOCdevkit/VOC2012/JPEGImages文件夾下。
xml_list = xml_file_dataset['xml'].values
dcm_list = xml_file_dataset['dcm'].values
filename_list = xml_file_dataset['filename'].values# 將xml文件中的[filename]標(biāo)簽寫(xiě)入“filename列對(duì)應(yīng)名稱(chēng).jpg”(如:000000.jpg),并命名為“ filename列對(duì)應(yīng)名稱(chēng).xml” (如:000000.xml)保存到 VOCdevkit/VOC2012/Annotations 文件夾下。
def to_switch_xml(xml, filename):tree = ET.parse(xml)root = tree.getroot()sub1 = root.find('filename')sub1.text = filename + '.jpg'tree.write('./VOCdevkit/VOC2012/Annotations/{}.xml'.format(filename))# 將dcm文件另存為 “filename列對(duì)應(yīng)名稱(chēng).jpg”(如:000000.jpg),存到 VOCdevkit/VOC2012/JPEGImages文件夾下。
def to_switch_dcm(dcm, filename):img_open=pydicom.read_file(dcm)img_array=img_open.pixel_array# 將PETCT的三通道格式轉(zhuǎn)成單通道格式if len(img_array.shape) == 3:img_array = cv.cvtColor(img_array, cv.COLOR_BGR2GRAY)img_array = np.array(img_array, dtype=np.float32)img = Image.fromarray(img_array)img = img.convert('L')# quality參數(shù): 保存圖像的質(zhì)量,值的范圍從1(最差)到95(最佳)。 默認(rèn)值為75,使用中應(yīng)盡量避免高于95的值; 100會(huì)禁用部分JPEG壓縮算法,并導(dǎo)致大文件圖像質(zhì)量幾乎沒(méi)有任何增益。img.save('./VOCdevkit/VOC2012/JPEGImages/{}.jpg'.format(filename), quality=95)img.close()
# 在SSD上預(yù)計(jì)需要跑2分鐘
for xml, filename in tqdm(zip(xml_list, filename_list), total=len(xml_list)):to_switch_xml(xml, filename)# 在SSD上預(yù)計(jì)需要跑10分鐘
for dcm, filename in tqdm(zip(dcm_list, filename_list), total=len(dcm_list)):to_switch_dcm(dcm, filename)
xml文件創(chuàng)建成功:
圖像文件創(chuàng)建成功:
測(cè)試一下。
(測(cè)試的詳細(xì)代碼見(jiàn)文末的Github地址)
④創(chuàng)建訓(xùn)練、驗(yàn)證集
ImageSets/Main文件夾下創(chuàng)建 train.txt、val.txt
import os
import randomrandom.seed(0) # 設(shè)置隨機(jī)種子,保證隨機(jī)結(jié)果可復(fù)現(xiàn)files_path = "./VOCdevkit/VOC2012/Annotations"
assert os.path.exists(files_path), "path: '{}' does not exist.".format(files_path)val_rate = 0.3 # 設(shè)置多少歸為驗(yàn)證集files_name = sorted([file.split(".")[0] for file in os.listdir(files_path)])
files_num = len(files_name)
val_index = random.sample(range(0, files_num), k=int(files_num*val_rate))
train_files = []
val_files = []
for index, file_name in enumerate(files_name):if index in val_index:val_files.append(file_name)else:train_files.append(file_name)try:train_f = open("./VOCdevkit/VOC2012/ImageSets/Main/train.txt", "x")eval_f = open("./VOCdevkit/VOC2012/ImageSets/Main/val.txt", "x")train_f.write("\n".join(train_files))eval_f.write("\n".join(val_files))
except FileExistsError as e:print(e)exit(1)
創(chuàng)建成功!
本文所用代碼: 我的Github