CelebA数据集转成VOC格式

CelebA数据集转成VOC格式

CelebA数据集转成VOC格式

首先要做的是信息的提取,将CelebA数据集中的label信息提取出来,这里主要需要的是人脸的位置信息也就是list_bbox_celeba.txt文档中的内容。输出bbox 的四个数值以及图像的名称。

def loadgt():
    imgpaths=[]
    bboxes=[]
    with open(bboxpath) as bboxfile:
        lines=bboxfile.readlines()
        lines=lines[2:]
        for line in lines:
            bboxline=line.split()
            imgpath=bboxline[0]
            imgpaths.append(imgpath)
            bboxline=bboxline[1:]
            bbox=[int(bb) for bb in bboxline]
            bboxes.append(bbox)
    return imgpaths,bboxes

接着,需要完成.xml文件格式的书写。

def writexml(filename, saveimg, bboxes, xmlpath):
    doc = Document()
 
    annotation = doc.createElement('annotation')
 
    doc.appendChild(annotation)
 
    folder = doc.createElement('folder')
 
    folder_name = doc.createTextNode('widerface')
    folder.appendChild(folder_name)
    annotation.appendChild(folder)
    filenamenode = doc.createElement('filename')
    filename_name = doc.createTextNode(filename)
    filenamenode.appendChild(filename_name)
    annotation.appendChild(filenamenode)
    
    source = doc.createElement('source')
    annotation.appendChild(source)
    
    database = doc.createElement('database')
    database.appendChild(doc.createTextNode('CelebA Database'))
    source.appendChild(database)
    
    annotation_s = doc.createElement('annotation')
    annotation_s.appendChild(doc.createTextNode('PASCAL VOC2007'))
    source.appendChild(annotation_s)
    
    image = doc.createElement('image')
    image.appendChild(doc.createTextNode('flickr'))
    source.appendChild(image)
    
    flickrid = doc.createElement('flickrid')
    flickrid.appendChild(doc.createTextNode('-1'))
    source.appendChild(flickrid)
    
    owner = doc.createElement('owner')
    annotation.appendChild(owner)
    
    flickrid_o = doc.createElement('flickrid')
    flickrid_o.appendChild(doc.createTextNode('hudazhi'))
    owner.appendChild(flickrid_o)
    
    name_o = doc.createElement('name')
    name_o.appendChild(doc.createTextNode('hudazhi'))
    owner.appendChild(name_o)
 
    size = doc.createElement('size')
    annotation.appendChild(size)
 
    width = doc.createElement('width')
    width.appendChild(doc.createTextNode(str(saveimg.shape[1])))
    height = doc.createElement('height')
    height.appendChild(doc.createTextNode(str(saveimg.shape[0])))
    depth = doc.createElement('depth')
    depth.appendChild(doc.createTextNode(str(saveimg.shape[2])))
 
    size.appendChild(width)
    size.appendChild(height)
    size.appendChild(depth)
    
    segmented = doc.createElement('segmented')
    segmented.appendChild(doc.createTextNode('0'))
    annotation.appendChild(segmented)
    
    for i in range(1):
        # bbox = bboxes[i]
        objects = doc.createElement('object')
        annotation.appendChild(objects)
        object_name = doc.createElement('name')
        object_name.appendChild(doc.createTextNode('face'))
        objects.appendChild(object_name)
        pose = doc.createElement('pose')
        pose.appendChild(doc.createTextNode('Unspecified'))
        objects.appendChild(pose)
        truncated = doc.createElement('truncated')
        truncated.appendChild(doc.createTextNode('0'))
        objects.appendChild(truncated)
        difficult = doc.createElement('difficult')
        difficult.appendChild(doc.createTextNode('0'))
        objects.appendChild(difficult)
        bndbox = doc.createElement('bndbox')
        objects.appendChild(bndbox)
        xmin = doc.createElement('xmin')
        xmin.appendChild(doc.createTextNode(str(bboxes[0])))
        bndbox.appendChild(xmin)
        ymin = doc.createElement('ymin')
        ymin.appendChild(doc.createTextNode(str(bboxes[1])))
        bndbox.appendChild(ymin)
        xmax = doc.createElement('xmax')
        xmax.appendChild(doc.createTextNode(str(bboxes[0] + bboxes[2])))
        bndbox.appendChild(xmax)
        ymax = doc.createElement('ymax')
        ymax.appendChild(doc.createTextNode(str(bboxes[1] + bboxes[3])))
        bndbox.appendChild(ymax)
    f = open(xmlpath, "w")
    f.write(doc.toprettyxml(indent=''))
    f.close()

最后将bbox中的内容写入.xml文件中。

rootdir = 'D:/Download/test/'
imgdir = rootdir+'images'
bboxpath=rootdir+"list_bbox_celeba.txt"
vocannotationdir=rootdir+"Annotations/"

imgpaths,bboxes = loadgt()
# print(imgpaths)

for i in range(len(imgpaths)):
    filename = imgpaths[i]
    print(filename)
    img = cv2.imread(imgdir+'/'+filename)
    bbox = bboxes[i]
    xmlpath = vocannotationdir + filename+'.xml'
    writexml(filename, img, bbox, xmlpath)

这样整个工作就算完成了。
完整代码如下:

@author: hudazhi
"""

import os,cv2,numpy
 
from xml.dom.minidom import Document


def writexml(filename, saveimg, bboxes, xmlpath):
    doc = Document()
 
    annotation = doc.createElement('annotation')
 
    doc.appendChild(annotation)
 
    folder = doc.createElement('folder')
 
    folder_name = doc.createTextNode('CelebA')
    folder.appendChild(folder_name)
    annotation.appendChild(folder)
    filenamenode = doc.createElement('filename')
    filename_name = doc.createTextNode(filename)
    filenamenode.appendChild(filename_name)
    annotation.appendChild(filenamenode)
    
    source = doc.createElement('source')
    annotation.appendChild(source)
    
    database = doc.createElement('database')
    database.appendChild(doc.createTextNode('CelebA Database'))
    source.appendChild(database)
    
    annotation_s = doc.createElement('annotation')
    annotation_s.appendChild(doc.createTextNode('PASCAL VOC2007'))
    source.appendChild(annotation_s)
    
    image = doc.createElement('image')
    image.appendChild(doc.createTextNode('flickr'))
    source.appendChild(image)
    
    flickrid = doc.createElement('flickrid')
    flickrid.appendChild(doc.createTextNode('-1'))
    source.appendChild(flickrid)
    
    owner = doc.createElement('owner')
    annotation.appendChild(owner)
    
    flickrid_o = doc.createElement('flickrid')
    flickrid_o.appendChild(doc.createTextNode('hudazhi'))
    owner.appendChild(flickrid_o)
    
    name_o = doc.createElement('name')
    name_o.appendChild(doc.createTextNode('hudazhi'))
    owner.appendChild(name_o)
 
    size = doc.createElement('size')
    annotation.appendChild(size)
 
    width = doc.createElement('width')
    width.appendChild(doc.createTextNode(str(saveimg.shape[1])))
    height = doc.createElement('height')
    height.appendChild(doc.createTextNode(str(saveimg.shape[0])))
    depth = doc.createElement('depth')
    depth.appendChild(doc.createTextNode(str(saveimg.shape[2])))
 
    size.appendChild(width)
    size.appendChild(height)
    size.appendChild(depth)
    
    segmented = doc.createElement('segmented')
    segmented.appendChild(doc.createTextNode('0'))
    annotation.appendChild(segmented)
    
    for i in range(1):
        # bbox = bboxes[i]
        objects = doc.createElement('object')
        annotation.appendChild(objects)
        object_name = doc.createElement('name')
        object_name.appendChild(doc.createTextNode('face'))
        objects.appendChild(object_name)
        pose = doc.createElement('pose')
        pose.appendChild(doc.createTextNode('Unspecified'))
        objects.appendChild(pose)
        truncated = doc.createElement('truncated')
        truncated.appendChild(doc.createTextNode('0'))
        objects.appendChild(truncated)
        difficult = doc.createElement('difficult')
        difficult.appendChild(doc.createTextNode('0'))
        objects.appendChild(difficult)
        bndbox = doc.createElement('bndbox')
        objects.appendChild(bndbox)
        xmin = doc.createElement('xmin')
        xmin.appendChild(doc.createTextNode(str(bboxes[0])))
        bndbox.appendChild(xmin)
        ymin = doc.createElement('ymin')
        ymin.appendChild(doc.createTextNode(str(bboxes[1])))
        bndbox.appendChild(ymin)
        xmax = doc.createElement('xmax')
        xmax.appendChild(doc.createTextNode(str(bboxes[0] + bboxes[2])))
        bndbox.appendChild(xmax)
        ymax = doc.createElement('ymax')
        ymax.appendChild(doc.createTextNode(str(bboxes[1] + bboxes[3])))
        bndbox.appendChild(ymax)
    f = open(xmlpath, "w")
    f.write(doc.toprettyxml(indent=''))
    f.close()
    
def loadgt():
    imgpaths=[]
    bboxes=[]
    with open(bboxpath) as bboxfile:
        lines=bboxfile.readlines()
        lines=lines[2:]
        for line in lines:
            bboxline=line.split()
            imgpath=bboxline[0]
            imgpaths.append(imgpath)
            bboxline=bboxline[1:]
            bbox=[int(bb) for bb in bboxline]
            bboxes.append(bbox)
    return imgpaths,bboxes

rootdir = 'D:/Download/test/'
imgdir = rootdir+'images'
bboxpath=rootdir+"list_bbox_celeba.txt"
vocannotationdir=rootdir+"Annotations/"

imgpaths,bboxes = loadgt()
# print(imgpaths)

for i in range(len(imgpaths)):
    filename = imgpaths[i]
    print(filename)
    img = cv2.imread(imgdir+'/'+filename)
    bbox = bboxes[i]
    xmlpath = vocannotationdir + filename+'.xml'
    writexml(filename, img, bbox, xmlpath)

参考文档

[1] https://blog.csdn.net/minstyrain/article/details/77888176
[2] https://blog.csdn.net/minstyrain/article/details/77986262

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值