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

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

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

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

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

Q&A

0回答

1103閲覧

.xmlからYOLO(.txt)に変換がうまくいかない

hona_tan

総合スコア45

XML

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

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

0グッド

0クリップ

投稿2022/10/27 07:37

編集2022/11/02 06:51

YOLOv5の物体検出をしたいため、アノテーションファイル変換を参考に.xmlから.txtに変換を試みています。

traffic_format4yoloにYOLO形式の.txtは出力されたのですが、中身が入っておらず空です。
サイト通りにしてエラーも出ていないので、なにがいけないのか分かりません。
アドバイスいただけると嬉しいです。

#!/usr/bin/env python # -*- coding: utf8 -*- import os import sys from xml.etree import ElementTree from xml.etree.ElementTree import Element, SubElement from lxml import etree import codecs import cv2 from glob import glob import re XML_EXT = '.xml' ENCODE_METHOD = 'utf-8' class PascalVocReader: def __init__(self, filepath): # shapes type: # [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult] self.shapes = [] self.filepath = filepath self.verified = False def getShapes(self): return self.shapes def addShape(self, label, bndbox, filename, difficult): xmin = int(bndbox.find('xmin').text) ymin = int(bndbox.find('ymin').text) xmax = int(bndbox.find('xmax').text) ymax = int(bndbox.find('ymax').text) points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)] self.shapes.append((label, points, filename, difficult)) def parseXML(self): assert self.filepath.endswith(XML_EXT), "Unsupport file format" parser = etree.XMLParser(encoding=ENCODE_METHOD) xmltree = ElementTree.parse(self.filepath, parser=parser).getroot() filename = xmltree.find('filename').text path = xmltree.find('path').text for object_iter in xmltree.findall('object'): bndbox = object_iter.find("bndbox") label = object_iter.find('name').text # Add chris difficult = False if object_iter.find('difficult') is not None: difficult = bool(int(object_iter.find('difficult').text)) self.addShape(label, bndbox, path, difficult) return True classes = dict() num_classes = 0 parentpath = './' #"Directory path with parent dir before xml_dir or img_dir" addxmlpath = parentpath + 'traffic_label/20170271403' #"Directory path with XML files" addimgpath = parentpath + 'traffic_img/20170271403' #"Directory path with IMG files" outputpath = parentpath + 'traffic_format4yolo' #"output folder for yolo format" classes_txt = './traffic_classes.txt' #"File containing classes" ext = '.JPG' #"Image file extension [.jpg or .png]" if os.path.isfile(classes_txt): with open(classes_txt, "r") as f: class_list = f.read().strip().split() classes = {k : v for (v, k) in enumerate(class_list)} xmlPaths = glob(addxmlpath + "/*.xml") print(xmlPaths) #imgPaths = glob(addimgpath + "/*"+ext) # file = glob.glob('/Users/isl/Desktop/xml2yolo-master - コピー/traffic_labe/20170271403/*.xml') for xmlPath in xmlPaths: tVocParseReader = PascalVocReader(xmlPath) shapes = tVocParseReader.getShapes() with open(outputpath + "/" + os.path.basename(xmlPath)[:-4] + ".txt", "w") as f: for shape in shapes: class_name = shape[0] box = shape[1] #filename = os.path.splittext(xmlPath)[0] + ext filename = os.path.splitext(addimgpath + "/" + os.path.basename(xmlPath)[:-4])[0] + ext if class_name not in classes.keys(): classes[class_name] = num_classes num_classes += 1 class_idx = classes[class_name] (height, width, _) = cv2.imread(filename).shape coord_min = box[0] coord_max = box[2] xcen = float((coord_min[0] + coord_max[0])) / 2 / width ycen = float((coord_min[1] + coord_max[1])) / 2 / height w = float((coord_max[0] - coord_min[0])) / width h = float((coord_max[1] - coord_min[1])) / height f.write("%d %.06f %.06f %.06f %.06f\n" % (class_idx, xcen, ycen, w, h)) print(class_idx, xcen, ycen, w, h) with open(parentpath + "classes.txt", "w") as f: for key in classes.keys(): f.write("%s\n" % key) print(key)
<?xml version="1.0"?> -<annotation>  <folder>アノテーション</folder>  <filename>vegetable(1).JPG</filename>  <path>C:\Users\isl\.spyder-py3\アノテーション\vegetable(1).JPG</path>  -<source>   <database>Unknown</database>  </source>  -<size>   <width>661</width>   <height>838</height>   <depth>3</depth>  </size>  <segmented>0</segmented>  -<object>   <name>beans</name>   <pose>Unspecified</pose>   <truncated>0</truncated>   <difficult>0</difficult>   -<bndbox>    <xmin>43</xmin>    <ymin>199</ymin>    <xmax>511</xmax>    <ymax>755</ymax>   </bndbox>  </object> </annotation>

Windows、Anaconda

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問