#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