Edited at

Pascal VOC形式のxmlファイルをPythonで読む


Pascal VOC形式のxmlファイルをPythonで読む


はじめに


ツールを利用してアノテーションをおこなったはいいが、さぁ物体検知を試そうという段階になって

想定しているフォーマットが微妙に違い加工が必要なケースは結構あるかと思います。

ということで、Pascal VOC形式のxmlファイルを読んで必要な情報を取り出すようにしました。


xmlファイル


以下のようなものです。アノテーション作業はlabelImgを利用しました。

ペットボトル2本と缶の位置を記録しています。


IMG_1542.xml

<annotation>

<folder>181208</folder>
<filename>IMG_1542.JPG</filename>
<path>/181208/IMG_1542.JPG</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>4032</width>
<height>3024</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>petbottle</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>733</xmin>
<ymin>507</ymin>
<xmax>1383</xmax>
<ymax>2232</ymax>
</bndbox>
</object>
<object>
<name>can</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1608</xmin>
<ymin>1412</ymin>
<xmax>2028</xmax>
<ymax>2292</ymax>
</bndbox>
</object>
<object>
<name>petbottle</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>2548</xmin>
<ymin>547</ymin>
<xmax>3143</xmax>
<ymax>2467</ymax>
</bndbox>
</object>
</annotation>



Pythonで情報の取得


以下の処理では、all_listに画像ファイル名と、クラスと位置の情報を格納しています。

# coding:utf-8


import xml.etree.ElementTree as ET

FILE = 'IMG_1542.xml'

file = open(FILE)
tree = ET.parse(file)
root = tree.getroot()

all_list = []

img_file = root.find('filename').text # 画像ファイル名を取得

for obj in root.iter('object'):
cls = obj.find('name').text
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)]

all_list.append([img_file] + b + [cls])

all_listは以下のようになります。

[['IMG_1542.JPG', 733, 507, 1383, 2232, 'petbottle'],

['IMG_1542.JPG', 1608, 1412, 2028, 2292, 'can'],
['IMG_1542.JPG', 2548, 547, 3143, 2467, 'petbottle']]