網(wǎng)站建設(shè)分金手指排名四私域流量和裂變營銷
文章目錄
- 關(guān)于PASCAL VOC數(shù)據(jù)集
- 目錄結(jié)構(gòu)
- ①創(chuàng)建VOC數(shù)據(jù)集的幾個相關(guān)目錄
- XML文件的形式
- ②讀取dcm文件與xml文件的配對關(guān)系
- ③創(chuàng)建VOC格式數(shù)據(jù)集
- ④創(chuàng)建訓(xùn)練、驗(yàn)證集
本文所用代碼見文末Github鏈接。
關(guān)于PASCAL VOC數(shù)據(jù)集
pascal voc數(shù)據(jù)集是關(guān)于計(jì)算機(jī)視覺,業(yè)內(nèi)廣泛使用的一套具有標(biāo)準(zhǔn)格式的數(shù)據(jù)集。包括了圖像分類、目標(biāo)檢測、語義分割等任務(wù)。
許多深度學(xué)習(xí)框架如Pytorch中寫好的一些模型都是可以默認(rèn)讀取這種Pascal VOC格式的數(shù)據(jù)集的,這樣就方便我們對數(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
更多信息見:官網(wǎng)。下載更多內(nèi)容可參考:鏡像站(可下載測試集)。
目錄結(jié)構(gòu)
它的格式信息(目錄結(jié)構(gòu))如下
我們目標(biāo)檢測主要使用上面的Annotation、JPEGImages、ImageSets/Main文件夾。
ImageSets/Main文件夾下train.txt包含了被納入訓(xùn)練集的圖片,里面是JPEGImages文件夾下圖片的文件名。
val.txt則是驗(yàn)證集的圖片文件名集合。
trainval.txt是以上兩者的合集。
展示:
圖片
標(biāo)注文件。
可以見到標(biāo)注文件xml的格式和Lung-PET-CT-Dx數(shù)據(jù)集中的標(biāo)注文件格式基本是一樣的。
①創(chuàng)建VOC數(shù)據(jù)集的幾個相關(guān)目錄
與目標(biāo)檢測相關(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ù)整理,并建立了簡易的Dataset數(shù)據(jù)集對象。
我們已創(chuàng)建了 [dcm圖片集] 和 [xml標(biāo)注集] 的一個對應(yīng)關(guān)系,我們試者重新創(chuàng)建一個Pascal VOC格式的數(shù)據(jù)集,順便可以給數(shù)據(jù)集瘦瘦身。
我們先在項(xiàng)目目錄下創(chuàng)建如下目錄:
Windows資源管理器界面:
XML文件的形式
我們知道VOC數(shù)據(jù)集中,所有的圖片文件存在了JPEGImages文件夾,且有自己的文件名。
在Annotation文件夾下,xml標(biāo)注文件的文件名對應(yīng)了圖片的文件名,且xml文件中的 [filename] 項(xiàng)對應(yīng)了圖片的文件名+擴(kuò)展名。
我們的目標(biāo)是讓Lung-PET-CT-Dx也改成這樣的形式。
②讀取dcm文件與xml文件的配對關(guān)系
在上一篇文章已經(jīng)創(chuàng)建了這一配對表,直接讀取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
我們添加新的一列,賦予它們新的名字:編號從 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)簽寫入“filename列對應(yīng)名稱.jpg”(如:000000.jpg),并命名為“ filename列對應(yīng)名稱.xml” (如:000000.xml)保存到 VOCdevkit/VOC2012/Annotations 文件夾下。
- 將dcm列的dcm文件另存為 “filename列對應(yī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)簽寫入“filename列對應(yīng)名稱.jpg”(如:000000.jpg),并命名為“ filename列對應(yī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列對應(yī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會禁用部分JPEG壓縮算法,并導(dǎo)致大文件圖像質(zhì)量幾乎沒有任何增益。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)建成功:
測試一下。
(測試的詳細(xì)代碼見文末的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