TF项目实战(基于SSD目标检测)——人脸检测2

数据转化为VOC格式:

一、我们先看 VOC格式的数据是什么???

Annotations:存放xml  包括 文件夹信息   图片名称、 图片尺寸信息、 图片中object的信息。
JPEGImages:   存放图片

二、分析Wider FACE数据集:

数据集中的txt中信息为:第一行: 图片路径第二行:多少个人脸第三行:bbox信息   存储的左上角 坐标 和 高度宽度
三、代码转换:
  1 import os,cv2,sys,shutil
  2
  3 from xml.dom.minidom import Document
  4
  5 def writexml(filename,saveimg,bboxes,xmlpath,typename):
  6     #xml打包的函数,我们不需要知道内部做了什么。
  7     #我们只需要将图片名称   图片信息   bbox信息    最终存储信息 作为参数 就可以了
  8     #不需要做修改
  9
 10     doc = Document()                                #定义文件对象
 11     annotation = doc.createElement(‘annotation‘)  #创建根节点
 12     doc.appendChild(annotation)    #存放在doc中
 13     # 定义annotation 的子节点
 14     folder = doc.createElement(‘folder‘)
 15
 16     folder_name = doc.createTextNode(‘widerface‘)
 17     folder.appendChild(folder_name)
 18     annotation.appendChild(folder)
 19     filenamenode = doc.createElement(‘filename‘)
 20     filename_name = doc.createTextNode(filename)
 21     filenamenode.appendChild(filename_name)
 22     annotation.appendChild(filenamenode)
 23     source = doc.createElement(‘source‘)
 24     annotation.appendChild(source)
 25     database = doc.createElement(‘database‘)
 26     database.appendChild(doc.createTextNode(‘wider face Database‘))
 27     source.appendChild(database)
 28     annotation_s = doc.createElement(‘annotation‘)
 29     annotation_s.appendChild(doc.createTextNode(‘PASCAL VOC2007‘))
 30     source.appendChild(annotation_s)
 31     image = doc.createElement(‘image‘)
 32     image.appendChild(doc.createTextNode(‘flickr‘))
 33     source.appendChild(image)
 34     flickrid = doc.createElement(‘flickrid‘)
 35     flickrid.appendChild(doc.createTextNode(‘-1‘))
 36     source.appendChild(flickrid)
 37     owner = doc.createElement(‘owner‘)
 38     annotation.appendChild(owner)
 39     flickrid_o = doc.createElement(‘flickrid‘)
 40     flickrid_o.appendChild(doc.createTextNode(‘yanyu‘))
 41     owner.appendChild(flickrid_o)
 42     name_o = doc.createElement(‘name‘)
 43     name_o.appendChild(doc.createTextNode(‘yanyu‘))
 44     owner.appendChild(name_o)
 45
 46     size = doc.createElement(‘size‘)
 47     annotation.appendChild(size)
 48
 49     width = doc.createElement(‘width‘)
 50     width.appendChild(doc.createTextNode(str(saveimg.shape[1])))
 51     height = doc.createElement(‘height‘)
 52     height.appendChild(doc.createTextNode(str(saveimg.shape[0])))
 53     depth = doc.createElement(‘depth‘)
 54     depth.appendChild(doc.createTextNode(str(saveimg.shape[2])))
 55
 56     size.appendChild(width)
 57
 58     size.appendChild(height)
 59     size.appendChild(depth)
 60     segmented = doc.createElement(‘segmented‘)
 61     segmented.appendChild(doc.createTextNode(‘0‘))
 62     annotation.appendChild(segmented)
 63     for i in range(len(bboxes)):
 64         bbox = bboxes[i]
 65         objects = doc.createElement(‘object‘)
 66         annotation.appendChild(objects)
 67         object_name = doc.createElement(‘name‘)
 68         object_name.appendChild(doc.createTextNode(typename[i]))  #人脸数据的话 直接为 “face”
 69         objects.appendChild(object_name)
 70         pose = doc.createElement(‘pose‘)
 71         pose.appendChild(doc.createTextNode(‘Unspecified‘))
 72         objects.appendChild(pose)
 73         truncated = doc.createElement(‘truncated‘)
 74         truncated.appendChild(doc.createTextNode(‘1‘))
 75         objects.appendChild(truncated)
 76         difficult = doc.createElement(‘difficult‘)
 77         difficult.appendChild(doc.createTextNode(‘0‘))
 78         objects.appendChild(difficult)
 79         bndbox = doc.createElement(‘bndbox‘)
 80         objects.appendChild(bndbox)
 81         xmin = doc.createElement(‘xmin‘)
 82         xmin.appendChild(doc.createTextNode(str(bbox[0])))
 83         bndbox.appendChild(xmin)
 84         ymin = doc.createElement(‘ymin‘)
 85         ymin.appendChild(doc.createTextNode(str(bbox[1])))
 86         bndbox.appendChild(ymin)
 87         xmax = doc.createElement(‘xmax‘)
 88         xmax.appendChild(doc.createTextNode(str(bbox[2])))#  bbox[0] +
 89         bndbox.appendChild(xmax)
 90         ymax = doc.createElement(‘ymax‘)
 91         ymax.appendChild(doc.createTextNode(str(bbox[3])))#  bbox[1] +
 92         bndbox.appendChild(ymax)
 93     f = open(xmlpath, "w")
 94     f.write(doc.toprettyxml(indent=‘‘))
 95     f.close()
 96
 97
 98 rootdir = "/media/kuan/新加卷/wider_face"  #定义数据集的根目录wider_face  下载好的
 99
100
101 def convertimgset(img_set):  #解析函数 img_set 作为解析的路径    img_sets = ["train","val"]
102     imgdir = rootdir + "/WIDER_" + img_set + "/images"                                   #图片文件的路径
103     gtfilepath = rootdir + "/wider_face_split/wider_face_" + img_set + "_bbx_gt.txt"  #标注信息
104     fwrite = open(rootdir + "/ImageSets/Main/" + img_set + ".txt", ‘w‘)  #写入txt中 main 底下的文件夹 对应140行
105     index = 0    #表示解析到第几张图
106     with open(gtfilepath, ‘r‘) as gtfiles:      #打开真值文件,获取bbox
107         while(True):                            #true   index< 1000 #前1000个样本
108             filename = gtfiles.readline()[:-1]         #读取一行数据, 为图像路径
109             if filename == None or filename == "":
110                 break
111             imgpath = imgdir + "/" + filename         #图片的绝对路径
112             img = cv2.imread(imgpath)                 #拿到读取图片   可以获取到shape信息
113             if not img.data:
114                 break;
115             numbbox = int(gtfiles.readline())         #读取到了第二行    人脸个数
116             bboxes = []
117             print(numbbox)
118             for i in range(numbbox):                 #读取bbox信息  numbbox 行
119                 line = gtfiles.readline()
120                 lines = line.split(" ")
121                 lines = lines[0:4]
122
123                 bbox = (int(lines[0]), int(lines[1]), int(lines[2]), int(lines[3]))  #存储的左上角 坐标 和 高度宽度
124
125                 if int(lines[2]) < 40 or int(lines[3]) < 40:
126                     continue
127
128                 bboxes.append(bbox)             #存放到bbox中   numbbox个人脸信息
129
130                 #cv2.rectangle(img, (bbox[0],bbox[1]),(bbox[0]+bbox[2],bbox[1]+bbox[3]),color=(255,255,0),thickness=1)
131
132             filename = filename.replace("/", "_")    #图片的名称存储
133
134             if len(bboxes) == 0:
135                 print("no face")
136                 continue
137             #cv2.imshow("img", img)
138             #cv2.waitKey(0)
139             cv2.imwrite("{}/JPEGImages/{}".format(rootdir,filename), img)  #写入图像JPEGImages
140             fwrite.write(filename.split(".")[0] + "\n")     #写入txt中 main 底下的文件夹
141             xmlpath = "{}/Annotations/{}.xml".format(rootdir,filename.split(".")[0])
142             writexml(filename, img, bboxes, xmlpath)   #调用函数
143             print("success number is ", index)
144             index += 1
145
146     fwrite.close()
147
148 if __name__=="__main__":
149     img_sets = ["train","val"]
150     for img_set in img_sets:
151         convertimgset(img_set)
152     #修改文件名
153     shutil.move(rootdir + "/ImageSets/Main/" + "train.txt", rootdir + "/ImageSets/Main/" + "trainval.txt")
154     shutil.move(rootdir + "/ImageSets/Main/" + "val.txt", rootdir + "/ImageSets/Main/" + "test.txt")

通过上面三个步骤我们就生成了VOC格式的数据集,现在我们只需要放到工程目录下并且进行修改 就可以开始训练了。

详细修改方法见下:

https://www.cnblogs.com/WSX1994/p/11216953.html

 

原文地址:https://www.cnblogs.com/WSX1994/p/11218264.html

时间: 2024-08-01 16:06:12

TF项目实战(基于SSD目标检测)——人脸检测2的相关文章

基于Boost方法的人脸检测(1):整体思路

先推荐大家看着两篇: [2] Viola P, Jones M J. Robust Real-Time Face Detection[J]. International Journal of Computer Vision, 2004, 57(2):137-154. [3] http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html [4] http://blog.csdn.net/xiaowei_cqu/article/details

基于Haar特征Adaboost人脸检测级联分类

基于Haar特征Adaboost人脸检测级联分类,称haar分类器. 通过这个算法的名字,我们能够看到这个算法事实上包括了几个关键点:Haar特征.Adaboost.级联.理解了这三个词对该算法基本就掌握了. 1        算法要点 Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost +级联: Haar分类器算法的要点例如以下: a)        使用Haar-like特征做检測. b)       使用积分图(IntegralImage)对Haar-like

基于python+opencv的人脸检测+

人脸检测分为两种:一种是基于知识的,一种是基于深度学习的.深度不会学习 人脸识别属于目标检测,主要涉及两个方面: ①先对检测的物体进行概率统计,从而知道待检测对象的一些特征,建立其目标的检测模型 ②用得到的模型来匹配输入的图像,如果有匹配则则输出匹配的区域,否则什么也不做. 我们看到的图片和计算机不一样,计算机看到的是一串串数字矩阵,图片由多个像素组成,拿我们熟悉的RGB图像来说,每个像素又有红绿蓝三个通道,假如每个像素的单个通道由uint8类型字符组成,那么三通道的像素便会有24位,这是我们常

Swift项目实战-基于分层架构的多版本iPhone计算器-免费直播公开课邀您参与

Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播课 好消息:买本课程送相关讲师图书+50金币课程优惠券!还有更好消息,为了回馈新老学员,本次采取直播免费,录播收费的形式哦~! 购买本课程赠送关东升老师价值69元国内第一本<Swift开发指南>,并且赠送50元优惠券一张.69+50>99.(购买课程后请联系客服QQ:1575716557) 本课程采用QQ群直播方式进行直播,直播免费看了,完整的基于Swift项目实战,手把手教你做一个Swift版iPhone计算器. 直播

Android实战技巧之三十:人脸检测-静态

最近微软的how-old.net把人脸识别技术又大大的火了一把.通过大数据和复杂的算法,能够神奇的预测出照片中人物的性别和年龄.虽然错误率也不低,但是大家都抱着玩一玩乐一乐的心态把照片传上去让机器来鉴定一下自己的颜龄. 人脸识别算法是高深复杂的,面对着计算机视觉的种种数学公式,我就已经投降了.先来简单的玩玩人脸检测吧.Android早已提供了FaceDetector类,今天就来看看如何使用这个类人脸检测吧. 流程: 1.打开文件夹选择照片 2.将照片加载到bitmap中并缩放到设置的宽高 3.用

学习OpenCV——行人检测&amp;人脸检测(总算运行出来了)

http://blog.csdn.net/yangtrees/article/details/7453987 之前运行haar特征的adaboost算法人脸检测一直出错,加上今天的HOG&SVM行人检测程序,一直报错. 今天总算发现自己犯了多么白痴的错误--是因为外部依赖项lib文件没有添加完整,想一头囊死啊 做程序一定要心如止水!!! 仔细查找!!! 1.人脸识别程序: [cpp] view plain copy print? #include "cv.h" #include

肤色检测&amp;人脸检测数据集链接大集合(持续更新中...)

在国内计算机视觉领域,人体器官的识别和跟踪,如人脸识别跟踪.人手识别跟踪等还是一个热门领域.然而,国内的研究者大多不如国外的研究者那么勤快,不喜欢把自己的测试的数据集(dataset)公开给开发者用,导致大多数开发者只能到国外网站去找.这里为方便大家找数据集,我把一些我自己用的数据集连接放到网上,并附上一些简介,如果链接失效,可以私信我要. 1.   来自牛津大学Visual Geometry Group的Hand Dataset:http://www.robots.ox.ac.uk/~vgg/

项目实战——基于LZ77变形和哈夫曼编码的GZIP压缩

文件压缩: 日常生活中有很多压缩的例子,比如给很长的名字取一个缩写--西安交通大学简称西交大,这样就给我们的生活提供了很大的便捷,那么什么又是文件压缩呢?文件压缩就是将文件通过一些方法变得更小,解压缩就是将文件还原,文件压缩将文件变得更小节省了内存,并且在网络上传输起来也变得很快,还具有一定的保密性,所以这个项目就是为了实现这个目的. 基于哈夫曼树的文件压缩 一.思想:众所周知在32位平台下一个字节占八个bit位,假如我们文件中的数据是abbbcccccddddddd时,每个字节占用八个比特位,

人脸识别系列之人脸检测--训练基于肤色特征的检测

前言: 基于特征的方法是利用人脸的先验知识导出的规则进行人脸检测. 一般来说,常用的特征包括人脸和人脸器官典型的边缘和形状特征(如人脸轮廓.虹膜轮廓.嘴唇轮廓等).纹理特征(纹理是在图上表现为灰度或颜色分布的某种规律性,这种规律性在不同类别的纹理中有其不同特点,人脸有其特定的纹理特征).颜色特征(人脸肤色特征,目前主要有RGB,HSV,YCbCr,YIQ,HIS等彩色空间模型被用来表示人脸的肤色,从而进行基于颜色信息的人脸检测方法的研究). 人脸检测的方法: 基于规则/知识方法 – 人脸模式的变