Python讀取VOC中的xml目標(biāo)框?qū)嵗?/h1>
更新時(shí)間:2020年03月10日 10:06:50 作者:Peanut_范
這篇文章主要介紹了Python讀取VOC中的xml目標(biāo)框?qū)嵗?,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
代碼:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# get annotation object bndbox location
import os
import cv2
try:
import xml.etree.cElementTree as ET #解析xml的c語(yǔ)言版的模塊
except ImportError:
import xml.etree.ElementTree as ET
##get object annotation bndbox loc start
def GetAnnotBoxLoc(AnotPath):#AnotPath VOC標(biāo)注文件路徑
tree = ET.ElementTree(file=AnotPath) #打開(kāi)文件,解析成一棵樹(shù)型結(jié)構(gòu)
root = tree.getroot()#獲取樹(shù)型結(jié)構(gòu)的根
ObjectSet=root.findall('object')#找到文件中所有含有object關(guān)鍵字的地方,這些地方含有標(biāo)注目標(biāo)
ObjBndBoxSet={} #以目標(biāo)類別為關(guān)鍵字,目標(biāo)框?yàn)橹到M成的字典結(jié)構(gòu)
for Object in ObjectSet:
ObjName=Object.find('name').text
BndBox=Object.find('bndbox')
x1 = int(BndBox.find('xmin').text)#-1 #-1是因?yàn)槌绦蚴前?作為起始位置的
y1 = int(BndBox.find('ymin').text)#-1
x2 = int(BndBox.find('xmax').text)#-1
y2 = int(BndBox.find('ymax').text)#-1
BndBoxLoc=[x1,y1,x2,y2]
if ObjName in ObjBndBoxSet:
ObjBndBoxSet[ObjName].append(BndBoxLoc)#如果字典結(jié)構(gòu)中含有這個(gè)類別了,那么這個(gè)目標(biāo)框要追加到其值的末尾
else:
ObjBndBoxSet[ObjName]=[BndBoxLoc]#如果字典結(jié)構(gòu)中沒(méi)有這個(gè)類別,那么這個(gè)目標(biāo)框就直接賦值給其值吧
return ObjBndBoxSet
##get object annotation bndbox loc end
def display(objBox,pic):
img = cv2.imread(pic)
for key in objBox.keys():
for i in range(len(objBox[key])):
cv2.rectangle(img, (objBox[key][i][0],objBox[key][i][1]), (objBox[key][i][2], objBox[key][i][3]), (0, 0, 255), 2)
cv2.putText(img, key, (objBox[key][i][0],objBox[key][i][1]), cv2.FONT_HERSHEY_COMPLEX, 1, (255,0,0), 1)
cv2.imshow('img',img)
cv2.imwrite('display.jpg',img)
cv2.waitKey(0)
if __name__== '__main__':
pic = r"./VOCdevkit/VOC2007/JPEGImages/000282.jpg"
ObjBndBoxSet=GetAnnotBoxLoc(r"./VOCdevkit/VOC2007/Annotations/000282.xml")
print(ObjBndBoxSet)
display(ObjBndBoxSet,pic)
輸出結(jié)果:
{'chair': [[335, 263, 484, 373]], 'person': [[327, 104, 476, 300], [232, 57, 357, 374], [3, 32, 199, 374], [58, 139, 296, 374]]}
圖示:

補(bǔ)充知識(shí):使用python將voc類型標(biāo)注xml文件對(duì)圖片進(jìn)行目標(biāo)還原,以及批量裁剪特定類
使用標(biāo)注工具如labelimg對(duì)圖片物體進(jìn)行voc類型標(biāo)注,會(huì)生成xml文件,如何判斷別人的數(shù)據(jù)集做的好不好,可以用以下代碼進(jìn)行目標(biāo)還原。
import xml.etree.cElementTree as ET
import cv2
import os
import glob
def GetAnnotBoxLoc(AnotPath):
tree = ET.ElementTree(file=AnotPath)
root = tree.getroot()
ObjectSet=root.findall('object')
ObjBndBoxSet={}
for Object in ObjectSet:
ObjName=Object.find('name').text
BndBox=Object.find('bndbox')
x1 = int(BndBox.find('xmin').text)
y1 = int(BndBox.find('ymin').text)
x2 = int(BndBox.find('xmax').text)
y2 = int(BndBox.find('ymax').text)
BndBoxLoc=[x1,y1,x2,y2]
if ObjName in ObjBndBoxSet:
ObjBndBoxSet[ObjName].append(BndBoxLoc)
else:
ObjBndBoxSet[ObjName]=[BndBoxLoc]
return ObjBndBoxSet
def GetAnnotName(AnotPath):
tree = ET.ElementTree(file=AnotPath)
root = tree.getroot()
path=root.find('path').text
return path
def Drawpic(xml_path,result_path):
n = 0
xmls = glob.glob(os.path.join(xml_path, '*.xml'))
for xml in xmls:
n = n + 1
box=GetAnnotBoxLoc(xml)
path=GetAnnotName(xml)
img = cv2.imread(path)
for classes in list(box.keys()):
for boxes in box[classes]:
if classes == "bad1":
cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(255,0,0),3) #blue
if classes == "bad2":
cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(0,255,0),3) #green
if classes == "bad3":
cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(0,0,255),3) #red
cv2.imwrite(result_path+"/"+str(n)+"_result.jpg", img)
print(path,"還原成功")
Drawpic("/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations","/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/test")
使用labelimg對(duì)圖像進(jìn)行標(biāo)注,folder目錄需要修改一下
import xml.etree.ElementTree as ET
import os
for i in os.listdir('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'):
tree = ET.parse('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'+'/'+i)
root = tree.getroot()
print(root.find('folder').text)
root.find('folder').text = 'VOC2012'
print(root.find('folder').text)
tree.write('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'+'/'+i)
批量裁剪特定類,xml.dom.minidom好像比xml.etree.cElementTree好用啊。
#coding=utf-8
import xml.dom.minidom
import cv2
import os
for name in os.listdir("./Annotations/"):
dom=xml.dom.minidom.parse("./Annotations/"+name)
root=dom.documentElement
object_name=root.getElementsByTagName('name')
if(object_name[0].firstChild.data == "normal"):
print(name)
xmin=root.getElementsByTagName('xmin')
ymin=root.getElementsByTagName('ymin')
xmax=root.getElementsByTagName('xmax')
ymax=root.getElementsByTagName('ymax')
x_min = int(xmin[0].firstChild.data)
y_min = int(ymin[0].firstChild.data)
x_max = int(xmax[0].firstChild.data)
y_max = int(ymax[0].firstChild.data)
img=cv2.imread("./JPEGImages/"+name[:-4]+".jpg")
cropped=img[y_min:y_max,x_min:x_max]
cv2.imwrite("./cut_jpg/"+name[:-4]+".jpg", cropped)
以上這篇Python讀取VOC中的xml目標(biāo)框?qū)嵗褪切【幏窒斫o大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
-
Python3實(shí)現(xiàn)抓取javascript動(dòng)態(tài)生成的html網(wǎng)頁(yè)功能示例
這篇文章主要介紹了Python3實(shí)現(xiàn)抓取javascript動(dòng)態(tài)生成的html網(wǎng)頁(yè)功能,結(jié)合實(shí)例形式分析了Python3使用selenium庫(kù)針對(duì)javascript動(dòng)態(tài)生成的HTML網(wǎng)頁(yè)元素進(jìn)行抓取的相關(guān)操作技巧,需要的朋友可以參考下 2017-08-08
-
Python3中的f-Strings增強(qiáng)版字符串格式化方法
這篇文章主要介紹了Python3中的f-Strings增強(qiáng)版字符串格式化方法,看完本文你將學(xué)習(xí)到如何以及為什么使用f-strings。對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2020-03-03
-
python將txt文檔每行內(nèi)容循環(huán)插入數(shù)據(jù)庫(kù)的方法
今天小編就為大家分享一篇python將txt文檔每行內(nèi)容循環(huán)插入數(shù)據(jù)庫(kù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧 2018-12-12
-
用Python解析身份證號(hào)獲取年齡和性別的實(shí)現(xiàn)方法
身份證號(hào)碼包含了豐富的信息,包括生日和性別,Python提供了處理和解析身份證號(hào)的功能,讓我們能夠從中提取出相關(guān)的信息,本文將介紹如何利用Python解析身份證號(hào),獲取持有者的年齡和性別信息,感興趣的朋友可以參考下 2023-12-12
-
Python使用Matplotlib實(shí)現(xiàn)創(chuàng)建動(dòng)態(tài)圖形
動(dòng)態(tài)圖形是使可視化更具吸引力和用戶吸引力的好方法,它幫助我們以有意義的方式展示數(shù)據(jù)可視化,本文將利用Matplotlib實(shí)現(xiàn)繪制一些常用動(dòng)態(tài)圖形,希望對(duì)大家有所幫助 2024-02-02
-
python模塊之subprocess模塊級(jí)方法的使用
這篇文章主要介紹了python模塊之subprocess模塊級(jí)方法的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧 2019-03-03
-
python之no module named xxxx以及虛擬環(huán)境配置過(guò)程
在Python開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到環(huán)境配置和包管理的問(wèn)題,主要原因包括未安裝所需包或使用虛擬環(huán)境導(dǎo)致的,通過(guò)pip install命令安裝缺失的包是解決問(wèn)題的一種方式,此外,使用虛擬環(huán)境,例如PyCharm支持的Virtualenv,可以為每個(gè)項(xiàng)目創(chuàng)建獨(dú)立的運(yùn)行環(huán)境 2024-10-10
最新評(píng)論
代碼:
#!/usr/bin/python # -*- coding: UTF-8 -*- # get annotation object bndbox location import os import cv2 try: import xml.etree.cElementTree as ET #解析xml的c語(yǔ)言版的模塊 except ImportError: import xml.etree.ElementTree as ET ##get object annotation bndbox loc start def GetAnnotBoxLoc(AnotPath):#AnotPath VOC標(biāo)注文件路徑 tree = ET.ElementTree(file=AnotPath) #打開(kāi)文件,解析成一棵樹(shù)型結(jié)構(gòu) root = tree.getroot()#獲取樹(shù)型結(jié)構(gòu)的根 ObjectSet=root.findall('object')#找到文件中所有含有object關(guān)鍵字的地方,這些地方含有標(biāo)注目標(biāo) ObjBndBoxSet={} #以目標(biāo)類別為關(guān)鍵字,目標(biāo)框?yàn)橹到M成的字典結(jié)構(gòu) for Object in ObjectSet: ObjName=Object.find('name').text BndBox=Object.find('bndbox') x1 = int(BndBox.find('xmin').text)#-1 #-1是因?yàn)槌绦蚴前?作為起始位置的 y1 = int(BndBox.find('ymin').text)#-1 x2 = int(BndBox.find('xmax').text)#-1 y2 = int(BndBox.find('ymax').text)#-1 BndBoxLoc=[x1,y1,x2,y2] if ObjName in ObjBndBoxSet: ObjBndBoxSet[ObjName].append(BndBoxLoc)#如果字典結(jié)構(gòu)中含有這個(gè)類別了,那么這個(gè)目標(biāo)框要追加到其值的末尾 else: ObjBndBoxSet[ObjName]=[BndBoxLoc]#如果字典結(jié)構(gòu)中沒(méi)有這個(gè)類別,那么這個(gè)目標(biāo)框就直接賦值給其值吧 return ObjBndBoxSet ##get object annotation bndbox loc end def display(objBox,pic): img = cv2.imread(pic) for key in objBox.keys(): for i in range(len(objBox[key])): cv2.rectangle(img, (objBox[key][i][0],objBox[key][i][1]), (objBox[key][i][2], objBox[key][i][3]), (0, 0, 255), 2) cv2.putText(img, key, (objBox[key][i][0],objBox[key][i][1]), cv2.FONT_HERSHEY_COMPLEX, 1, (255,0,0), 1) cv2.imshow('img',img) cv2.imwrite('display.jpg',img) cv2.waitKey(0) if __name__== '__main__': pic = r"./VOCdevkit/VOC2007/JPEGImages/000282.jpg" ObjBndBoxSet=GetAnnotBoxLoc(r"./VOCdevkit/VOC2007/Annotations/000282.xml") print(ObjBndBoxSet) display(ObjBndBoxSet,pic)
輸出結(jié)果:
{'chair': [[335, 263, 484, 373]], 'person': [[327, 104, 476, 300], [232, 57, 357, 374], [3, 32, 199, 374], [58, 139, 296, 374]]}
圖示:
補(bǔ)充知識(shí):使用python將voc類型標(biāo)注xml文件對(duì)圖片進(jìn)行目標(biāo)還原,以及批量裁剪特定類
使用標(biāo)注工具如labelimg對(duì)圖片物體進(jìn)行voc類型標(biāo)注,會(huì)生成xml文件,如何判斷別人的數(shù)據(jù)集做的好不好,可以用以下代碼進(jìn)行目標(biāo)還原。
import xml.etree.cElementTree as ET import cv2 import os import glob def GetAnnotBoxLoc(AnotPath): tree = ET.ElementTree(file=AnotPath) root = tree.getroot() ObjectSet=root.findall('object') ObjBndBoxSet={} for Object in ObjectSet: ObjName=Object.find('name').text BndBox=Object.find('bndbox') x1 = int(BndBox.find('xmin').text) y1 = int(BndBox.find('ymin').text) x2 = int(BndBox.find('xmax').text) y2 = int(BndBox.find('ymax').text) BndBoxLoc=[x1,y1,x2,y2] if ObjName in ObjBndBoxSet: ObjBndBoxSet[ObjName].append(BndBoxLoc) else: ObjBndBoxSet[ObjName]=[BndBoxLoc] return ObjBndBoxSet def GetAnnotName(AnotPath): tree = ET.ElementTree(file=AnotPath) root = tree.getroot() path=root.find('path').text return path def Drawpic(xml_path,result_path): n = 0 xmls = glob.glob(os.path.join(xml_path, '*.xml')) for xml in xmls: n = n + 1 box=GetAnnotBoxLoc(xml) path=GetAnnotName(xml) img = cv2.imread(path) for classes in list(box.keys()): for boxes in box[classes]: if classes == "bad1": cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(255,0,0),3) #blue if classes == "bad2": cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(0,255,0),3) #green if classes == "bad3": cv2.rectangle(img,(int(boxes[0]),int(boxes[1])),(int(boxes[2]),int(boxes[3])),(0,0,255),3) #red cv2.imwrite(result_path+"/"+str(n)+"_result.jpg", img) print(path,"還原成功") Drawpic("/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations","/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/test")
使用labelimg對(duì)圖像進(jìn)行標(biāo)注,folder目錄需要修改一下
import xml.etree.ElementTree as ET import os for i in os.listdir('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'): tree = ET.parse('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'+'/'+i) root = tree.getroot() print(root.find('folder').text) root.find('folder').text = 'VOC2012' print(root.find('folder').text) tree.write('/home/wxy/Dashboard/dataset/VOCdevkit/VOC2012/Annotations'+'/'+i)
批量裁剪特定類,xml.dom.minidom好像比xml.etree.cElementTree好用啊。
#coding=utf-8 import xml.dom.minidom import cv2 import os for name in os.listdir("./Annotations/"): dom=xml.dom.minidom.parse("./Annotations/"+name) root=dom.documentElement object_name=root.getElementsByTagName('name') if(object_name[0].firstChild.data == "normal"): print(name) xmin=root.getElementsByTagName('xmin') ymin=root.getElementsByTagName('ymin') xmax=root.getElementsByTagName('xmax') ymax=root.getElementsByTagName('ymax') x_min = int(xmin[0].firstChild.data) y_min = int(ymin[0].firstChild.data) x_max = int(xmax[0].firstChild.data) y_max = int(ymax[0].firstChild.data) img=cv2.imread("./JPEGImages/"+name[:-4]+".jpg") cropped=img[y_min:y_max,x_min:x_max] cv2.imwrite("./cut_jpg/"+name[:-4]+".jpg", cropped)
以上這篇Python讀取VOC中的xml目標(biāo)框?qū)嵗褪切【幏窒斫o大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python3實(shí)現(xiàn)抓取javascript動(dòng)態(tài)生成的html網(wǎng)頁(yè)功能示例
這篇文章主要介紹了Python3實(shí)現(xiàn)抓取javascript動(dòng)態(tài)生成的html網(wǎng)頁(yè)功能,結(jié)合實(shí)例形式分析了Python3使用selenium庫(kù)針對(duì)javascript動(dòng)態(tài)生成的HTML網(wǎng)頁(yè)元素進(jìn)行抓取的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Python3中的f-Strings增強(qiáng)版字符串格式化方法
這篇文章主要介紹了Python3中的f-Strings增強(qiáng)版字符串格式化方法,看完本文你將學(xué)習(xí)到如何以及為什么使用f-strings。對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03python將txt文檔每行內(nèi)容循環(huán)插入數(shù)據(jù)庫(kù)的方法
今天小編就為大家分享一篇python將txt文檔每行內(nèi)容循環(huán)插入數(shù)據(jù)庫(kù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12用Python解析身份證號(hào)獲取年齡和性別的實(shí)現(xiàn)方法
身份證號(hào)碼包含了豐富的信息,包括生日和性別,Python提供了處理和解析身份證號(hào)的功能,讓我們能夠從中提取出相關(guān)的信息,本文將介紹如何利用Python解析身份證號(hào),獲取持有者的年齡和性別信息,感興趣的朋友可以參考下2023-12-12Python使用Matplotlib實(shí)現(xiàn)創(chuàng)建動(dòng)態(tài)圖形
動(dòng)態(tài)圖形是使可視化更具吸引力和用戶吸引力的好方法,它幫助我們以有意義的方式展示數(shù)據(jù)可視化,本文將利用Matplotlib實(shí)現(xiàn)繪制一些常用動(dòng)態(tài)圖形,希望對(duì)大家有所幫助2024-02-02python模塊之subprocess模塊級(jí)方法的使用
這篇文章主要介紹了python模塊之subprocess模塊級(jí)方法的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03python之no module named xxxx以及虛擬環(huán)境配置過(guò)程
在Python開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到環(huán)境配置和包管理的問(wèn)題,主要原因包括未安裝所需包或使用虛擬環(huán)境導(dǎo)致的,通過(guò)pip install命令安裝缺失的包是解決問(wèn)題的一種方式,此外,使用虛擬環(huán)境,例如PyCharm支持的Virtualenv,可以為每個(gè)項(xiàng)目創(chuàng)建獨(dú)立的運(yùn)行環(huán)境2024-10-10