недопустимый литерал для int() с основанием 10: ‘1044.0’

#python #object-detection

Вопрос:

Я пытаюсь запустить следующий код в терминале для создания train.record

 !python convert_to_tfrecord.py -x xml -l label_map.pbtxt -o train.record -i images
 

Где xml — это папка xml-файлов, а изображения-папка исходных изображений. Это дает мне ошибку:

 Traceback (most recent call last):
  File "convert_to_tfrecord.py", line 165, in <module>
    tf.app.run()
  File "/usr/local/lib/python3.7/dist-packages/tensorflow/python/platform/app.py", line 40, in run
    _run(main=main, argv=argv, flags_parser=_parse_flags_tolerate_undef)
  File "/usr/local/lib/python3.7/dist-packages/absl/app.py", line 303, in run
    _run_main(main, args)
  File "/usr/local/lib/python3.7/dist-packages/absl/app.py", line 251, in _run_main
    sys.exit(main(argv))
  File "convert_to_tfrecord.py", line 152, in main
    examples = xml_to_csv(args.xml_dir)
  File "convert_to_tfrecord.py", line 82, in xml_to_csv
    int(root.find('size')[0].text),
ValueError: invalid literal for int() with base 10: '1044.0'
 

Соответствующий код для convert_to_tfrecord.py является:

 def xml_to_csv(path):
    """Iterates through all .xml files (generated by labelImg) in a given directory and combines
    them in a single Pandas dataframe.
    Parameters:
    ----------
    path : str
        The path containing the .xml files
    Returns
    -------
    Pandas DataFrame
        The produced dataframe
    """

    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
 

Похоже, что это ошибка с шириной, но я не знаю, как ее исправить. Ценю любую помощь!

РЕДАКТИРОВАТЬ: Я только что попробовал int(float(…)), но это все равно не исправляет ошибку

Комментарии:

1. я думаю, что ему не нравится часть «.0» в конце текста

2. Это звучит так, как будто вы, возможно, захотите вместо этого преобразовать в float или сначала в float, а затем в int.

3. @CharlesDuffy Я только что попробовал, но это не исправляет ошибку, я не совсем понимаю, почему ее нельзя преобразовать в int

4. «РЕДАКТИРОВАТЬ: я только что попробовал int(float(…)), но это все равно не исправляет ошибку»— Пожалуйста, укажите ошибки, которые вы получаете после попытки int(float()) .

Ответ №1:

Ваше число представляет собой десятичную строку

Поэтому сначала вам нужно преобразовать в float, а затем в int, так как он имеет десятичную дробь.

 def xml_to_csv(path):
    """Iterates through all .xml files (generated by labelImg) in a given directory and combines
    them in a single Pandas dataframe.
    Parameters:
    ----------
    path : str
        The path containing the .xml files
    Returns
    -------
    Pandas DataFrame
        The produced dataframe
    """

    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(float(root.find('size')[0].text)),
                     int(float(root.find('size')[1].text)),
                     member[0].text,
                     int(float(member[4][0].text)),
                     int(float(member[4][1].text)),
                     int(float(member[4][2].text)),
                     int(float(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
 

Например:

 >>> int('1044.0')
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    int('1044.0')
ValueError: invalid literal for int() with base 10: '1044.0'
>>> int(float('1044.0'))
1044