Max
Max

Reputation: 537

"IndexError: child index out of range "- converting xml to csv

As a beginner with the Python, I am trying to convert my XML files to CSV using this tutorial instructions (https://www.youtube.com/watch?v=kq2Gjv_pPe8&list=PLiIy2ThQvgewp67FDKV2H1h-154bJK9RS&index=2&t=477s). Finally I need my images and annotations in tfrecord format to usee them in my custom EfficientDet model.I followed these two posts solutions ( IndexError: child index out of range and why do I keep getting child out of range error?) and tried a bunch of different node numbers (1-9) in this sentence "int(member[3][0].text)" but constantly received "IndexError: child index out of range" error!

I am trying to convert my XML files with the following format :

<annotation>
<folder>images</folder>
<filename>Czech_000010.jpg</filename>
<size>
<depth>3</depth>
<width>600</width>
<height>600</height>
</size>
<object>
<name>D40</name>
<bndbox>
<xmin>213</xmin>
<ymin>409</ymin>
<xmax>274</xmax>
<ymax>441</ymax>
</bndbox>
</object>
<object>
<name>D10</name>
<bndbox>
<xmin>228</xmin>
<ymin>473</ymin>
<xmax>327</xmax>
<ymax>495</ymax>
</bndbox>
</object>
</annotation>

to CSV using the following script:

import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET


def xml_to_csv(path):
    xml_list = []
    for xml_file in glob.glob(path + '/*.xml'):
        tree = ET.parse(xml_file)
        root = tree.getroot()
        for member in root.findall('object'):
            value = (root.find('filename').text,
                     int(root.find('size')[0].text),
                     int(root.find('size')[1].text),
                     member[0].text,
                     int(member[4][0].text),
                     int(member[4][1].text),
                     int(member[4][2].text),
                     int(member[4][3].text)
                     )
            xml_list.append(value)
    column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
    xml_df = pd.DataFrame(xml_list, columns=column_name)
    return xml_df


def main():
    for directory in ['train','test']:
        image_path = os.path.join(os.getcwd(), 'images/{}'.format(directory))
        xml_df = xml_to_csv(image_path)
        xml_df.to_csv('data/{}_labels.csv'.format(directory), index=None)
        print('Successfully converted xml to csv.')


main()

Upvotes: 1

Views: 3846

Answers (1)

Martin Nečas
Martin Nečas

Reputation: 593

Please try:

for member in root.findall('object'):
    value = (root.find('filename').text,
                 int(root.find('size').find('width').text),
                 int(root.find('size').find('height').text),
                 member[0].text,
                 int(member.find("bndbox").find('xmin').text),
                 int(member.find("bndbox").find('ymin').text),
                 int(member.find("bndbox").find('xmax').text),
                 int(member.find("bndbox").find('ymax').text)
                )

Upvotes: 9

Related Questions