widerface数据库转voc2007数据集(python/matlab实现)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了widerface数据库转voc2007数据集(python/matlab实现)相关的知识,希望对你有一定的参考价值。

python实现基本需求,可以在此基础上修改

import h5py
from skimage import io
import shutil
import random

headstr = """<annotation>
    <folder>VOC2007</folder>
    <filename>%06d.jpg</filename>
    <source>
        <database>My Database</database>
        <annotation>PASCAL VOC2007</annotation>
        <image>flickr</image>
        <flickrid>NULL</flickrid>
    </source>
    <owner>
        <flickrid>NULL</flickrid>
        <name>facevise</name>
    </owner>
    <size>
        <width>%d</width>
        <height>%d</height>
        <depth>%d</depth>
    </size>
    <segmented>0</segmented>
"""
objstr = """    <object>
        <name>%s</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>%d</xmin>
            <ymin>%d</ymin>
            <xmax>%d</xmax>
            <ymax>%d</ymax>
        </bndbox>
    </object>
"""

tailstr =‘‘‘</annotation>
‘‘‘
def writexml(idx, head, objs, tail):
    filename = "Annotations/%06d.xml" % (idx)
    f = open(filename, "w")
    f.write(head)
    f.write(objs)
    f.write(tail)
    f.close()
    
def clear_dir():
    if shutil.os.path.exists(Annotations):
        shutil.rmtree(Annotations)
    if shutil.os.path.exists(ImageSets):
        shutil.rmtree(ImageSets)
    if shutil.os.path.exists(JPEGImages):
        shutil.rmtree(JPEGImages)
    
    shutil.os.mkdir(Annotations)
    shutil.os.makedirs(ImageSets/Main)
    shutil.os.mkdir(JPEGImages)
    
def excute_datasets(idx, datatype):
    f = open(ImageSets/Main/+datatype+.txt, a)
    mat = h5py.File(wider_face_split/wider_face_+datatype+.mat, r)
    file_list = mat[file_list][:]
    event_list = mat[event_list][:]
    bbx_list = mat[face_bbx_list][:]
    for i in range(file_list.size):        
        file_list_sub = mat[file_list[0,i]][:]
        bbx_list_sub = mat[bbx_list[0, i]][:]
        event_value = ‘‘.join(chr(x) for x in mat[event_list[0,i]][:])
        for j in range(file_list_sub.size):
            root = WIDER_+datatype+/images/+event_value+/
            filename = root + ‘‘.join([chr(x) for x in mat[file_list_sub[0, j]][:]])+.jpg
            im = io.imread(filename)
            head = headstr % (idx, im.shape[1], im.shape[0], im.shape[2])            
            bboxes = mat[bbx_list_sub[0, j]][:]
            objs = ‘‘.join([objstr % (face,                    bboxes[0,k],bboxes[1,k], bboxes[0,k]+bboxes[2,k]-1,bboxes[1,k]+bboxes[3,k]-1)                    for k in range(bboxes.shape[1])])
            writexml(idx, head, objs, tailstr)
            shutil.copyfile(filename, JPEGImages/%06d.jpg % (idx))
            f.write(%06d\n % (idx))
            idx +=1
    f.close()   
    return idx
#打乱样本    
def shuffle_file(filename):
    f = open(filename, r+)
    lines = f.readlines()
    random.shuffle(lines)
    f.seek(0)
    f.truncate()
    f.writelines(lines)
    f.close()
            
if __name__ == __main__:
    clear_dir()
    idx = 1
    idx = excute_datasets(idx, train)
    idx = excute_datasets(idx, val)

matlab实现

function WiderFace2VOC()
%% wider face
% The corresponding annotations are in the following format:
% Here, each face bounding boxe is denoted by:
% <x_left y_top width height>.

%% voc
% 000001.jpg car 44 28 132 121  
%前面是图片名,中间是目标类别,最后是目标的包围框坐标(左上角和右下角坐标)。

%% 
clc;
clear;
fclose all;
[~, ~, ~] = rmdir(Annotations, s);
[~, ~, ~] = rmdir(ImageSets, s);
[~, ~, ~] = rmdir(JPEGImages, s);

[~, ~, ~] = mkdir(Annotations);
[~, ~, ~] = mkdir(ImageSets/Main);
[~, ~, ~] = mkdir(JPEGImages);

train_root = WIDER_train/images;
split_file = wider_face_split/wider_face_train;
data = load(split_file);

headXml = fopen(head.xml, r);
headXmlFormat = fread(headXml, Inf, *char);
fclose(headXml);

objectXml = fopen(object.xml, r);
objectXmlFormat = fread(objectXml, Inf, *char);
fclose(objectXml);

tailXml = fopen(tail.xml, r);
tailXmlFormat = fread(tailXml, Inf, *char);
fclose(tailXml);

trainID =  fopen(ImageSets/Main/train.txt, w);
trainvalID =  fopen(ImageSets/Main/trainval.txt, w);
valID =  fopen(ImageSets/Main/val.txt, w);
testID =  fopen(ImageSets/Main/test.txt, w);

idx = 1;
for i=1:numel(data.event_list)
    for j=1:numel(data.file_list{i})
        imagename = fullfile(train_root, data.event_list{i}, strcat(data.file_list{i}{j}, .jpg));
        sz = size(imread(imagename));
        AnnotationsXml = fopen(sprintf(Annotations/%06d.xml, idx), w);
        fprintf(AnnotationsXml, headXmlFormat, idx, sz(2), sz(1),sz(3));
        for k = 1:size(data.face_bbx_list{i}{j}, 1)
            rc = data.face_bbx_list{i}{j}(k, :);
            rc = round([rc(1), rc(2), rc(1)+rc(3)-1, rc(2)+rc(4)-1]);
            fprintf(AnnotationsXml, objectXmlFormat, face, rc(1), rc(2), rc(3), rc(4));
        end
        fprintf(AnnotationsXml, tailXmlFormat);
        fprintf(trainID, %06d\n, idx);
        fprintf(trainvalID, %06d\n, idx);
        fclose(AnnotationsXml);
        copyfile(imagename, sprintf(JPEGImages/%06d.jpg, idx));
        idx = idx + 1;
    end  
    disp(i);
end

train_root = WIDER_val/images;
split_file = wider_face_split/wider_face_val;
data = load(split_file);

for i=1:numel(data.event_list)
    for j=1:numel(data.file_list{i})
        imagename = fullfile(train_root, data.event_list{i}, strcat(data.file_list{i}{j}, .jpg));
        sz = size(imread(imagename));
        AnnotationsXml = fopen(sprintf(Annotations/%06d.xml, idx), w);
        fprintf(AnnotationsXml, headXmlFormat, idx, sz(2), sz(1),sz(3));
        for k = 1:size(data.face_bbx_list{i}{j}, 1)
            rc = data.face_bbx_list{i}{j}(k, :);
            rc = round([rc(1), rc(2), rc(1)+rc(3)-1, rc(2)+rc(4)-1]);
            fprintf(AnnotationsXml, objectXmlFormat, face, rc(1), rc(2), rc(3), rc(4));
        end
        fprintf(AnnotationsXml, tailXmlFormat);
        if mod(idx, 2)
            fprintf(valID, %06d\n, idx);
            fprintf(trainvalID, %06d\n, idx);
        else
            fprintf(testID, %06d\n, idx);
        end
        fclose(AnnotationsXml);
        copyfile(imagename, sprintf(JPEGImages/%06d.jpg, idx));
        idx = idx+1;
    end        
    disp(i);
end
fclose(trainID);
fclose(trainvalID);
fclose(valID);
fclose(testID);
fclose all;

以上是关于widerface数据库转voc2007数据集(python/matlab实现)的主要内容,如果未能解决你的问题,请参考以下文章

VOC2007数据集详细分析

使用Python将DOTA数据集的格式转换成VOC2007数据集的格式

使用Python将DOTA数据集的格式转换成VOC2007数据集的格式

使用Python将DOTA数据集的格式转换成VOC2007数据集的的格式

使用Python将NWPU VHR-10数据集的格式转换成VOC2007数据集的格式

使用Python将NWPU VHR-10数据集的格式转换成VOC2007数据集的的格式