web-dev-qa-db-ja.com

pythonでPascal VOCアノテーションを読み取る

次のようなxmlファイルに、Pascal VOC規則に従う注釈があります。

<annotation>
<folder>training</folder>
<filename>chanel1.jpg</filename>
<source>
<database>synthetic initialization</database>
<annotation>Pascal VOC2007</annotation>
<image>synthetic</image>
<flickrid>none</flickrid>
</source>
<owner>
<flickrid>none</flickrid>
<name>none</name>
</owner>
<size>
<width>640</width>
<height>427</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>chanel</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>344</xmin>
<ymin>10</ymin>
<xmax>422</xmax>
<ymax>83</ymax>
</bndbox>
</object>
<object>
<name>chanel</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>355</xmin>
<ymin>165</ymin>
<xmax>443</xmax>
<ymax>206</ymax>
</bndbox>
</object>
</annotation>

Pythonでフィールドfilenamebndboxなどを取得する最もクリーンな方法は何ですか?

公式のPython=ソリューションのようですが、それを機能させることができません。

これまでの私のコード:

from xml.etree import ElementTree as ET
tree = ET.parse("data/all/annotations/" + file)
fn = tree.find('filename').text
boxes = tree.findall('bndbox')

これは

fn == 'chanel1.jpg'
boxes == []

そのため、filenameフィールドは正常に抽出されますが、bndbox 'sは抽出されません。

6
Jsevillamol

それはあなたの問題の非常に簡単な解決策です:

これは、ネストされたリストのボックス座標[xmin、ymin、xmax、ymax]とファイル名を返します。bndboxタグが混在している場合(ymin、xmin、...)または他の奇妙な組み合わせなので、このコード位置だけでなくタグも読みます。

それが役に立てば幸い...

import xml.etree.ElementTree as ET


def read_content(xml_file: str):

    tree = ET.parse(xml_file)
    root = tree.getroot()

    list_with_all_boxes = []

    for boxes in root.iter('object'):

        filename = root.find('filename').text

        ymin, xmin, ymax, xmax = None, None, None, None

        for box in boxes.findall("bndbox"):
            ymin = int(box.find("ymin").text)
            xmin = int(box.find("xmin").text)
            ymax = int(box.find("ymax").text)
            xmax = int(box.find("xmax").text)

        list_with_single_boxes = [xmin, ymin, xmax, ymax]
        list_with_all_boxes.append(list_with_single_boxes)

    return filename, list_with_all_boxes

name, boxes = read_content("file.xml")
2
pix_1

詳細なドキュメントとソースコードを以下に示します。 https://github.com/trinath503/Python/tree/master/Generate_Pascal_VOC_Files

注:指定されたformartでデータを渡す必要があります

  Pascal_voc_data = '''
                        [
                                            {
                                                "folder":"folder",
                                                "filename": "1.jpg",
                                                "path":"path",
                                                "source":{"database":"database"},
                                                "size":{"width":256,"height":256,"depth":3},
                                                "segmented":0,
                                                "objects":[{"name":"name","pose":"pose","truncated":"truncated","occluded":"occluded","bndbox":{"xmin":3,"xmax":33,"ymin":3,"ymax":33}},{"name":"name","pose":"pose","truncated":"truncated","occluded":"occluded","bndbox":{"xmin":3,"xmax":33,"ymin":3,"ymax":33}}]
                                            },
                                            {
                                                "folder":"folder",
                                                "filename": "2.jpg",
                                                "path":"path",
                                                "source":{"database":"database"},
                                                "size":{"width":256,"height":256,"depth":3},
                                                "segmented":0,
                                                "objects":[{"name":"name","pose":"pose","truncated":"truncated","occluded":"occluded","bndbox":{"xmin":3,"xmax":33,"ymin":3,"ymax":33}},{"name":"name","pose":"pose","truncated":"truncated","occluded":"occluded","bndbox":{"xmin":3,"xmax":33,"ymin":3,"ymax":33}}]
                                            }
                        ]
                    '''
0
Trinath Reddy