Created
April 19, 2020 15:03
-
-
Save gunaytemur/f1ff94e9248ce38bce4a385d1d1e70a2 to your computer and use it in GitHub Desktop.
python code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@goodhamgupta citation has been corrected. | |
#Script to convert yolo annotations to voc format | |
import os | |
import xml.etree.cElementTree as ET | |
from PIL import Image | |
ANNOTATIONS_DIR_PREFIX = "data" | |
DESTINATION_DIR = "converted_labels" | |
CLASS_MAPPING = { | |
'0': 'name' | |
# Add your remaining classes here. | |
} | |
def create_root(file_prefix, width, height): | |
root = ET.Element("annotation") | |
ET.SubElement(root, "folder").text = "converted_labels" | |
ET.SubElement(root, "filename").text = "{}.jpg".format(file_prefix) | |
ET.SubElement(root, "path").text = "D:\PycharmProjects\convert\converted_labels\{}.jpg".format(file_prefix) | |
source = ET.SubElement(root, "source") | |
ET.SubElement(source, "database").text = "Unknown" | |
size = ET.SubElement(root, "size") | |
ET.SubElement(size, "width").text = str(width) | |
ET.SubElement(size, "height").text = str(height) | |
ET.SubElement(size, "depth").text = "3" | |
ET.SubElement(root, "segmented").text = "0" | |
return root | |
def create_object_annotation(root, voc_labels): | |
for voc_label in voc_labels: | |
obj = ET.SubElement(root, "object") | |
ET.SubElement(obj, "name").text=str(voc_label[0]) | |
ET.SubElement(obj, "pose").text = "Unspecified" | |
ET.SubElement(obj, "truncated").text = str(0) | |
ET.SubElement(obj, "difficult").text = str(0) | |
bbox = ET.SubElement(obj, "bndbox") | |
ET.SubElement(bbox, "xmin").text = str(voc_label[1]) | |
ET.SubElement(bbox, "ymin").text = str(voc_label[2]) | |
ET.SubElement(bbox, "xmax").text = str(voc_label[3]) | |
ET.SubElement(bbox, "ymax").text = str(voc_label[4]) | |
return root | |
def create_file(file_prefix, width, height, voc_labels): | |
root = create_root(file_prefix, width, height) | |
root = create_object_annotation(root, voc_labels) | |
tree = ET.ElementTree(root) | |
tree.write("{}/{}.xml".format(DESTINATION_DIR, file_prefix)) | |
def read_file(file_path): | |
file_prefix = file_path.split(".txt")[0] | |
image_file_name = "{}.jpg".format(file_prefix) | |
img = Image.open("{}/{}".format("data", image_file_name)) | |
w, h = img.size | |
with open(os.path.join(ANNOTATIONS_DIR_PREFIX,file_path), 'r') as file: | |
lines = file.readlines() | |
voc_labels = [] | |
for line in lines: | |
voc = [] | |
line = line.strip() | |
data = line.split() | |
CLASS_MAPPING.get(data[0]) | |
a = int(data[0]) | |
if a == 0: | |
voc.append("al") | |
else: | |
voc.append("sat") | |
bbox_width = float(data[3]) * w | |
bbox_height = float(data[4]) * h | |
center_x = float(data[1]) * w | |
center_y = float(data[2]) * h | |
voc.append(round(center_x - (bbox_width / 2))) | |
voc.append(round(center_y - (bbox_height / 2))) | |
voc.append(round(center_x + (bbox_width / 2))) | |
voc.append(round(center_y + (bbox_height / 2))) | |
voc_labels.append(voc) | |
create_file(file_prefix, w, h, voc_labels) | |
print("Processing complete for file: {}".format(file_path)) | |
def start(): | |
if not os.path.exists(DESTINATION_DIR): | |
os.makedirs(DESTINATION_DIR) | |
for filename in os.listdir(ANNOTATIONS_DIR_PREFIX): | |
if filename.endswith('txt'): | |
read_file(filename) | |
else: | |
print("Skipping file: {}".format(filename)) | |
if __name__ == "__main__": | |
start() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment