用Python讀取xml文件后蚣常,裁剪標(biāo)注圖片和擴(kuò)容數(shù)據(jù)

本文的文字及圖片來(lái)源于網(wǎng)絡(luò),僅供學(xué)習(xí)撞鹉、交流使用,不具有任何商業(yè)用途,,版權(quán)歸原作者所有,如有問題請(qǐng)及時(shí)聯(lián)系我們以作處理

作者:Gendan

原文https://segmentfault.com/a/1190000038690313

想要獲取更多Python學(xué)習(xí)資料嵌巷,了解更多關(guān)于Python的知識(shí),可以加Q群630390733踴躍發(fā)言室抽,大家一起來(lái)學(xué)習(xí)討論吧搪哪!

因?yàn)橄胗脃olov5算法訓(xùn)練自己數(shù)據(jù)集識(shí)別數(shù)字“0-9”,一開始用labeling標(biāo)注了圖片坪圾,生成了大量的xml文件晓折。因?yàn)閳D片中0,1比較多兽泄,而其他數(shù)字偏少漓概,標(biāo)注到后面,就忽略了大量的0病梢,1胃珍。后面發(fā)現(xiàn),漏標(biāo)注會(huì)導(dǎo)致訓(xùn)練時(shí)把目標(biāo)識(shí)別成背景蜓陌,嚴(yán)重影響算法識(shí)別的準(zhǔn)確性觅彰。然后,我也不想重新去標(biāo)注圖片了钮热,就想著寫個(gè)Python程序根據(jù)xml文件缔莲,按照標(biāo)注框,把目標(biāo)都裁剪出來(lái)霉旗。

1痴奏、裁剪圖片

首先是根據(jù)xml文件把對(duì)應(yīng)標(biāo)注圖片蛀骇,按標(biāo)注框,裁剪出來(lái)读拆。我在的基礎(chǔ)上實(shí)現(xiàn)了裁剪圖片按類別保存到對(duì)應(yīng)文件夾里面擅憔,并在該類別下按順序編號(hào)

導(dǎo)入模塊import cv2import xml.etree.ElementTree as ETimport osfrom pathlib import Pathimport numpy as npimport random

原圖片、標(biāo)簽文件檐晕、裁剪圖片路徑

img_path = r'D:yolov5-3.1cutc_1'

xml_path = r'D:yolov5-3.1cutxml'

obj_img_path = r'D:yolov5-3.1cutc_3'

聲明一個(gè)空字典用于儲(chǔ)存裁剪圖片的類別及其數(shù)量

Numpic = {}

把原圖片裁剪后暑诸,按類別新建文件夾保存,并在該類別下按順序編號(hào)for img_file in os.listdir(img_path):

if img_file[-4:] in ['.png', '.jpg']: ?# 判斷文件是否為圖片格式

img_filename = os.path.join(img_path, img_file) ?# 將圖片路徑與圖片名進(jìn)行拼接

img_cv = cv2.imread(img_filename) ?# 讀取圖片

img_name = (os.path.splitext(img_file)[0]) ?# 分割出圖片名辟灰,如“000.png” 圖片名為“000”

xml_name = xml_path + '' + '%s.xml' % img_name ?# 利用標(biāo)簽路徑个榕、圖片名、xml后綴拼接出完整的標(biāo)簽路徑名

if os.path.exists(xml_name): ?# 判斷與圖片同名的標(biāo)簽是否存在芥喇,因?yàn)閳D片不一定每張都打標(biāo)

root = ET.parse(xml_name).getroot() ?# 利用ET讀取xml文件

for obj in root.iter('object'): ?# 遍歷所有目標(biāo)框

name = obj.find('name').text ?# 獲取目標(biāo)框名稱西采,即label名

xmlbox = obj.find('bndbox') ?# 找到框目標(biāo)

x0 = xmlbox.find('xmin').text ?# 將框目標(biāo)的四個(gè)頂點(diǎn)坐標(biāo)取出

y0 = xmlbox.find('ymin').text

x1 = xmlbox.find('xmax').text

y1 = xmlbox.find('ymax').text

obj_img = img_cv[int(y0):int(y1), int(x0):int(x1)] ?# cv2裁剪出目標(biāo)框中的圖片

Numpic.setdefault(name, 0) ?# 判斷字典中有無(wú)當(dāng)前name對(duì)應(yīng)的類別,無(wú)則新建

Numpic[name] += 1 ?# 當(dāng)前類別對(duì)應(yīng)數(shù)量 + 1

my_file = Path(obj_img_path + '' + name) ?# 判斷當(dāng)前name對(duì)應(yīng)的類別有無(wú)文件夾

if 1 - my_file.is_dir(): ?# 無(wú)則新建

os.mkdir(obj_img_path + '' + str(name))

cv2.imwrite(obj_img_path + '' + name + '' + '%04d' % (Numpic[name]) + '.jpg',

obj_img) ?# 保存裁剪圖片继控,圖片命名4位械馆,不足補(bǔ)0

2、圖片擴(kuò)容

只是把標(biāo)注框裁剪出來(lái)武通,跟單網(wǎng)gendan5.com還會(huì)有一個(gè)問題就是霹崎,每個(gè)類別的數(shù)量不一致,0冶忱,1的圖片多尾菇,其他數(shù)字少,作為訓(xùn)練集可能不太好囚枪。我想错沽,要是每個(gè)類別的圖片數(shù)量都一致就好了。于是我繼續(xù)把裁剪圖片進(jìn)行擴(kuò)容眶拉,這里只是通過給圖片增加噪點(diǎn)來(lái)擴(kuò)容。

新建一個(gè)圖片加噪點(diǎn)的函數(shù)

def random_noise(image,noise_num):

img_noiseimg = cv2.imread(image) # 讀取圖片

ows, cols, chn = img_noise.shape

for i in range(noise_num):

x = np.random.randint(0, rows)#隨機(jī)生成指定范圍的整數(shù)

y = np.random.randint(0, cols)

img_noise[x, y, :] = 0 # 0代表黑色憔儿,255代表白色

return img_noise

圖片擴(kuò)容

max_Numpic = max(Numpic.values()) # 提取裁剪圖片中忆植,類別下數(shù)量最大值for name in Numpic:# 遍歷每一個(gè)類別

for i in range (Numpic[name] + 1, max_Numpic + 1):# 把其余類別的圖片數(shù)量擴(kuò)充到,與數(shù)量值最大的類別相等(我的數(shù)據(jù)集里面“0”這個(gè)類別數(shù)量是最多的)

Noisenum = random.randint(1, 20)# 生成隨機(jī)的噪點(diǎn)數(shù)

Num = random.randint(1, Numpic[name])# 隨機(jī)選擇該類別下已存在的一個(gè)圖片

Noicepic = random_noise(obj_img_path + '' + name + '' + '%04d' % Num + '.jpg', Noisenum)# 給圖片加噪點(diǎn)

cv2.imwrite(obj_img_path + '' + name + '' + '%04d' % (i) + '.jpg', Noicepic)# 保存圖片

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谒臼,一起剝皮案震驚了整個(gè)濱河市朝刊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜈缤,老刑警劉巖拾氓,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異底哥,居然都是意外死亡咙鞍,警方通過查閱死者的電腦和手機(jī)房官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)续滋,“玉大人翰守,你說我怎么就攤上這事∑W茫” “怎么了蜡峰?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)朗恳。 經(jīng)常有香客問我湿颅,道長(zhǎng),這世上最難降的妖魔是什么粥诫? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任油航,我火速辦了婚禮,結(jié)果婚禮上臀脏,老公的妹妹穿的比我還像新娘劝堪。我一直安慰自己,他們只是感情好揉稚,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布秒啦。 她就那樣靜靜地躺著,像睡著了一般搀玖。 火紅的嫁衣襯著肌膚如雪余境。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天灌诅,我揣著相機(jī)與錄音芳来,去河邊找鬼。 笑死猜拾,一個(gè)胖子當(dāng)著我的面吹牛即舌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挎袜,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼顽聂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了盯仪?” 一聲冷哼從身側(cè)響起紊搪,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎全景,沒想到半個(gè)月后耀石,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爸黄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年滞伟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揭鳞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诗良,死狀恐怖汹桦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鉴裹,我是刑警寧澤舞骆,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站径荔,受9級(jí)特大地震影響督禽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜总处,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一狈惫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹦马,春花似錦胧谈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至旭从,卻和暖如春稳强,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背和悦。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工退疫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸽素。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓褒繁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親馍忽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棒坏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容