凤凰山居士
贫民
贫民
  • 最后登录2020-09-30
  • 发帖数6
阅读:327回复:9

[python]做ssd目标检测过程中,解析xml文件时出现如下错误

楼主#
更多 发布于:2020-09-29 15:30
Traceback (most recent call last):
  File "E:/deep_learning-studying/ssd_detection/ssd/datazets/commodity/new.py", line 27, in <module>
    et = ET.parse(xml_path + filename)
  File "F:\anaconda\anaconda\lib\xml\etree\ElementTree.py", line 1197, in parse
    tree.parse(source, parser)
  File "F:\anaconda\anaconda\lib\xml\etree\ElementTree.py", line 598, in parse
    self._root = parser._parse_whole(source)
xml.etree.ElementTree.ParseError: no element found: line 1, column 0
CSDN上说是xml文件错误,但仔细检查过了,xml文件没问题,路径设置也没问题,文件里的信息也可以在解码过程中读取显示,不知道该怎么调。

最新喜欢:

doubleyongdouble...
doubleyong
管理员
管理员
  • 最后登录2020-10-29
  • 发帖数914
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
沙发#
发布于:2020-09-30 11:47
凤凰山居士:非常感谢您的回答,十分感谢!
关于第一个方法:应该不是路径的问题,因为xml文件是可以读到的,里面的内容也可以解析出来,过程中的文件名,xmin,ymin等内容可以被显示打印。
第二个方法我这样改了,但还是提示一模一样的错误。
再次感谢您回...
回到原帖
你客气了哦,都没有解决呢,哈哈
会不会是xml文件有部分格式不对,要不换个简单的xml文件,测试下
知识需要管理,知识需要分享
凤凰山居士
贫民
贫民
  • 最后登录2020-09-30
  • 发帖数6
板凳#
发布于:2020-09-30 11:07
doubleyong:楼主,你试试
1. ET.parse 方法里的xml路径,写成相对路径
2. 试试,下面代码,看看能不能读取
import xml.etree.ElementTree as ET
f = open(‘C:\test.xml’)
xml_t...
回到原帖
非常感谢您的回答,十分感谢!
关于第一个方法:应该不是路径的问题,因为xml文件是可以读到的,里面的内容也可以解析出来,过程中的文件名,xmin,ymin等内容可以被显示打印。
第二个方法我这样改了,但还是提示一模一样的错误。
再次感谢您回答,非常谢谢您
doubleyong
管理员
管理员
  • 最后登录2020-10-29
  • 发帖数914
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
地板#
发布于:2020-09-30 10:00
楼主,你试试
1. ET.parse 方法里的xml路径,写成相对路径
2. 试试,下面代码,看看能不能读取
import xml.etree.ElementTree as ET
f = open(‘C:\test.xml’)
xml_text = f.read()
root = ET.fromstring(xml_text)
f.close()


方法1,如果还是报错,你就试试方法2
知识需要管理,知识需要分享
凤凰山居士
贫民
贫民
  • 最后登录2020-09-30
  • 发帖数6
4楼#
发布于:2020-09-29 16:54
非常感谢您的回复,我的代码是这样的
doubleyong:网上找了下,说可能是因为,没有关闭文件句柄,你可以试试
source = open(path_to_file)
tree = ET.parse(source)
... do your work ...
source.close()
回到原帖

import xml.etree.ElementTree as ET import numpy as np import pickle import os def one_hot(name):
    one_hot_vector = [0] * 3 # 此处3代表分类的类别数 if name == 'mukuai':
        one_hot_vector[0] = 1 elif name == 'yingliaoping':
        one_hot_vector[1] = 1 elif name == 'zhiban':
        one_hot_vector[2] = 1 else: print('unknow label: %s' % name) return one_hot_vector # file_path目录下是xml文件 file_path = 'E:/deep_learning-studying/ssd_detection/ssd/datazets/commodity/Annotations/' xml_path = file_path
num_classes = 3 data = {} for filename in os.listdir(xml_path): # et = ET.parse(xml_path + filename) # root = et.getroot() source = open(xml_path + filename)
    et = ET.parse(xml_path + filename)
    root = et.getroot() # 获取图片基础属性 # 获取size size = root.find('size') # print(size) width = float(size.find('width').text)
    height = float(size.find('height').text)
    depth = float(size.find('depth').text) # print(width,height,depth) # 2、对于每张图片,解析其中的多个物体 # print(root.findall('object')) bounding_boxes = []
    one_hot_classes = [] for object_tree in root.findall('object'): for bounding_box in object_tree.iter('bndbox'):
            xmin = float(bounding_box.find('xmin').text) / width
            ymin = float(bounding_box.find('ymin').text) / height
            xmax = float(bounding_box.find('xmax').text) / width
            ymax = float(bounding_box.find('ymax').text) / height # print(xmin,ymin,xmax,ymax) bounding_box = [xmin, ymin, xmax, ymax]
        bounding_boxes.append(bounding_box)
        class_name = object_tree.find('name').text # 将类别进行one_hot编码 one_hot_class = one_hot(class_name)
        one_hot_classes.append(one_hot_class) #print(bounding_boxes,one_hot_classes) # 进行物体位置和目标值的one_hot编码进行拼接 image_name = root.find('filename').text
    bounding_boxes = np.asarray(bounding_boxes)
    one_hot_classes = np.asarray(one_hot_classes) # 存储图片标注的结果对应的名字,以及图片的标注数据(4个坐标以及onehot编码) image_data = np.hstack((bounding_boxes, one_hot_classes))
    data[filename] = image_data

    source.close() print(image_data) # print(data.data) pickle.dump(data.data,open('./commodity_gt.pkl','wb'))
凤凰山居士
贫民
贫民
  • 最后登录2020-09-30
  • 发帖数6
5楼#
发布于:2020-09-29 16:53
非常感谢您的回复,这个原因我也看到过,这么改了但还是出现这个错误
凤凰山居士
贫民
贫民
  • 最后登录2020-09-30
  • 发帖数6
6楼#
发布于:2020-09-29 16:50
非常感谢您的回复,代码已经贴上了
凤凰山居士
贫民
贫民
  • 最后登录2020-09-30
  • 发帖数6
7楼#
发布于:2020-09-29 16:45

from xml.etree import ElementTree as ET import os import numpy as np import pickle class XmlProcess(object): def __init__(self,file_path): self.xml_path = file_path self.num_classes = 3 self.data = {} def process_xml(self): """ 处理图片的标注信息,解析图片大小,图片中所有物体位置、类别 存入序列化的pkl文件 :return: """ #1、找到路径对应的图片 flienames = os.listdir(self.xml_path) for filename in flienames:

            et = ET.parse(self.xml_path + filename) print(et)
            root = et.getroot() print(root) #获取图片基础属性 #获取size size = root.find('size') #print(size) width = float(size.find('width').text)
            height = float(size.find('height').text) depth = float(size.find('depth').text) #print(width,height,depth) #2、对于每张图片,解析其中的多个物体 #print(root.findall('object')) bounding_boxes = []
            one_hot_classes = [] for object_tree in root.findall('object'): for bounding_box in object_tree.iter('bndbox'):
                     xmin = float(bounding_box.find('xmin').text) / width
                     ymin = float(bounding_box.find('ymin').text) / height
                     xmax = float(bounding_box.find('xmax').text) / width
                     ymax = float(bounding_box.find('ymax').text) / height #print(xmin,ymin,xmax,ymax) bounding_box = [xmin, ymin, xmax, ymax]
                bounding_boxes.append(bounding_box)
                class_name = object_tree.find('name').text #将类别进行one_hot编码 one_hot_class = self.one_hot(class_name)
                one_hot_classes.append(one_hot_class) #print(bounding_boxes,one_hot_classes) #进行物体位置和目标值的one_hot编码进行拼接 #image_name = root.find('filename').text bounding_boxes = np.asarray(bounding_boxes)
            one_hot_classes = np.asarray(one_hot_classes) #存储图片标注的结果对应的名字,以及图片的标注数据(4个坐标以及onehot编码) image_data = np.hstack((bounding_boxes,one_hot_classes)) self.data[filename] = image_data print(image_data) return None def one_hot(self,name):
        one_hot_vector = [0] * 3 #此处3代表分类的类别数 if name == 'mukuai':
            one_hot_vector[0] = 1 elif name == 'yingliaoping':
            one_hot_vector[1] = 1 elif name == 'zhiban':
            one_hot_vector[2] = 1 else: print('unknow label: %s' % name) return one_hot_vector if __name__ =='__main__': # 此路径下是XML文件 xp = XmlProcess('E:/deep_learning-studying/ssd_detection/ssd/datazets/commodity/Annotations/')
    xp.process_xml() # print(xp.data) pickle.dump(xp.data,open('./commodity_gt.pkl','wb'))



doubleyong
管理员
管理员
  • 最后登录2020-10-29
  • 发帖数914
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
8楼#
发布于:2020-09-29 15:53
网上找了下,说可能是因为,没有关闭文件句柄,你可以试试
source = open(path_to_file)
tree = ET.parse(source)
... do your work ...
source.close()
知识需要管理,知识需要分享
doubleyong
管理员
管理员
  • 最后登录2020-10-29
  • 发帖数914
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
9楼#
发布于:2020-09-29 15:43
朋友,你解析文件的代码,贴一个吧
知识需要管理,知识需要分享
游客


返回顶部

公众号

公众号