Lorsque j'essaie de détecter un objet avec tensorflow en utilisant yolo, les données sont souvent au format xml et ne peuvent pas être appliquées à yolo. Alors faisons-le nous-mêmes.
import xml.etree.ElementTree as ET
import sys , os
import glob
cate_list = ["Car","Pedestrian","Truck","Signal","Signs","Bicycle","Motorbike","Bus","SVehicle","Train"]
with open("voc_classes.txt","w") as f:
f.write('\n'.join(cate_list))
def class_encord(class_name):
cate_id = {"Car":0,"Pedestrian":1,"Truck":2,"Signal":3,"Signs":4,"Bicycle":5,"Motorbike":6,"Bus":7,"SVehicle":8,"Train":9}
return cate_id[class_name]
def convert(data_file,list_file):
in_file = open(data_file)
tree = ET.parse(in_file)
root = tree.getroot()
for obj in root.iter("item"):
cate = obj.find("category").text
cate = cate.lstrip("\n").lstrip(" ")
cate = cate.rstrip(" ").rstrip("\n")
category_id = class_encord(cate)
xmlbox = obj.find("box2d")
data = [int(float(xmlbox.find("x1").text)),int(float(xmlbox.find("x2").text)),int(float(xmlbox.find("y1").text)),int(float(xmlbox.find("y2").text))]
list_file.write(" " + ",".join([str(a) for a in data]) + "," + str(category_id))
data_file_list = glob.glob("Annotations/*.xml")
list_file = open("2007_train.txt","w")
for data_file in data_file_list:
jpg_file = "train_" + data_file.rstrip(".xml") + ".jpg "
list_file.write(jpg_file)
convert(data_file,list_file)
list_file.write("\n")
list_file.close()
Ce n'est pas généralisé, donc c'est très difficile à voir (; ^ ω ^) Je vais lister les paramètres qui peuvent être utilisés en le modifiant
yolo utilise txt avec l'objet, donc affichez-le.
cate_list = ["Car","Pedestrian","Truck","Signal","Signs","Bicycle","Motorbike","Bus","SVehicle","Train"]
with open("voc_classes.txt","w") as f:
f.write('\n'.join(cate_list))
Une fonction pour encoder le nom et l'id de l'objet.
def class_encord(class_name):
cate_id = {"Car":0,"Pedestrian":1,"Truck":2,"Signal":3,"Signs":4,"Bicycle":5,"Motorbike":6,"Bus":7,"SVehicle":8,"Train":9}
return cate_id[class_name]
Une fonction qui convertit les données xml en un fichier txt. Ce que vous faites est aussi simple que de lire avec tml.etree.ElementTree, de récupérer et d'écrire chaque donnée.
def convert(data_file,list_file):
in_file = open(data_file)
tree = ET.parse(in_file)
root = tree.getroot()
for obj in root.iter("item"):
cate = obj.find("category").text
cate = cate.lstrip("\n").lstrip(" ")
cate = cate.rstrip(" ").rstrip("\n")
category_id = class_encord(cate)
xmlbox = obj.find("box2d")
data = [int(float(xmlbox.find("x1").text)),int(float(xmlbox.find("x2").text)),int(float(xmlbox.find("y1").text)),int(float(xmlbox.find("y2").text))]
list_file.write(" " + ",".join([str(a) for a in data]) + "," + str(category_id))
Il ne reste plus qu'à le faire.
data_file_list = glob.glob("Annotations/*.xml")
list_file = open("2007_train.txt","w")
for data_file in data_file_list:
jpg_file = "train_" + data_file.rstrip(".xml") + ".jpg "
list_file.write(jpg_file)
convert(data_file,list_file)
list_file.write("\n")
list_file.close()
La détection d'objets est intéressante (^ ▽ ^) L'organisation des données est difficile.
Recommended Posts