WiderFace标注格式转PASCAL VOC2007标注格式
#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标注格式的更多相关文章
- 目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练
将目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练. import xml.etree.ElementTree as ET import numpy as ...
- caffe学习笔记(一),ubuntu14.04+GPU (用Pascal VOC2007训练数据,并测试)
把源代码跑起来了,将实验过程记录如下,用于新手入门. 今天和师兄师姐才跑通,来分享下心得.(预训练网络:ImageNet_model,训练集:PASCAL VOC2007, GPU) 首先,整个tra ...
- PDF文件如何标注,怎么使用PDF标注工具
我们在使用文件的时候需要给文件的部分添加标注,能够更加直观的了解文件,但是有很多小伙伴们对于PDF文件怎么添加标注都不知道,也不知道PDF标注工具要怎么使用,那么下面就跟大家分享一下怎么使用PDF标注 ...
- [转] 将DOS格式文本文件转换成UNIX格式
点击此处阅读原文 用途说明 dos2unix命令用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter).DOS下的文本文 ...
- 【转】将 azw3 格式转换为 mobi 格式并保持原有排版格式
小伙伴多次向 Kindle 伴侣提出一个问题,那就是通过 Calibre 将排版精美的 azw3 格式电子书转换成 mobi 格式后推送到 Kindle,排版格式会发生很大的变化,比如行距过窄.内嵌字 ...
- Java json设置时间格式,Jackson设置时间格式,json设置单引号
Java json设置时间格式,Jackson设置时间格式,json设置单引号 >>>>>>>>>>>>>>> ...
- web字体格式及几种在线格式转换工具介绍
原文地址:http://blog.csdn.net/xiaolongtotop/article/details/8316554 目前,文字信息仍是网站最主要的内容,随着CSS3技术的不断成熟,Web字 ...
- Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式
Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式 找到eclipse安装文件夹以下的plugins文件夹,搜索 org.eclipse.text ,找到一个jar ...
- ASP:GB2312格式文本文件转换成UTF-8格式
'-------------------------------------------------'函数名称:gb2utf_file'作用:利用AdoDb.Stream对象来把GB2312格式文本文 ...
随机推荐
- BZOJ5466 NOIP2018保卫王国(倍增+树形dp)
暴力dp非常显然,设f[i][0/1]表示i号点不选/选时i子树内的答案,则f[i][0]=Σf[son][1],f[i][1]=a[i]+Σmin(f[son][0],f[son][1]). 注意到 ...
- BZOJ4571:[SCOI2016]美味——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4571 https://www.luogu.org/problemnew/show/P3293 一家 ...
- [Leetcode] single number 找单个数
Given an array of integers, every element appears twice except for one. Find that single one. Note: ...
- BZOJ4815 [CQOI2017]小Q的表格 【数论 + 分块】
题目链接 BZOJ4815 题解 根据题中的式子,手玩一下发现和\(gcd\)很像 化一下式子: \[ \begin{aligned} bf(a,a + b) &= (a + b)f(a,b) ...
- Poco::Path 和 DirectoryIterator
#include<iostream>#include<typeinfo>#include<Poco/Path.h>using namespace std;using ...
- mysql定时器,定时查询数据库,把查询结果插入到一张表中
1.有两张表order_repayment_detail,msg_sim ,需要把前者中的按时间过滤出来的信息插入到短信发送表中,可以每晚12点钟查询执行一次查询. 创建存储过程,这里的存储过程主要提 ...
- 在Linux中新增与删除用户可以使用命令:Useradd
在Linux中新增与删除用户可以使用命令:Useradd 我们先使用man命令理解一下Useradd的用法 新增与删除用户操作需要先获取高级用户权限 输入命令:sudo -i 确定后输入高级用户密码 ...
- 用CSS3实现的addidas阿迪达斯标志LOGO
<!DOCTYPE html> <html> <head> <meta charset=utf-8 /> <title>用CSS3实现的ad ...
- Codeforces Round #343 (Div. 2) A
A. Far Relative’s Birthday Cake time limit per test 1 second memory limit per test 256 megabytes inp ...
- 神经网络CNN训练心得--调参经验
1.样本要随机化,防止大数据淹没小数据 2.样本要做归一化.关于归一化的好处请参考:为何需要归一化处理3.激活函数要视样本输入选择(多层神经网络一般使用relu)4.mini batch很重要,几百是 ...