PRW 有两个版本,有一个分了测试集和训练集但是标签是mat 类型,还有一个标签是txt 类型但是没分测试集和训练集。为了对比效果,我把原始的mat 类型的变成了txt 类型的。
这是PRW的目录结构,frame_test.mat 存放的是所有测试集的文件名,annotations存放的是所有的图片的标签包括训练集和测试集。
值得注意的一点,这里标签的point是左上角的点不是中心点
import os
import numpy
import shutil
from scipy.io import loadmat
from tqdm import tqdm
import os.path as osp
from PIL import Image
datasetdir = "E:/workspace/dataset/PRW-v16.04.20/PRW-v16.04.20"
dstdir = "E:/workspace/dataset/PRW_yolo"
imgsrc = osp.join(datasetdir,"frames")
labelsrc = osp.join(datasetdir,"annotations")
trainmat =loadmat( osp.join(datasetdir,"frame_train.mat"))
trainfn = trainmat["img_index_train"]
testmat =loadmat( osp.join(datasetdir,"frame_test.mat"))
testfn = testmat["img_index_test"]
imgtrain = osp.join(dstdir,"images/train")
lable_train = osp.join(dstdir,"labels/train")
imgtest = osp.join(dstdir,"images/val")
lable_test = osp.join(dstdir,"labels/val")
os.makedirs(imgtest,exist_ok=True)
os.makedirs(lable_test,exist_ok=True)
os.makedirs(imgtrain,exist_ok=True)
os.makedirs(lable_train,exist_ok=True)
def convert(imagenames, dstimgdir,dstlabledir):
for fn in tqdm(imagenames):
fn = fn[0][0]
fnimg = fn + ".jpg"
shutil.copy(osp.join(imgsrc,fnimg),
osp.join(dstimgdir,fnimg)
)
img = Image.open(osp.join(imgsrc,fnimg))
h = img.height
w = img.width
fnlabel = fn + ".jpg.mat"
mat = loadmat(osp.join(labelsrc,fnlabel))
keys = list(mat.keys())
key = keys[-1]
f = open(osp.join(dstlabledir, fn+".txt"), "w", encoding="utf-8")
lables = mat[key]
for label in lables:
pointx_p = float(label[-4]) / w
pointy_p = float(label[-3]) / h
w_p = float(label[-2]) / w
h_p = float(label[-1]) / h
f.write("0 " + str(pointx_p + w_p/2) + " " + str(pointy_p + h_p/2) + " "
+ str(w_p) + " " + str(h_p) + "\n")
f.close()
convert(testfn,imgtest,lable_test)
convert(trainfn,imgtrain,lable_train)
最后的目录结构张这样