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

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

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

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

Q&A

解決済

1回答

1091閲覧

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

yokosawa123

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/11/05 06:26

前提・実現したいこと

学生の研究でSSDを用いた物体検知を行っています。
そこで自作のxmlファイルをpklファイルにまとめる作業でエラーが出てしまいます。
知識のある方ご教授よろしくお願いします。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "pklファイル作成プログラム.py", line 56, in <module> data = XML_preprocessor('C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション').data File "pklファイル作成プログラム.py", line 11, in __init__ self._preprocess_XML() File "pklファイル作成プログラム.py", line 16, in _preprocess_XML tree = ElementTree.parse(self.path_prefix + filename) File "C:\Users\ユーザー名\anaconda3\envs\new_keras\lib\xml\etree\ElementTree.py", line 1195, in parse tree.parse(source, parser) File "C:\Users\ユーザー名\anaconda3\envs\new_keras\lib\xml\etree\ElementTree.py", line 585, in parse source = open(source, "rb") FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーションLINE_ALBUM_%25E3%2582%258A%25E3%2582%2593%25E3%2581%2594_211011_53.xml' ### 該当のソースコード

以下、実行したプログラムです

import numpy as np import os from xml.etree import ElementTree class XML_preprocessor(object): def __init__(self, data_path): self.path_prefix = data_path self.num_classes = 1 #検出したいラベルの数 self.data = dict() self._preprocess_XML() def _preprocess_XML(self): filenames = os.listdir(self.path_prefix) for filename in filenames: tree = ElementTree.parse(self.path_prefix + filename) root = tree.getroot() bounding_boxes = [] one_hot_classes = [] size_tree = root.find('size') width = float(size_tree.find('width').text) height = float(size_tree.find('height').text) 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 bounding_box = [xmin,ymin,xmax,ymax] bounding_boxes.append(bounding_box) class_name = object_tree.find('name').text one_hot_class = self._to_one_hot(class_name) one_hot_classes.append(one_hot_class) image_name = root.find('filename').text bounding_boxes = np.asarray(bounding_boxes) one_hot_classes = np.asarray(one_hot_classes) image_data = np.hstack((bounding_boxes, one_hot_classes)) self.data[image_name] = image_data def _to_one_hot(self,name): one_hot_vector = [0] * self.num_classes if name == 'apple': one_hot_vector[0] = 1 else: print('unknown label: %s' %name) return one_hot_vector ## example on how to use it # import pickle # data = XML_preprocessor('VOC2007/Annotations/').data # pickle.dump(data,open('VOC2007.pkl','wb')) import pickle data = XML_preprocessor('C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション').data pickle.dump(data,open('apple1000.pkl','wb')) #名前を指定してpklファイルとして保存

python

試したこと

パスの手打ち、パスの変更、自作xmlファイルの作り直し

補足情報(FW/ツールのバージョンなど)

xmlファイルのあるディレクトリはあっているはずなのに、ファイルがないというエラーが出てしまいます。完全に手詰まりです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1data = XML_preprocessor('C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション').data

のディレクトリ名の最後にパス区切りを付加して

python

1data = XML_preprocessor('C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション\').data

に変えて実行してください。


コメントを受けての追記:

このプログラムは、指定されたディレクトリにある複数のxmlファイルをpklファイルにまとめるプログラム、とのことでした。

ディレクトリの指定は、

python

1data = XML_preprocessor(ディレクトリパス).data

という形で行います。
処理対象のxmlファイルを見つけるために、プログラムの内部では次のようなプロセスで処理が進行します。

  1. ディレクトリパスで示されたディレクトリにあるファイルのファイル名をすべて取得する
  2. 取得されたファイル名のひとつひとつについて、ディレクトリパスとファイル名を結合する
  3. 結合の結果得られたファイルパスが示すファイルをxmlパーサに読み込む

ディレクトリパスとファイル名を結合する際には、単純に文字列の結合が使われています。
このため、例えばディレクトリパスに
'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション'
を指定した場合、そのディレクトリにあるファイル名 'example.xml' との結合の結果は、以下のようになります。

python

1>>> 'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション' + 'example.xml' 2使うデータ\お試しアノテーション' + 'example.xml' 3'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーションexample.xml'

「'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーションexample.xml'」というファイルパスが得られました。
この結果、「リンゴ検出に使うデータ」ディレクトリにある「お試しアノテーションexample.xml」という名前のファイルが探されることになり、そのようなファイルがないため、FileNotFoundErrorエラーとなります。

このような問題が生じていることは、エラーメッセージの最終行に示されているファイルパスを確認することによって推測できます。

sh

1FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーションLINE_ALBUM_%25E3%2582%258A%25E3%2582%2593%25E3%2581%2594_211011_53.xml'

ディレクトリパスの指定の際に、ディレクトリ名の最後にパス区切りを付加しておくことにより、

python

1>>> 'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション\' + 'example.xml' 2使うデータ\お試しアノテーション' + 'example.xml' 3'C:\Users\ユーザー名\Desktop\引継ぎ用\リンゴ検出システム\リンゴ検出に使うデータ\お試しアノテーション\example.xml'

以上のように正しいファイルパスが得られます。

私は、ディレクトリパスの指定の際に、最後にパス区切りを付加するかしないかによって、プログラムが正しく動いたり動かなかったりするこのようなプログラムは、プログラムとして問題があると考えます。
これからも長く使うプログラムであれば、プログラムを次のように修正しておくことをお勧めします。

python

1(前略) 2class XML_preprocessor(object): 3 4 def __init__(self, data_path): 5 self.path_prefix = data_path 6 self.num_classes = 1 7 self.data = dict() 8 self._preprocess_XML() 9 10 def _preprocess_XML(self): 11 filenames = os.listdir(self.path_prefix) 12 for filename in filenames: 13 #tree = ElementTree.parse(self.path_prefix + filename) # この1行を以下の1行に変更 14 tree = ElementTree.parse(os.path.join(self.path_prefix, filename)) 15 root = tree.getroot() 16(後略)

この変更により、ディレクトリパスの指定の最後にパス区切りがあってもなくても、プログラムが正しく動作するようになります。

投稿2021/11/05 13:22

編集2021/11/08 06:55
etherbeg

総合スコア1195

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

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

yokosawa123

2021/11/08 02:23

遅くなってしまい申し訳ございません。返信ありがとうございます。 最後にパス区切りを入れると、うまく実行されました! 最後にパス区切りを入れることによってうまく言った理由は何ですか?
etherbeg

2021/11/08 06:55

回答に追記しました。
yokosawa123

2021/11/09 01:17

とても分かりやすい解説、プログラムの変更もありがとうございます! とても速い対等に感謝してベストアンサーにさせていただきました。今後ともよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問