質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1342閲覧

自作xmlファイルからpklファイルを生成できない

toyo_69

総合スコア20

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/10 05:41

編集2021/10/10 12:36

###概要
物体検出アルゴリズムSSDを使い、自分で用意した画像で物体検出を行うことを考えています。
物体検出アルゴリズム(SSD:Single Shot MultBox Detecter)を学習させてみるの記事を参考に、SSDプログラムや教師データを自分の環境にクローンし、訓練用プログラムやテスト用プログラムは両方とも私の環境下で動作することを確認しました。

次に、自分で用意した教師データで物体検出をしようと物体認識用データセット作成支援ツール(Faster R-CNNとかSSDとか)の記事を参考に、用意した画像ファイルから画像のどこに何が写っているのかの情報が格納されているアノテーションデータ(xmlファイル)を作成しました。
そうして作成したxmlファイル群はSSDに渡す際に1つのpklファイルにまとめる必要があるので、ssd_kerasのPASCAL_VOC/get_data_from_XML.pyを実行したところ、以下のようなエラーが出てきてしまい、pklファイルが作成できませんでした。

自分で用意した画像ファイルとそれらから作成したxmlファイルへのパスはそれぞれ、ssd_keras/Image_data/JPEGImagesとssd_keras/Image_data/Annotationsです。

Traceback (most recent call last): File "/Users/user/research/ssd_keras/PASCAL_VOC/get_data_from_XML.py", line 108, in <module> data = XML_preprocessor('Image_data/Annotations/').data File "/Users/user/research/ssd_keras/PASCAL_VOC/get_data_from_XML.py", line 13, in __init__ self._preprocess_XML() File "/Users/user/research/ssd_keras/PASCAL_VOC/get_data_from_XML.py", line 18, in _preprocess_XML tree = ElementTree.parse(self.path_prefix + filename) File "/Users/user/opt/anaconda3/lib/python3.8/xml/etree/ElementTree.py", line 1202, in parse tree.parse(source, parser) File "/Users/user/opt/anaconda3/lib/python3.8/xml/etree/ElementTree.py", line 595, in parse self._root = parser._parse_whole(source) xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0

また、このエラーを吐いたget_data_from_XML.pyはこちらです。ちなみに自分で変えた部分は、self.num_classesに代入する数と、検出させたいクラスの指定、最後の2行の3点のみです。

Python

1### get_data_from_XML.py 2 3import numpy as np 4import os 5from xml.etree import ElementTree 6 7class XML_preprocessor(object): 8 9 def __init__(self, data_path): 10 self.path_prefix = data_path 11 self.num_classes = 6 12 self.data = dict() 13 self._preprocess_XML() 14 15 def _preprocess_XML(self): 16 filenames = os.listdir(self.path_prefix) 17 for filename in filenames: 18 tree = ElementTree.parse(self.path_prefix + filename) 19 root = tree.getroot() 20 bounding_boxes = [] 21 one_hot_classes = [] 22 size_tree = root.find('size') 23 width = float(size_tree.find('width').text) 24 height = float(size_tree.find('height').text) 25 for object_tree in root.findall('object'): 26 for bounding_box in object_tree.iter('bndbox'): 27 xmin = float(bounding_box.find('xmin').text)/width 28 ymin = float(bounding_box.find('ymin').text)/height 29 xmax = float(bounding_box.find('xmax').text)/width 30 ymax = float(bounding_box.find('ymax').text)/height 31 bounding_box = [xmin,ymin,xmax,ymax] 32 bounding_boxes.append(bounding_box) 33 class_name = object_tree.find('name').text 34 one_hot_class = self._to_one_hot(class_name) 35 one_hot_classes.append(one_hot_class) 36 image_name = root.find('filename').text 37 bounding_boxes = np.asarray(bounding_boxes) 38 one_hot_classes = np.asarray(one_hot_classes) 39 image_data = np.hstack((bounding_boxes, one_hot_classes)) 40 self.data[image_name] = image_data 41 42 def _to_one_hot(self,name): 43 one_hot_vector = [0] * self.num_classes 44 if name == 'logo': 45 one_hot_vector[0] = 1 46 elif name == 'header': 47 one_hot_vector[1] = 1 48 elif name == 'navi_botton1': 49 one_hot_vector[2] = 1 50 elif name == 'navi_botton2': 51 one_hot_vector[3] = 1 52 elif name == 'eyecatch': 53 one_hot_vector[4] = 1 54 elif name == 'phone_icon': 55 one_hot_vector[5] = 1 56 else: 57 print('unknown label: %s' %name) 58 59 return one_hot_vector 60 61## example on how to use it 62import pickle 63 64data = XML_preprocessor('Image_data/Annotations/').data 65pickle.dump(data,open('Image_data.pkl','wb')) 66

 
教師データをThe PASCAL Visual Object Classes Homepage(※Chromeでは見れないようです。)からダウンロードしてget_data_from_XML.pyを実行させれば問題なくpklファイルが生成されるようです。ですので上記の方法で作成した自作xmlファイルを読み込む際に問題が起きていると思われます。

この方法で自作xmlファイルからpklファイルを生成する際には何が問題となっているのでしょうか。
ここで行き詰まってしまっているのでご教授をお願い致します。

(追記)
自作教師データのテストということで、少ないですが10個ほどの自作xmlファイルを作成しており、それらをpklファイルにまとめ、SSDに渡そうと考えております。その自作xmlファイルの内1つの内容を下記に共有いたします。

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<annotation> 3 <folder>XXX</folder> 4 <filename>2021-09-08 15.13.29.jpg</filename> 5 <source> 6 <database>XXX</database> 7 <annotation>XXX</annotation> 8 <image>XXX</image> 9 <flickrid>XXX</flickrid> 10 </source> 11 <owner> 12 <flickrid>XXX</flickrid> 13 <name>?</name> 14 </owner> 15 <size> 16 <width>2880</width> 17 <height>1637</height> 18 <depth>3</depth> 19 </size> 20 <segmented>0</segmented> 21 <object> 22 <name>logo</name> 23 <pose>Unspecified</pose> 24 <truncated>0</truncated> 25 <difficult>1</difficult> 26 <bndbox> 27 <xmin>340</xmin> 28 <ymin>60</ymin> 29 <xmax>720</xmax> 30 <ymax>140</ymax> 31 </bndbox> 32 </object> 33 <object> 34 <name>header</name> 35 <pose>Unspecified</pose> 36 <truncated>0</truncated> 37 <difficult>1</difficult> 38 <bndbox> 39 <xmin>0</xmin> 40 <ymin>0</ymin> 41 <xmax>2880</xmax> 42 <ymax>180</ymax> 43 </bndbox> 44 </object> 45 <object> 46 <name>navi_botton1</name> 47 <pose>Unspecified</pose> 48 <truncated>0</truncated> 49 <difficult>1</difficult> 50 <bndbox> 51 <xmin>1340</xmin> 52 <ymin>60</ymin> 53 <xmax>1500</xmax> 54 <ymax>120</ymax> 55 </bndbox> 56 </object> 57 <object> 58 <name>navi_botton1</name> 59 <pose>Unspecified</pose> 60 <truncated>0</truncated> 61 <difficult>1</difficult> 62 <bndbox> 63 <xmin>1560</xmin> 64 <ymin>60</ymin> 65 <xmax>1700</xmax> 66 <ymax>120</ymax> 67 </bndbox> 68 </object> 69 <object> 70 <name>navi_botton1</name> 71 <pose>Unspecified</pose> 72 <truncated>0</truncated> 73 <difficult>1</difficult> 74 <bndbox> 75 <xmin>1740</xmin> 76 <ymin>60</ymin> 77 <xmax>1880</xmax> 78 <ymax>120</ymax> 79 </bndbox> 80 </object> 81 <object> 82 <name>navi_botton1</name> 83 <pose>Unspecified</pose> 84 <truncated>0</truncated> 85 <difficult>1</difficult> 86 <bndbox> 87 <xmin>1940</xmin> 88 <ymin>60</ymin> 89 <xmax>2140</xmax> 90 <ymax>120</ymax> 91 </bndbox> 92 </object> 93 <object> 94 <name>navi_botton1</name> 95 <pose>Unspecified</pose> 96 <truncated>0</truncated> 97 <difficult>1</difficult> 98 <bndbox> 99 <xmin>2180</xmin> 100 <ymin>60</ymin> 101 <xmax>2280</xmax> 102 <ymax>120</ymax> 103 </bndbox> 104 </object> 105 <object> 106 <name>navi_botton1</name> 107 <pose>Unspecified</pose> 108 <truncated>0</truncated> 109 <difficult>1</difficult> 110 <bndbox> 111 <xmin>2340</xmin> 112 <ymin>60</ymin> 113 <xmax>2480</xmax> 114 <ymax>120</ymax> 115 </bndbox> 116 </object> 117 <object> 118 <name>navi_botton2</name> 119 <pose>Unspecified</pose> 120 <truncated>0</truncated> 121 <difficult>1</difficult> 122 <bndbox> 123 <xmin>2660</xmin> 124 <ymin>0</ymin> 125 <xmax>2860</xmax> 126 <ymax>180</ymax> 127 </bndbox> 128 </object> 129 <object> 130 <name>eyecatch</name> 131 <pose>Unspecified</pose> 132 <truncated>0</truncated> 133 <difficult>1</difficult> 134 <bndbox> 135 <xmin>0</xmin> 136 <ymin>180</ymin> 137 <xmax>2880</xmax> 138 <ymax>740</ymax> 139 </bndbox> 140 </object> 141</annotation> 142

###やったこと

エラー文で検索をかけて調べてみて、同じような質問(Python xml.etree.ElementTree.ParseEroorについて)をされている方がいらっしゃいました。しかし、その方とは些か状況が違うようで、ssd_kerasに".DS_Store"ファイルはありませんでしたし、VOCのデータセットからでは問題なくpklファイルが生成できています。(私がダウンロードしたのはVOC2007ではなくVOC2012でしたが。)

また、自前の画像ファイルと作成したxmlファイル名のそれぞれに半角スペースが入っていたので消してみましたが状況は変わりませんでした。

他にも、XML中に実体参照していない & がある場合、ElementTree.parse で失敗するが、文字列置換で強引に修復のような記事も目を通しましたが正直よく分かりませんでした。

(追記)
xmlファイルのエラーチェックができるサイトというものをご共有いただきましたので上で共有させて頂いたxmlファイルを10個全てのエラーチェックをしてみたところ、いずれも「No errors were found」と出力されたのでxmlファイル自体には問題なさそうです。

また、AnacondaでPython3系での環境下のSpyderでもget_data_from_XML.pyを実行してみましたが、以下に示すように同じようなエラーが出てくるようです。

File "<string>", line unknown ParseError: not well-formed (invalid token): line 1, column 0

###環境
PC:MacOS BigSur11.6
プロセッサ:3.1 GHz デュアルコアIntel Core i5

また、SSDのネットワークの方の実行環境はAnacondaのSpyderやJupyter Notebookを使用していますが、get_data_from_XML.pyの実行時はVScodeを使用しています。VScodeで使用しているPythonのバージョンは2.7.16でした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2021/10/10 06:28

「not well-formed (invalid token): line 1, column 0」という事ですから、質問者が生成したXMLファイルに何か問題があるのでしょう。1行目の先頭( line 1, column 0)でエラーが出ているのですから、XMLのタグをミスタイプしたというような事が原因なのではないかと推測します。 質問者が作成したXMLファイルの内容を質問に追加して下さい。そうすれば、何がエラーの原因になっているのか判る人が居ると思います。 また、https://www.xmlvalidation.com/のサイトで、作成したXMLのエラーチェックを試みるのも有効かと。
toyo_69

2021/10/10 06:43

承知致しました。質問内容のほど、修正致しますね。 また、ご共有いただいたXMLのエラーチェックサイトを試みたところ、「No errors were found」と出力されたのでXMLファイル自体には問題なさそうでした。
jbpb0

2021/10/10 08:08

> ssd_keras/Image_data/Annotations には、xmlファイルしか無いのでしょうか?
jbpb0

2021/10/10 08:29

> VScodeで使用しているPythonのバージョンは2.7.16でした。 Python 2.xなら、 from lxml import etree parser = etree.XMLParser(recover=True) etree.fromstring(xmlstring, parser=parser) とかやるのかも (未確認) 参考 https://teratail.com/questions/56603
toyo_69

2021/10/10 09:19 編集

ssd_keras/Image_data/Annotationsには上で提示したような10個の自作xmlファイルのみが入っています。隠しファイルも表示されるようにしているので隠しファイルは無さそうです。 また、参考記事のご共有ありがとうございます。 from lxml import etree parser = etree.XMLParser(recover=True) の2文はget_data_from_XML.pyのどこに置き換えれば良いのか分かるのですが、 etree.fromstring(xmlstring, parser=parser) はどうすれば良いのでしょう? ちなみにPython3系のSpyderの方でもget_data_from_XML.pyを実行してみましたが、同じようなエラーが出るようです...
etherbeg

2021/10/10 10:01

念のため確認ですが、ディレクトリのXMLファイルのすべてが「No errors were found」だったんですよね?
jbpb0

2021/10/10 10:31

Python 2.xで実行できる環境が無いので、確認ができませんが、たぶん、 from xml.etree import ElementTree ↓ from lxml.etree import ElementTree と変えて、 from lxml import etree parser = etree.XMLParser(recover=True) etree.fromstring(xmlstring, parser=parser) は、そのすぐ下にまとめて追加したらいいのではないですかね
toyo_69

2021/10/10 12:28

>念のため確認ですが、ディレクトリのXMLファイルのすべてが「No errors were found」だったんですよね? はい、その通りです。
toyo_69

2021/10/10 12:32

>Python 2.xで実行できる環境が無いので、確認ができませんが、たぶん、 from xml.etree import ElementTree ↓ from lxml.etree import ElementTree と変えて、 from lxml import etree parser = etree.XMLParser(recover=True) etree.fromstring(xmlstring, parser=parser) は、そのすぐ下にまとめて追加したらいいのではないですかね そのようにしたところ、 Traceback (most recent call last): File "/Users/user/研究/ssd_keras/PASCAL_VOC/get_data_from_XML.py", line 8, in <module> etree.fromstring(xmlstring, parser=parser) NameError: name 'xmlstring' is not defined と出てきてしまいます。
etherbeg

2021/10/10 13:23

エラー箇所が line 1, column 0 なのが謎ですね。ファイルの先頭ってことですもんね。これが line 1, column だと、XMLファイルのエンコーディングがBOM付きUTF-8だったことが原因だったことがあるようですが…。エンコーディングは特に何か特別なものではないのでしょうか?
jbpb0

2021/10/10 13:26 編集

失礼しました etree.fromstring(xmlstring, parser=parser) を追加するのではなく、質問のコードの tree = ElementTree.parse(self.path_prefix + filename) を tree = ElementTree.parse(self.path_prefix + filename, parser=parser) に変えるみたいです 参考 https://blog.imind.jp/entry/2019/01/16/192518
jbpb0

2021/10/11 01:31 編集

> AnacondaでPython3系での環境下のSpyderでもget_data_from_XML.pyを実行してみましたが、以下に示すように同じようなエラー 当方のMacのAnacondaのPython 3.7.7で、質問のxmlファイルと「get_data_from_XML.py」の組み合わせで、そのまま実行してもエラー出ませんでした 確認手順は、下記の通りです ・Mac内の適当な場所に「Image_data」というディレクトリを作り、その中に「Annotations」というディレクトリを作りました ・「Annotations」ディレクトリには、xmlファイルを一つだけ置きました  そのxmlファイルの内容は、質問の「その自作xmlファイルの内1つの内容を下記に共有いたします。」から、(伏せ字も含めて)そのままコピペしました ・「Image_data」ディレクトリを作った場所に、「get_data_from_XML.py」を置きました  「get_data_from_XML.py」の内容は、質問の「get_data_from_XML.py」から、そのままコピペしました ・ターミナル上で、「python get_data_from_XML.py 」で実行しました 上記と同じ手順を実施したら、どうなりますでしょうか? ポイントは、既存のxmlファイルを修正するのではなく、質問の「その自作xmlファイルの内1つの内容を下記に共有いたします。」から、(伏せ字も含めて)そのままコピペすることです また、xmlファイルの作成時にVS Codeが余計なことをしないように、Macに付属の「テキストエディット」でファイルを新規作成して、そこにコピペしてみてください (当方ではそうしました) もし、質問者さんの環境でも、上記の手順ならエラーにならないのなら、そこからxmlファイルをエラーが出る時の内容に少しずつ変えて近づけていって、何を変えたらエラーになるのかが分かれば、そこからエラーの原因や対策も分かるかもしれません
toyo_69

2021/10/11 07:02

>失礼しました etree.fromstring(xmlstring, parser=parser) を追加するのではなく、質問のコードの tree = ElementTree.parse(self.path_prefix + filename) を tree = ElementTree.parse(self.path_prefix + filename, parser=parser) に変えるみたいです 参考 https://blog.imind.jp/entry/2019/01/16/192518 コードの書き方のご指南ありがとうございます。このように書いたところ、また別のエラーが出てきてしまい長くなりそうなのでこちらのスレではこのやり方はこれ以上触れないことにします...
toyo_69

2021/10/11 07:42 編集

>確認手順は、下記の通りです ・Mac内の適当な場所に「Image_data」というディレクトリを作り、その中に「Annotations」というディレクトリを作りました ・「Annotations」ディレクトリには、xmlファイルを一つだけ置きました  そのxmlファイルの内容は、質問の「その自作xmlファイルの内1つの内容を下記に共有いたします。」から、(伏せ字も含めて)そのままコピペしました ・「Image_data」ディレクトリを作った場所に、「get_data_from_XML.py」を置きました  「get_data_from_XML.py」の内容は、質問の「get_data_from_XML.py」から、そのままコピペしました ・ターミナル上で、「python get_data_from_XML.py 」で実行しました 上記と同じ手順を実施したら、どうなりますでしょうか? ポイントは、〜 ご丁寧なご指南、ありがとうございます。 ご共有頂いた手順と全く同じようにやらせて頂き、Spyderでget_data_from_XML.pyを実行してみたところ、pklファイルが作成されました!また、VScodeでも実行してみましたがpklファイルは生成できていました。(今更ですがVScodeのターミナルでPythonを実行するとPython2.7が使われ、「Run Code」で実行するとAnaconda経由でPython3.8が使われるようでした。) その後、そのディレクトリに以前のImage_dataから10個のpklファイルをそのまま持ってきて新しい方のget_data_from_XMLを実行してみるとパースエラーになりました。 それからAnnotations内のxmlファイルを一度全て消去し、再度新しくxmlファイルをテキストエディタで作成したものを一つだけImage_data/Annotationsに置き、get_data_from_XML.pyを実行してみてもパースエラーでした。 そこでもう一度新しくフォルダを作成し、そこにテキストエディタでget_data_from_XML.py、Image_data/Annotationsフォルダを作成し、Annotationsの中にテキストエディタで編集したxmlファイル群を置きました。この状態でPython3.7.11環境下でのSpyderにてget_data_from_XML.pyを実行させたところ、pklファイルが生成されました。 結局、パースエラーの原因としてはVScodeもしくはxmlファイルを作成するツール自体の問題によるエンコーディングの問題か何かでファイルが壊れてしまうのですかね? xmlファイルをテキストエディタで作成し直すことで問題なくpklファイルを生成することが出来そうではありますが、今後私は2000枚ほどの自作xmlファイルをまとめて作成する予定でして、一つ一つのxmlファイルをテキストエディタで作成し直すとなると気が遠くなりそうです。恐れ入りますが改善策等頂けると幸いです。 長文大変失礼致しました。
toyo_69

2021/10/11 07:46

>エラー箇所が line 1, column 0 なのが謎ですね。ファイルの先頭ってことですもんね。これが line 1, column だと、XMLファイルのエンコーディングがBOM付きUTF-8だったことが原因だったことがあるようですが…。エンコーディングは特に何か特別なものではないのでしょうか? その辺りは正直よく分からないのですが、おそらく何らかのエンコーディングの不具合が原因のようです。
jbpb0

2021/10/11 08:01

> それからAnnotations内のxmlファイルを一度全て消去し、再度新しくxmlファイルをテキストエディタで作成したものを一つだけImage_data/Annotationsに置き、get_data_from_XML.pyを実行してみてもパースエラーでした。 と、 > そこでもう一度新しくフォルダを作成し、そこにテキストエディタでget_data_from_XML.py、Image_data/Annotationsフォルダを作成し、Annotationsの中にテキストエディタで編集したxmlファイル群を置きました。この状態でPython3.7.11環境下でのSpyderにてget_data_from_XML.pyを実行させたところ、pklファイルが生成されました。 の違いがよく分かりません 下記を教えてください ・使用したxmlファイルの作り方は違うのでしょうか?  違うのなら、どのように違うのかを教えてください  上記ではどちらも「テキストエディタで作成した」と書かれてるので、同じ作り方に聞こえます ・「get_data_from_XML.py」は、違うものを使ったのでしょうか?  違う場合、コードの内容も違うのでしょうか? それとも、内容は全く同じものを別途作ったのでしょうか?
jbpb0

2021/10/11 08:03

もう一つ、 > ご共有頂いた手順と全く同じようにやらせて頂き、Spyderでget_data_from_XML.pyを実行してみたところ、pklファイルが作成されました!また、VScodeでも実行してみましたがpklファイルは生成できていました。 と、 > それからAnnotations内のxmlファイルを一度全て消去し、再度新しくxmlファイルをテキストエディタで作成したものを一つだけImage_data/Annotationsに置き、get_data_from_XML.pyを実行してみてもパースエラーでした。 の違いも、よく分かりませんので教えてください
jbpb0

2021/10/11 09:01

> 何らかのエンコーディングの不具合が原因のよう 大丈夫なxmlファイルと、エラーになるxmlファイルで、バイナリエディタで比較したら、違いが分かるかもしれません 普通のエディタでは表示されないデータが原因かもしれないので https://aprico-media.com/posts/2967
toyo_69

2021/10/11 09:28

>の違いがよく分かりません 下記を教えてください ・使用したxmlファイルの作り方は違うのでしょうか?  違うのなら、どのように違うのかを教えてください  上記ではどちらも「テキストエディタで作成した」と書かれてるので、同じ作り方に聞こえます ・「get_data_from_XML.py」は、違うものを使ったのでしょうか?  違う場合、コードの内容も違うのでしょうか? それとも、内容は全く同じものを別途作ったのでしょうか? >・使用したxmlファイルの作り方は違うのでしょうか?  違うのなら、どのように違うのかを教えてください  上記ではどちらも「テキストエディタで作成した」と書かれてるので、同じ作り方に聞こえます 前者と後者のxmlファイルの作成の仕方はどちらも同じでして、以前までのxmlファイルをそれぞれCotEditorというエディタで開き、内容をテキストエディタにコピー&ペーストして元の名前と同じ名前をつけて保存したものを使用しておりました。 >・「get_data_from_XML.py」は、違うものを使ったのでしょうか?  違う場合、コードの内容も違うのでしょうか? それとも、内容は全く同じものを別途作ったのでしょうか? 前者で使用していたget_data_from_XML.pyはそれより以前にVScodeで実行させていたので、このファイルも壊れているのではと不安になりましたので、私が上記にて共有しているget_data_from_XML.pyのコードをテキストエディタにコピー&ペーストして作成した新しいget_data_from_XML.pyを後者で使用しています。なので内容は前者も後者も同じ(私が共有しているコードと同じ)だと思われます。
toyo_69

2021/10/11 09:41

>もう一つ、 > ご共有頂いた手順と全く同じようにやらせて頂き、Spyderでget_data_from_XML.pyを実行してみたところ、pklファイルが作成されました!また、VScodeでも実行してみましたがpklファイルは生成できていました。 と、 > それからAnnotations内のxmlファイルを一度全て消去し、再度新しくxmlファイルをテキストエディタで作成したものを一つだけImage_data/Annotationsに置き、get_data_from_XML.pyを実行してみてもパースエラーでした。 の違いも、よく分かりませんので教えてください 前者はどのファイルもクリーンな状態だったので問題なくpklファイルが生成されましたが、後者では ・その直前に破損したxmlファイルを渡していたためにget_data_from_XML.pyも破損した ・VScodeで実行してしまったためにget_data_from_XML.pyが破損した のような原因からエラーが出力されたと勝手に邪推しておりますが、pklファイルの作成に成功した状況と同じ状況だと思っていた状態でエラーが吐かれてしまったので私自身も混乱しておりました。
toyo_69

2021/10/11 09:43

>大丈夫なxmlファイルと、エラーになるxmlファイルで、バイナリエディタで比較したら、違いが分かるかもしれません 普通のエディタでは表示されないデータが原因かもしれないので https://aprico-media.com/posts/2967 ご共有ありがとうございます。是非検討させていただきます!
jbpb0

2021/10/11 09:48

> 前者と後者のxmlファイルの作成の仕方はどちらも同じ xmlファイルは、ファイルとしては別のものだけど、作り方は全く同じで、ファイルの内容も全く同じでしょうか? もしそうならば、条件は実質同じなので、xmlファイルの違いはエラーの有無とは関係ない、となるように思います > 内容は前者も後者も同じ(私が共有しているコードと同じ) コードは、前者は以前から使ってたもので、後者は内容は同じだけど作り直したもの、ですか? xmlファイルが実質同じもので、違いがこのPythonファイルだけならば、Pythonファイルがエラーの有無を決めてることになると思うのですが、本当にそうなのでしょうか? そうなると、xmlファイルのエンコーディングは原因では無い、となってしまいますし、コードはファイルが別だけど内容は同じなら、それでエラーの有無が変わるのも考えにくい 私の理解に、どこか勘違いがありますでしょうか?
jbpb0

2021/10/11 10:02 編集

> pklファイルの作成に成功した状況と同じ状況だと思っていた状態でエラーが吐かれてしまったので私自身も混乱しておりました。 そうならないように、大丈夫な状態から、一つしか変えずにどうなるのか確認することです 同時に複数の条件を変えたら、何が原因か分からなくなります 変えてないつもりでも結果が違うのなら、何かが変わっているのです その場合は、大丈夫だったときと同じことを再び行って、大丈夫になることを確認した上で、次は一つだけしか変わらないようにします > ご共有頂いた手順と全く同じようにやらせて頂き、Spyderでget_data_from_XML.pyを実行してみたところ、pklファイルが作成されました!また、VScodeでも実行してみましたがpklファイルは生成できていました。 は、Spyder+Python 3でも、VScode+Python 2でも、どちらでも大丈夫だったということでしょうか? それとも、VS Codeで実行したのもPython 3だったのでしょうか? いずれにせよ、次にやることは、上記の大丈夫だった条件から、Pythonコードファイルを従来のもの(ファイルは違うけど、内容は同じはずのもの)に差し替えて、実行のやり方は大丈夫だった時と同じでやってみることです それでも大丈夫なら、Pythonコードファイルはエラーとは無関係なので、原因はxmlファイルにある可能性が高くなります そうではなく、(xmlファイルは同じなのに)Pythonコードファイルを差し替えただけでエラーになったら、Pythonコードファイルのどこかに何か違いがあるはずなので、それを探すことになります
toyo_69

2021/10/12 14:34

申し訳ありません、諸事情で返信が遅れてしまいました。 > コードは、前者は以前から使ってたもので、後者は内容は同じだけど作り直したもの、ですか? はい、その通りです。 > xmlファイルが実質同じもので、違いがこのPythonファイルだけならば、Pythonファイルがエラーの有無を決めてることになると思うのですが、本当にそうなのでしょうか? そうなると、xmlファイルのエンコーディングは原因では無い、となってしまいますし、コードはファイルが別だけど内容は同じなら、それでエラーの有無が変わるのも考えにくい 私の理解に、どこか勘違いがありますでしょうか? jbpb0様のご認識で間違いございません。
toyo_69

2021/10/12 14:35 編集

> Spyder+Python 3でも、VScode+Python 2でも、どちらでも大丈夫だったということでしょうか? それとも、VS Codeで実行したのもPython 3だったのでしょうか? 説明不足で失礼しました。VScodeで実行したのはPython 3の方になります。 > いずれにせよ、次にやることは、上記の大丈夫だった条件から、Pythonコードファイルを従来のもの(ファイルは違うけど、内容は同じはずのもの)に差し替えて、実行のやり方は大丈夫だった時と同じでやってみることです それでも大丈夫なら、Pythonコードファイルはエラーとは無関係なので、原因はxmlファイルにある可能性が高くなります そうではなく、(xmlファイルは同じなのに)Pythonコードファイルを差し替えただけでエラーになったら、Pythonコードファイルのどこかに何か違いがあるはずなので、それを探すことになります 問題なくpklファイルが生成される状態の条件において、get_data_from_XML.pyだけを従来のものに差し替え、 Spyder(Python 3)で実行したところ、pklファイルが生成されました。 次にxmlファイルを従来のxmlファイルで差し替え、同様にSpyderで実行したところ、パースエラーとなりました。さらに置いてある従来のxmlファイルを全て消し、差し替える前のxmlファイルを入れて実行するとパースエラーのままでした。これはどういうことになるんでしょうか?
jbpb0

2021/10/13 01:46 編集

> 問題なくpklファイルが生成される状態の条件 が、私が前のコメントに書いた手順通りだとします(xmlファイルもget_data_from_XML.pyも質問からコピペした新規ファイル) その状態を、「状態A」とします 「状態A」から、「get_data_from_XML.py」を従来のに差し替えてもOK、でしたよね 次は、「状態A」に完全に戻して、(念の為に)OKであることを確認した上で、「xmlファイル」のみ従来のに差し替えて、どうなりますでしょうか? ただし、使用する従来の「xmlファイル」は、一つだけにします 上記がOKなら、そこで始めて、「xmlファイル」と「get_data_from_XML.py」の両方を従来のに同時に差し替える、ということをします ただし、その場合も、「xmlファイル」は一つだけ使います それでもOKなら、「xmlファイル」を一つ増やして二つにして、、、とやっていきます ある「xmlファイル」を追加したらNGになるのなら、その「xmlファイル」を抜いて、再度確認します それを抜いたらOKなら、NGになる「xmlファイル」一つだけでどうなるのか、を確認します 一つだけでもそれ使ったらNGなら、この下に書いてるのに続きます 「状態A」から「xmlファイル」のみ差し替えた(ただし一つのみ使用)場合がNGなら、私が質問者さんの立場ならこうする、というのを書きますので、参考にしてください (かなり回りくどいと思われるかもしれませんが) ・「状態A」に完全に戻して、OKであることを確認 ・(OKな新規作成した)xmlファイルをコピー(以下「xmlファイルa」とする)して、それを使ってもOKであることを確認 ・「xmlファイルa」をテキストエディタで開いて、内容変更せずに上書き保存して、それを使ってもOKであることを確認 ・「xmlファイルa」をテキストエディタで開いて、その中の「NGになる従来のxmlファイル」との相違点を、一つだけ従来のファイルに合わせて変更して、それを使って実行 (以下、その結果を「結果α」とする) ・「結果α」がOKの場合は、「xmlファイルa」のテキストエディタでの変更を、NGになる変更が見つかるまで繰り返し(ただし、変更は一回に一ヶ所のみ)、NGになる変更が見つかったら、それが起きないように回避策を考える ・「xmlファイルa」の全ての相違点を従来のファイルに合わせて変更しても「結果α」がOKの場合は、テキストエディタでは見えない何かが違うはずなので、バイナリエディタを使う等して、その違いを突き止めて、回避策を考える
toyo_69

2021/10/13 06:34 編集

> 次は、「状態A」に完全に戻して、(念の為に)OKであることを確認した上で、「xmlファイル」のみ従来のに差し替えて、どうなりますでしょうか? ただし、使用する従来の「xmlファイル」は、一つだけにします 状態Aからxmlファイルを全て削除し、一つだけ従来のxmlファイルを置いてみて実行してみましたが、この時点で既にNGでした。(この状態を状態Bと呼称します。) ちなみに、状態AからAnnotationsの中身を空に(すなわちxmlファイルを全て削除)して実行するとpklファイルが生成されるのですが、状態BからAnnotationsの中身を空にして実行するとNGになるようです。
jbpb0

2021/10/13 10:35

> 状態Aからxmlファイルを全て削除し、一つだけ従来のxmlファイルを置いてみて実行してみましたが、この時点で既にNGでした。(この状態を状態Bと呼称します。) 「状態B」でNGなら、私なら、一つ前の私のコメントの >> 「状態A」から「xmlファイル」のみ差し替えた(ただし一つのみ使用)場合がNGなら、私が質問者さんの立場ならこうする、というのを書きますので、参考にしてください 以降に書いた手順で、確認していきます
toyo_69

2021/10/13 14:57

ご共有頂いた2番目の手順 > ・(OKな新規作成した)xmlファイルをコピー(以下「xmlファイルa」とする)して、それを使ってもOKであることを確認 でNGとなってしまいました。念の為語弊がないように詳細に申し上げます。 まず「状態A」に完全に戻して、OKであることを確認した後、Annotationsの中身を空にし、その状態でもOKであることを確認しました。 次にその空のAnnotationsに、別フォルダの状態AにあるAnnotationsからOKであるxmlファイルを一つだけコピーして配置しました。その状態で実行するとパースエラーになってしまいました。 となるとどのような原因が考えられるのでしょうか...何度もお聞きしてしまい申し訳ございません。
jbpb0

2021/10/14 10:10

> 隠しファイルも表示されるようにしているので隠しファイルは無さそうです。 それをどうやって確認してますか? Macのファインダーで、ファイル名が「.」で始まる「.zshrc」とかが表示されるように設定しても、「.DS_Store」は表示されません 本当に「Annotations」ディレクトリに「.DS_Store」はありませんか? ファインダーでファイルを削除したり移動したりということをしたら、勝手に「.DS_Store」が作られますよ 消しても、何かしたらすぐに作られます ターミナルで、「Annotations」のファイルを「ls -la」で都度表示して確認してみてください たとえば、ターミナルを起動してから、「Image_data」があるディレクトリに「cd」してから、 ls -la Image_data/Annotations を実行してみてください パースエラーになる時に、そこに「.DS_Store」はありませんか?
jbpb0

2021/10/14 10:28

> 次にその空のAnnotationsに、別フォルダの状態AにあるAnnotationsからOKであるxmlファイルを一つだけコピーして配置しました。その状態で実行するとパースエラーになってしまいました。 上記が再現するか当方でもやってみましたが、「Image_data/Annotations/」ディレクトリに「.DS_Store」が無ければ大丈夫でした 確認手順は、下記の通りです ・「状態A」でOKであることを確認  できた「Image_data.pkl」のサイズは992バイト  この時に使用した「xmlファイルz」を、別のディレクトリにコピーしておく  別ディレクトリにコピーしたファイルを「xmlファイルa」とする ・「Image_data/Annotations/」ディレクトリから「xmlファイルz」を削除して「get_data_from_XML.py」を実行してもOKだった  できた「Image_data.pkl」のサイズは6バイト ・別ディレクトリにコピーして置いてあった「xmlファイルa」を「Image_data/Annotations/」ディレクトリに移動して「get_data_from_XML.py」を実行してもOKだった  できた「Image_data.pkl」のサイズは992バイト 上記は全て、「get_data_from_XML.py」を実行する前に「Image_data/Annotations/」ディレクトリに「.DS_Store」が無いかを確認し、有れば削除してから「get_data_from_XML.py」を実行しました 「.DS_Store」が有ると、必ず下記のエラーになりました Traceback (most recent call last): File "get_data_from_XML.py", line 64, in <module> data = XML_preprocessor('Image_data/Annotations/').data File "get_data_from_XML.py", line 13, in __init__ self._preprocess_XML() File "get_data_from_XML.py", line 18, in _preprocess_XML tree = ElementTree.parse(self.path_prefix + filename) File "/Users/XXX/anaconda3/lib/python3.7/xml/etree/ElementTree.py", line 1197, in parse tree.parse(source, parser) File "/Users/XXX/anaconda3/lib/python3.7/xml/etree/ElementTree.py", line 598, in parse self._root = parser._parse_whole(source) xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0
toyo_69

2021/10/14 14:56

Finderで「Command」+「Shift」+「.」で隠しファイルを表示するようにしていて、それで表示されないファイルがあることを知らずに今までFinderだけで隠しファイルを確認していました...。 ご指摘の通り、ターミナルからls -laコマンドでAnnotaionsの中身を表示させたところ、パースエラーになるファイルには.DS_Storeが入っていることが確認できました...! 以降は隠しファイルを確認するときは必ずls -laコマンドで見るようにします...大変お手数をおかけしました。 念の為、.DS_Storeを削除してから、Processingのxmlファイル作成ツールを用いて一番初めに作ったxmlファイルを使ってpklファイルが作成できるか確認したところ、無事にpklファイルが生成されました! 最後に恐縮ですが、同じような事態に陥ったときの為に、質問をさせてください。 ・何故.DS_Storeがあるとこのようなパースエラーになるのでしょうか? また、本質問の処理について、 ・本質問のベストアンサーをここまでお付き合い頂いたjbpb0様に差し上げたいと思っているのですが、自己解決に書くのは違うと思いますし、その部分については今後どのように処理すれば良いでしょうか。
jbpb0

2021/10/15 01:20 編集

> ・何故.DS_Storeがあるとこのようなパースエラーになるのでしょうか? 「get_data_from_XML.py」の filenames = os.listdir(self.path_prefix) のすぐ下に、上記にインデントを合わせて print(filenames) を追加して実行すると分かりますが、「.DS_Store」があるとそれも「filenames」に格納され、次の行の for filename in filenames: で「.DS_Store」が「filename」に格納され、 tree = ElementTree.parse(self.path_prefix + filename) でそれを読み込んで「xmlファイル」として解釈しようとしますが、「.DS_Store」は「xmlファイル」ではないのでエラーになります 「.DS_Store」じゃなくても、たとえば内容が aaa だけのテキストファイルを作って、それを「Image_data/Annotations/」に置いても、同じエラーになります 「xmlファイル」以外のものを読み込ませたらダメなんですよ 上記のテキストファイルを、内容をそのままで、ファイル名の拡張子を「.xml」に変えてもダメです ファイルの内容が「xml」じゃないとダメ
jbpb0

2021/10/15 01:24

「xmlファイル」以外のものが「Image_data/Annotations/」に混入しても大丈夫なように、ファイル名の拡張子が「.xml」のファイルだけ読み込むようにコードを変えた方がいいと思いますよ 「.DS_Store」のように、Macのファインダーがいつのまにか勝手に作るファイルがありますので 参考 https://tonari-it.com/python-splitext-listdir/#toc3 の「特定の拡張子のファイルだけ取得する」
toyo_69

2021/10/15 08:03

なるほど、エラーの原因が判明して大変スッキリ致しました。ご丁寧な解説、ありがとうございました! > 「xmlファイル」以外のものが「Image_data/Annotations/」に混入しても大丈夫なように、ファイル名の拡張子が「.xml」のファイルだけ読み込むようにコードを変えた方がいいと思いますよ 「.DS_Store」のように、Macのファインダーがいつのまにか勝手に作るファイルがありますので 参考 https://tonari-it.com/python-splitext-listdir/#toc3 の「特定の拡張子のファイルだけ取得する」 ご提案や参考サイトのご共有も重ねてありがとうございます。 そのように変更しておこうと思います。 また、頂いたご回答をベストアンサーとさせて頂きます! 今まで長い間私の質問にお付き合い頂き、本当にありがとうございました!引き続きSSDを用いた物体検出、頑張らせて頂きます!
guest

回答1

0

ベストアンサー

".DS_Store"ファイルはありませんでした

Macのファインダーで、ファイル名が「.」で始まる「.zshrc」とかが表示されるように設定しても、「.DS_Store」「.localized」等の表示されないものがあります
そのようなものが何か一つでも「Image_data/Annotations/」にあると、それは「xmlファイル」ではないのでエラーになります

「get_data_from_XML.py」を実行してエラーが出たら、「Image_data/Annotations/」に余計なファイルやディレクトリが無いか、ターミナルで

ls -la 「Image_data/Annotations/」のパス

を実行して、確認してください
もし余計なものが何か有れば、それを削除してから再度「get_data_from_XML.py」を実行してみてください

投稿2021/10/15 00:53

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/10/15 01:26

「xmlファイル」以外のものが「Image_data/Annotations/」に混入しても大丈夫なように、ファイル名の拡張子が「.xml」のファイルだけ読み込むようにコードを変えた方がいいと思いますよ 「.DS_Store」のように、Macのファインダーがいつのまにか勝手に作るファイルがありますので 参考 https://tonari-it.com/python-splitext-listdir/#toc3 の「特定の拡張子のファイルだけ取得する」
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問