#coding=utf-8
import os
import cv2
from xml.dom.minidom import Document def create_xml(boxes_dict,target_xml_dir):
file_name = boxes_dict["filename"]
fname = file_name.split('.')[0]
boxes = boxes_dict["boxes"]
doc = Document()
annotation = doc.createElement('annotation')
doc.appendChild(annotation) folder = doc.createElement('folder')
folder.appendChild(doc.createTextNode('widerface'))
annotation.appendChild(folder) filename = doc.createElement('filename')
filename.appendChild(doc.createTextNode(file_name))
annotation.appendChild(filename) source = doc.createElement('source')
database = doc.createElement('database')
database.appendChild(doc.createTextNode('baidu'))
source.appendChild(database)
annotation.appendChild(source) size = doc.createElement('size')
width = doc.createElement('width')
width.appendChild(doc.createTextNode(str(300)))
size.appendChild(width)
height = doc.createElement('height')
height.appendChild(doc.createTextNode(str(300)))
size.appendChild(height)
depth = doc.createElement('depth')
depth.appendChild(doc.createTextNode(str(3)))
size.appendChild(depth)
annotation.appendChild(size) segmented = doc.createElement('segmented')
segmented.appendChild(doc.createTextNode(str(0)))
annotation.appendChild(segmented) # write the coordinates of the b-box
for b_box in boxes:
#print b_box
if(b_box[0]<0):
b_box[0] = 0
if (b_box[1] < 0):
b_box[1] = 0 object = doc.createElement('object')
name = doc.createElement('name')
name.appendChild(doc.createTextNode('face'))
#name.appendChild(doc.createTextNode(x[0]))
object.appendChild(name) difficult = doc.createElement('difficult')
difficult.appendChild(doc.createTextNode(''))
object.appendChild(difficult) truncated = doc.createElement('truncated')
truncated.appendChild(doc.createTextNode(''))
object.appendChild(truncated) pose = doc.createElement('pose')
pose.appendChild(doc.createTextNode('undefined'))
object.appendChild(pose) bndbox = doc.createElement('bndbox')
xmin = doc.createElement('xmin')
xmin.appendChild(doc.createTextNode(str(b_box[0])))
bndbox.appendChild(xmin)
object.appendChild(bndbox)
ymin = doc.createElement('ymin')
ymin.appendChild(doc.createTextNode(str(b_box[1])))
bndbox.appendChild(ymin)
xmax = doc.createElement('xmax')
xmax.appendChild(doc.createTextNode(str(b_box[0]+b_box[2])))
bndbox.appendChild(xmax)
ymax = doc.createElement('ymax')
ymax.appendChild(doc.createTextNode(str(b_box[1]+b_box[3])))
bndbox.appendChild(ymax)
annotation.appendChild(object) xml_name = fname+'.xml'
target_xml_path = os.path.join(target_xml_dir,xml_name)
with open(target_xml_path, 'wb') as f:
f.write(doc.toprettyxml(indent='\t', encoding='utf-8')) def draw_and_save(image_list,src_img_dir = None, tar_img_dir = None):
name_list = os.path.join(tar_img_dir,"val.txt")
with open(name_list,'a') as fw:
for item in image_list:
sub_path = item["path"]
path_seg = sub_path.split("/")
path = os.path.join(src_img_dir,sub_path)
boxes = item["boxes"]
img = cv2.imread(path)
height,width,channel = img.shape
box_num = 0
target_size = 300
boxes_dict = {}
boxes_dict["filename"] = path_seg[1]
new_boxes = []
for box in boxes:
new_box = []
ord = box.split(" ")
x, y, w, h = int(ord[0]),int(ord[1]),int(ord[2]),int(ord[3])
wh = width
if width > height:
wh = height
img = img[0:wh,0:wh]
if x+w > wh or y+h > wh : #过滤掉超出图片范围的人脸
print "Face has been out of picture"
continue scale = float(target_size)/wh #缩放比
x_new = int(x*scale)
y_new = int(y*scale)
w_new = int(w*scale)
h_new = int(h*scale) if w_new*h_new < 64: # 过滤面积小于64像素平方的框,因为第一个用于检测的特征图的stride=8
print "Box: (width: {} height: {}) is too small".format(w_new,h_new)
continue img = cv2.resize(img,(target_size,target_size)) #缩放到300×300
new_box.append(x_new)
new_box.append(y_new)
new_box.append(w_new)
new_box.append(h_new)
cv2.rectangle(img,(x_new,y_new),(x_new+w_new,y_new+h_new),(0,255,0), 1)
print new_box
box_num+=1
new_boxes.append(new_box)
boxes_dict["boxes"] = new_boxes
if box_num == 0:
continue img_tar_dir = os.path.join(tar_img_dir,"JPEGImages")
if not os.path.exists(img_tar_dir):
os.mkdir(img_tar_dir)
tar_path = os.path.join(img_tar_dir,path_seg[1])
cv2.imwrite(tar_path,img) xml_tar_dir = os.path.join(tar_img_dir, "Annotations")
if not os.path.exists(xml_tar_dir):
os.mkdir(xml_tar_dir)
create_xml(boxes_dict,xml_tar_dir)
fw.write(path_seg[1].split('.')[0]+'\n')
fw.flush() def parse(label_file_path, src_img_dir, tar_img_dir):
fr = open(label_file_path,'r')
image_list = []
line = fr.readline().rstrip()
while line:
mdict = {}
path = line
mdict["path"] = path
num = fr.readline().rstrip()
boxes_list = []
for n in range(int(num)):
box = fr.readline().rstrip()
boxes_list.append(box)
mdict["boxes"]=boxes_list
image_list.append(mdict)
line = fr.readline().rstrip()
draw_and_save(image_list,src_img_dir,tar_img_dir) if __name__=="__main__":
file_path = "/projects/DSOD/wider_face/datasets/wider_face_split/wider_face_val_bbx_gt.txt"
source_img_dir = "/projects/DSOD/wider_face/datasets/val/images"
target_img_dir = "/projects/DSOD/wider_face/datasets/drew"
if not os.path.exists(target_img_dir):
os.mkdir(target_img_dir)
parse(file_path,source_img_dir,target_img_dir)

WiderFace标注格式转PASCAL VOC2007标注格式的更多相关文章

  1. 目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练

    将目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练. import xml.etree.ElementTree as ET import numpy as ...

  2. caffe学习笔记(一),ubuntu14.04+GPU (用Pascal VOC2007训练数据,并测试)

    把源代码跑起来了,将实验过程记录如下,用于新手入门. 今天和师兄师姐才跑通,来分享下心得.(预训练网络:ImageNet_model,训练集:PASCAL VOC2007, GPU) 首先,整个tra ...

  3. PDF文件如何标注,怎么使用PDF标注工具

    我们在使用文件的时候需要给文件的部分添加标注,能够更加直观的了解文件,但是有很多小伙伴们对于PDF文件怎么添加标注都不知道,也不知道PDF标注工具要怎么使用,那么下面就跟大家分享一下怎么使用PDF标注 ...

  4. [转] 将DOS格式文本文件转换成UNIX格式

    点击此处阅读原文 用途说明 dos2unix命令用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter).DOS下的文本文 ...

  5. 【转】将 azw3 格式转换为 mobi 格式并保持原有排版格式

    小伙伴多次向 Kindle 伴侣提出一个问题,那就是通过 Calibre 将排版精美的 azw3 格式电子书转换成 mobi 格式后推送到 Kindle,排版格式会发生很大的变化,比如行距过窄.内嵌字 ...

  6. Java json设置时间格式,Jackson设置时间格式,json设置单引号

    Java json设置时间格式,Jackson设置时间格式,json设置单引号 >>>>>>>>>>>>>>> ...

  7. web字体格式及几种在线格式转换工具介绍

    原文地址:http://blog.csdn.net/xiaolongtotop/article/details/8316554 目前,文字信息仍是网站最主要的内容,随着CSS3技术的不断成熟,Web字 ...

  8. Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式

    Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式 找到eclipse安装文件夹以下的plugins文件夹,搜索 org.eclipse.text ,找到一个jar ...

  9. ASP:GB2312格式文本文件转换成UTF-8格式

    '-------------------------------------------------'函数名称:gb2utf_file'作用:利用AdoDb.Stream对象来把GB2312格式文本文 ...

随机推荐

  1. Dom事件的三种绑定方式

    1.事件 2.  onclick, onblur, onfocus, 需求:请写出一个行为,样式,结构,相分离的页面.   JS,   CSS,  HTML, 示例1,行为结构样式粘到一起的页面: & ...

  2. 推荐算法相关总结表(包括DM)

    推荐算法总结表 表1 推荐算法分类 个性化推荐算法分类 启发式算法 基于模型 基于内容 TF-IDF 聚类 最大熵 相似度度量 贝叶斯分类 决策树 神经网络 专家系统 知识推理 协同过滤 K近邻 聚类 ...

  3. mysql 迁移 mariadb

    背景: mysql5.7数据库安装在windows环境中,数据需要迁移到CentOS7.4的mariadb5.5中.web应用是采用springboot2.x开发的,迁移数据完成后,还需要简单修改一些 ...

  4. 【转】C# 利用反射动态创建对象

    http://www.cnblogs.com/Jan_Dai/archive/2010/11/09/1872812.html Activator.CreateInstance(Type.GetType ...

  5. 【题解】Atcoder AGC#03 E-Sequential operations on Sequence

    仙题膜拜系列...首先我们可以发现:如果在截取了一段大的区间之后再截取一段小的区间,显然是没有什么用的.所以我们可以将操作序列变成单调递增的序列. 然后怎么考虑呢?启示:不一定要考虑每一个数字出现的次 ...

  6. BZOJ2668:[CQOI2012]交换棋子——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2668 https://www.luogu.org/problemnew/show/P3159#sub ...

  7. [Leetcode] single number 找单个数

    Given an array of integers, every element appears twice except for one. Find that single one. Note:  ...

  8. BZOJ [Ctsc2002] Award 颁奖典礼 解题报告

    [Ctsc2002] Award 颁奖典礼 Description IOI2002的颁奖典礼将在YONG-IN Hall隆重举行.人们在经历了充满梦幻的世界杯之后变得更加富于情趣.为了使颁奖典礼更具魅 ...

  9. 【神仙DP】【UVa11400】Lighting System Design

    传送门 Description Translation 题目大意:有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯泡只需要共享一个 ...

  10. 负载均衡配置(基于Nginx)

    以下是基于nginx进行负载均衡配置的流程: 服务器配置如下: 1.  安装nginx的服务器:192.168.1.1 2.  nginx配置负载均衡位置及端口:192.168.1.1 80端口 3. ...