Created
April 24, 2019 18:42
-
-
Save kalyco/55b8fa3b8ea98b5f013621c682ffa5a2 to your computer and use it in GitHub Desktop.
BBox to YOLO Annotation File Converter
This file contains 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
# -*- coding: utf-8 -*- | |
""" | |
Created on Wed Dec 9 14:55:43 2015 | |
This script is to convert the txt annotation files to appropriate format needed by YOLO | |
@author: Guanghan Ning | |
Email: gnxr9@mail.missouri.edu | |
""" | |
import os | |
from os import walk, getcwd | |
from PIL import Image | |
classes = ["mfp"] | |
def convert(size, box): | |
dw = 1./size[0] | |
dh = 1./size[1] | |
x = (box[0] + box[1])/2.0 | |
y = (box[2] + box[3])/2.0 | |
w = box[1] - box[0] | |
h = box[3] - box[2] | |
x = x*dw | |
w = w*dw | |
y = y*dh | |
h = h*dh | |
return (x,y,w,h) | |
"""-------------------------------------------------------------------""" | |
""" Configure Paths""" | |
mypath = "Labels/001/" | |
outpath = "DarknetLabels/001/" | |
cls = "mfp" | |
if cls not in classes: | |
exit(0) | |
cls_id = classes.index(cls) | |
wd = getcwd() | |
list_file = open('%s/%s_list.txt'%(wd, cls), 'w') | |
""" Get input text file list """ | |
txt_name_list = [] | |
for (dirpath, dirnames, filenames) in walk(mypath): | |
txt_name_list.extend(filenames) | |
break | |
print(txt_name_list) | |
""" Process """ | |
for txt_name in txt_name_list: | |
# txt_file = open("Labels/stop_sign/001.txt", "r") | |
""" Open input text files """ | |
txt_path = mypath + txt_name | |
print("Input:" + txt_path) | |
txt_file = open(txt_path, "r") | |
lines = txt_file.read().split('\r\n') #for ubuntu, use "\r\n" instead of "\n" | |
""" Open output text files """ | |
txt_outpath = outpath + txt_name | |
print("Output:" + txt_outpath) | |
txt_outfile = open(txt_outpath, "w") | |
""" Convert the data to YOLO format """ | |
ct = 0 | |
for line in lines: | |
#print('lenth of line is: ') | |
#print(len(line)) | |
#print('\n') | |
if(len(line) >= 2): | |
ct = ct + 1 | |
print("lines") | |
elems = line.split("\n")[1].split(" ") | |
print(len(line)) | |
print("elems:") | |
print(elems) | |
xmin = elems[0] | |
xmax = elems[2] | |
ymin = elems[1] | |
ymax = elems[3] | |
print([xmin, xmax, ymin, ymax]) | |
# | |
img_path = str('%s/images/%s/%s.JPEG'%(wd, cls, os.path.splitext(txt_name)[0])) | |
#t = magic.from_file(img_path) | |
#wh= re.search('(\d+) x (\d+)', t).groups() | |
im=Image.open(img_path) | |
w= int(im.size[0]) | |
h= int(im.size[1]) | |
#w = int(xmax) - int(xmin) | |
#h = int(ymax) - int(ymin) | |
# print(xmin) | |
print(w, h) | |
b = (float(xmin), float(xmax), float(ymin), float(ymax)) | |
bb = convert((w,h), b) | |
print(bb) | |
txt_outfile.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') | |
""" Save those images with bb into list""" | |
if(ct != 0): | |
list_file.write('%s/images/%s/%s.JPEG\n'%(wd, cls, os.path.splitext(txt_name)[0])) | |
list_file.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment