欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

yolov4在WIDERFACE中训练进行人脸检测、修改WIDERFACE标注格式

程序员文章站 2022-03-20 23:36:23
...

1、简介

WIDERFACE是香港中文大学资讯工程学系 多媒体实验室 发布的人脸数据集
下载连接

2、标注格式

其有两种标注格式.mat与.txt。由于我只能打开.txt文件。其内容如下

0--Parade/0_Parade_marchingband_1_849.jpg
1
449 330 122 149 0 0 0 0 0 0 
0--Parade/0_Parade_Parade_0_904.jpg
1
361 98 263 339 0 0 0 0 0 0 
0--Parade/0_Parade_marchingband_1_799.jpg
21
78 221 7 8 2 0 0 0 0 0 
78 238 14 17 2 0 0 0 0 0 
113 212 11 15 2 0 0 0 0 0 
134 260 15 15 2 0 0 0 0 0 
163 250 14 17 2 0 0 0 0 0 
201 218 10 12 2 0 0 0 0 0 
182 266 15 17 2 0 0 0 0 0 
245 279 18 15 2 0 0 0 0 0 
304 265 16 17 2 0 0 0 2 1 
328 295 16 20 2 0 0 0 0 0 
389 281 17 19 2 0 0 0 2 0 
406 293 21 21 2 0 1 0 0 0 
436 290 22 17 2 0 0 0 0 0 
522 328 21 18 2 0 1 0 0 0 
643 320 23 22 2 0 0 0 0 0 
653 224 17 25 2 0 0 0 0 0 
793 337 23 30 2 0 0 0 0 0 
535 311 16 17 2 0 0 0 1 0 
29 220 11 15 2 0 0 0 0 0 
3 232 11 15 2 0 0 0 2 0 
20 215 12 16 2 0 0 0 2 0 

分别代表

File name
Number of bounding box
x1, y1, w, h, blur, expression, illumination, invalid, occlusion, pose

3、 格式改变

yolov4训练人头检测器 中表述了如何把xml数据格式改为yolov4使用的voc格式。因此这里我们只要把.txt文件改为单个的xml文件。然后利用yolov4训练人头检测器 中的方法进行转换就好。
.txt转xml脚本如下

3.1 生成xml脚本

def make_xml(figname, width, height, boxlist):

    node_root = Element('annotation')

    node_folder = SubElement(node_root, 'folder')
    node_folder.text = 'VOC'

    node_filename = SubElement(node_root, 'filename')
    node_filename.text = figname

    node_object_num = SubElement(node_root, 'object_num')
    node_object_num.text = str(len(boxlist))

    node_size = SubElement(node_root, 'size')
    node_width = SubElement(node_size, 'width')
    node_width.text = str(width)

    node_height = SubElement(node_size, 'height')
    node_height.text = str(height)

    node_depth = SubElement(node_size, 'depth')
    node_depth.text = '3'

    for box in boxlist:
        node_object = SubElement(node_root, 'object')
        node_name = SubElement(node_object, 'name')
        node_name.text = 'face'
        node_difficult = SubElement(node_object, 'difficult')
        node_difficult.text = '0'

        node_bndbox = SubElement(node_object, 'bndbox')
        node_xmin = SubElement(node_bndbox, 'xmin')
        node_xmin.text = str(box['xmin'])
        node_ymin = SubElement(node_bndbox, 'ymin')
        node_ymin.text = str(box['ymin'])
        node_xmax = SubElement(node_bndbox, 'xmax')
        node_xmax.text = str(box['xmax'])
        node_ymax = SubElement(node_bndbox, 'ymax')
        node_ymax.text = str(box['ymax'])

    #print xml 打印查看结果
    tree = etree.ElementTree(node_root)
    tree.write("./"+figname.split(".")[0]+'.xml', pretty_print=True, xml_declaration=False, encoding='utf-8')
    return

3.2 读取txt文件分离图片信息

def readTxt(path):
    f = open(path,"r")
    lines = f.readlines()
    dadeList=[]
    data={}
    boxlist=[]
    flg = False
    numflg = False
    num=0
    flgnum=0
    for line in lines:
        # print("line:",line)
        if '.jpg' in line:
            tem1 = line.split("/")
            # imagrnamepath = "./images/"+tem1[1]
            imagrname = line.split("/")[1]
            # print("imagrname:",imagrname)
            path = "./images/"+imagrname.split(".")[0]+".jpg"
            # print("path:",path)
            img = cv2.imread(path)
            HW = img.shape
            print("HW:",HW)
            flg=True
            flgnum=0
            # print("imagrnamepath:",imagrnamepath)
            # HW = getHW(imagrnamepath)
            data['imagename'] = imagrname.split(".")[0]+".jpg"
            data['height'] = HW[0]
            data['width'] = HW[1]
        elif flg:
            num = int(line)
            numflg=True
            flgnum=0
            flg=False
        elif numflg:
            flg = False
            labes = line.split()
            # print("labes:",labes)
            if int(labes[8])==2:
                print("abbeng")
                flgnum =flgnum+1
                if flgnum == num:
                    data['boxlist'] = boxlist
                    dadeList.append(data)
                    boxlist=[]
                    data={}
                    flg=False
                    numflg = False
                continue
            temdata={}
            temdata['xmin'] = int(labes[0]) - (int(labes[2])/2)
            temdata['xmax'] = int(labes[0]) + (int(labes[2])/2)
            temdata['ymin'] = int(labes[1]) - (int(labes[3])/2)
            temdata['ymax'] = int(labes[1]) + (int(labes[3])/2)
            boxlist.append(temdata)
            flgnum =flgnum+1
            if flgnum == num:
                data['boxlist'] = boxlist
                dadeList.append(data)
                boxlist=[]
                data={}
                flg=False
                numflg = False

    return dadeList

完整脚本