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格式文本文 ...
随机推荐
- 史上最简单的 MySQL 教程(十五)「列属性 之 自动增长」
自动增长 自动增长:auto_increment,当对应的字段,不给值,或者是默认值,或者是null的时候,就会自动的被系统触发,系统会从当前字段中取已有的最大值再进行+1操作,得到新的字段值. 自增 ...
- BZOJ3144:[HNOI2013]切糕——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3144 看着很像网络流,但是费用流貌似无法解决这个问题,其实甚至连忽略d的情况都做不到. 最小割? ...
- C++中typedef和#define简介
本文基于<C++ Primer(第5版)>和网上博客,整理而成. 一.类型别名 类型别名是一个名字,它是某种类型的同义词,有两种方法可用于定义类型别名:typedef.using. 1.关 ...
- [Leetcode] restore ip address 存储IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】
题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...
- 洛谷 P3620 [APIO/CTSC 2007]数据备份 解题报告
P3620 [APIO/CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同 ...
- Vue项目搭建过程
环境搭建:mac+nodejs+npm #安装node.js : $ brew install node #安装vue-cil: $ npm install -g vue-cli 注:官网下载安装no ...
- distcc配置
原理图: OS: ubuntu Server 12.04 1.安装 apt-get install distcc 2.配置 将文件/etc/default/distcc修改为如下格式 STARTDIS ...
- 再续前缘-apache.commons.beanutils的补充
title: 再续前缘-apache.commons.beanutils的补充 toc: true date: 2016-05-32 02:29:32 categories: 实在技巧 tags: 插 ...
- EF数据更新时候异常情况一
在不熟练EF的时候有时更新数据时候会报以下异常: 错误原因:此时操作的实体不是从数据库里获取的.而是自己new出来的实体然后赋值的.EF此时的存储池中已经有了这个实体,在new一个对象ID相同就不能共 ...