機能
この関数は、行によって、XMLデータラインにプログラムデータを変換することです。
概略的なXML:
<annotation>
<folder>东</folder>
<filename>0.jpg</filename>
<path>D:\tttt\任务\东\0.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>720</width>
<height>1280</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>car</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>122</xmin>
<ymin>264</ymin>
<xmax>335</xmax>
<ymax>532</ymax>
</bndbox>
</object>
<object>
<name>car</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>547</xmin>
<ymin>599</ymin>
<xmax>720</xmax>
<ymax>910</ymax>
</bndbox>
</object>
<object>
<name>car</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>453</xmin>
<ymin>317</ymin>
<xmax>586</xmax>
<ymax>501</ymax>
</bndbox>
</object>
<object>
<name>car</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>443</xmin>
<ymin>97</ymin>
<xmax>592</xmax>
<ymax>281</ymax>
</bndbox>
</object>
</annotation>
変換を模式的結果:
imgs/0.jpg 122,264,335,532,6 547,599,720,910,6 453,317,586,501,6 443,97,592,281,6
imgs/100.jpg 165,295,314,532,6 433,160,649,540,6
imgs/1000.jpg 135,278,345,556,6 355,666,653,1066,6 575,242,694,375,6 575,148,685,238,6
コード:
import xml.etree.ElementTree as ET
import os
classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
inAddr = 'imgs/'
anno_in_Addr = 'annotations/%s'
anno_out_Addr = 'train.txt'
jpg_addrs_generator = os.walk(inAddr)
_,_,jpg_addrs = next(jpg_addrs_generator)
outfile = open(anno_out_Addr, 'w')
for jpg_addr in jpg_addrs:
xml_addr = jpg_addr.replace('.jpg','.xml')
xml_addr = anno_in_Addr%(xml_addr)
print(jpg_addr,xml_addr)
writeStr = inAddr+jpg_addr
tree=ET.parse(xml_addr)
root = tree.getroot()
for obj in root.iter('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult)==1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text), int(xmlbox.find('ymax').text))
boxStr = " %d,%d,%d,%d,%d"%(b[0],b[1],b[2],b[3],cls_id)
writeStr += boxStr
#print(writeStr)
writeStr = writeStr + '\n'
outfile.write(writeStr)
outfile.close()