FDDB为图片多人脸目标检测数据集,本文根据vocdataset 进行改编,将FDDB数据集进行分割,并进行图像预处理,翻转,随机裁剪等数据集增强相关的预处理。
如有转载请 附本文链接 :https://blog.csdn.net/canmang1/article/details/108487673

# 每个标注的椭圆形人脸由六个元素组成。
# (ra, rb, Θ, cx, cy, s)
# ra,rb:半长轴、半短轴
# cx, cy:椭圆中心点坐标
# Θ:长轴与水平轴夹角(头往左偏Θ为正,头往右偏Θ为负)
# s:置信度得分
from os import listdir  # 返回指定的文件夹包含的文件或文件夹的名字的列表 path=os.getcwd()
from os.path import join #/后添加路径使用
from random import random
from PIL import Image, ImageDraw
import re
from multiprocessing import Pipe, Process
import torch
import torch.utils.data as data
import torchvision.transforms as transforms
import cv2
from tqdm import tqdm
import numpy as np
from sampling import sampleEzDetect
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
from tensorboardX import SummaryWriter__all__ = ["vocClassName", "vocClassID", "vocDataset"]#img = Image.open(“图片路径”).convert(‘RGB’)  此时使HWC,需要WHC 利用torch.contigous.view进行维度变换
class text_info:def __init__(self,path_filename,istraining=True,predict=False):self.path=path_filenameself.pathlist =Noneself.istraining=istrainingself.predict=predictdef creat_dict_of_bbox(self,filepath):target_gt={}f_test_bbox=open(filepath, "r")test_bbox=f_test_bbox.readlines()pathlist=[]for lines in test_bbox:lines=lines.rstrip()if lines.startswith('2002') or lines.startswith('2003'):path=join('./train/',lines)path=path+'.jpg'target_gt[path]=[]pathlist.append(path)else:if lines==None:continuelines=lines.split()[0:5]# print('slipt后的结果:'+str(lines))target_gt[path].append(lines)f_test_bbox.close()for path_1 in pathlist:if target_gt[path]==None:target_gt.pop(path)return pathlist,target_gt
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#解析,重新获得对应的ground_truthdef special_picture_bboxes(self,file_path_train_or_test):loc_bboxes=[]pathlist, target_gt = text_info.creat_dict_of_bbox(self, self.path)num, gt_bbox = text_info.batch_image_data(self, target_gt)# 这里的bboxes为{ 0 : [ [] , [] , [] , [] ] }batch_gt_boxes = text_info.every_batch_bboxes(self, num, gt_bbox)#这里的index=[2,4,5],pathlist不出错的情况下,为一个数【n】index = [i for i, v in enumerate(pathlist) if v == file_path_train_or_test]for i in index:for j in range(len(batch_gt_boxes[i])):# (ra, rb, Θ, cx, cy, s)batch_gt_boxes[i][j][0] = float(batch_gt_boxes[i][j][3]) - float(batch_gt_boxes[i][j][0])batch_gt_boxes[i][j][1] = float(batch_gt_boxes[i][j][4]) - float(batch_gt_boxes[i][j][1])batch_gt_boxes[i][j][2] = float(batch_gt_boxes[i][j][3]) + float(batch_gt_boxes[i][j][0])batch_gt_boxes[i][j][3] = float(batch_gt_boxes[i][j][4]) + float(batch_gt_boxes[i][j][1])batch_gt_boxes[i][j][4]=float(batch_gt_boxes[i][j][2])loc_bboxes.append(batch_gt_boxes[i])return loc_bboxes[0]#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>def batch_image_data(self,dict_gt):filename = list(dict_gt.keys())number_bboxes=[]all_gt_bboxes=[]for i in range(len(filename)):index_number=dict_gt[filename[i]][0]number_bboxes.append(index_number)for index in range(int(index_number[0])):loc_bboxes=dict_gt[filename[i]][index+1]all_gt_bboxes.append(loc_bboxes)return number_bboxes,all_gt_bboxes#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>#根据成批次的number和gt_bbox进行相应的def every_batch_bboxes(self,number_list,bboxes_list):batch=0box_number=0dict1={}for index in number_list:dict1[batch]=[]for i in range(int(index[0])):dict1[batch].append(bboxes_list[box_number])box_number+=1batch+=1return dict1def forward(self):pathlist,target_gt = text_info.creat_dict_of_bbox(self,self.path)self.pathlist=pathlist# file_name='E:/数据集/wider/WIDER_test/images/0--Parade/0_Parade_Parade_0_904.jpg'num, gt_bbox =text_info.batch_image_data(self,target_gt)batch_gt_boxes = text_info.every_batch_bboxes(self,num, gt_bbox)bboxes=text_info.gettxtInfo(self,pathlist,num,batch_gt_boxes)# return pathlist,num,batch_gt_boxesreturn bboxesdef gettxtInfo(self,pathlist,num,batch_gt_boxes):bboxes=[]for key,value in batch_gt_boxes.items():# print('value'+str(value[0]))for i in range(int(num[key][0])):newAnn = {}newAnn['category_id']=pathlist[key]newAnn['xmin'] = float(value[i][3])-float(value[i][0])newAnn['ymin'] = float(value[i][4])-float(value[i][1])newAnn['xmax'] = float(value[i][3])+float(value[i][0])newAnn['ymax'] = float(value[i][4])+float(value[i][1])newAnn['angle']=float(value[i][2])bboxes.append(newAnn)return bboxes
# mean_std=main(allTrainingData,allTestingData)
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
class vocDataset(data.Dataset):def __init__(self, config, isTraining=True):super(vocDataset, self).__init__()self.isTraining = isTrainingself.config = configif isTraining:normalize = transforms.Normalize(mean=[train_data_mean_std['mean_rgb'][0], train_data_mean_std['mean_rgb'][1],train_data_mean_std['mean_rgb'][2]],std=[train_data_mean_std['std_rgb'][0],train_data_mean_std['std_rgb'][1],train_data_mean_std['std_rgb'][2]])  # 用均值和方差对图片的RGB值分别进行归一化(也有其他方法,这种相对比较简单)else:normalize = transforms.Normalize(mean=[test_data_mean_std['mean_rgb'][0], test_data_mean_std['mean_rgb'][1],test_data_mean_std['mean_rgb'][2]],std=[test_data_mean_std['std_rgb'][0],test_data_mean_std['std_rgb'][1],test_data_mean_std['std_rgb'][2]])self.transformer = transforms.Compose([transforms.ToTensor(), normalize])def __getitem__(self, index):item = Noneif self.isTraining:item = allTrainingData[index % len(allTrainingData)]#得到某个特定的图片的所有人脸bboxesallBboxes = train_info.special_picture_bboxes(item)else:item = allTestingData[index % len(allTestingData)]allBboxes = train_info.special_picture_bboxes(item)img = Image.open(item)  # item[0]为图像数据
# item[1]为通过getVOCInfo函数解析出真实label的数据imgWidth, imgHeight = img.sizetargetWidth = int((random() * 0.25 + 0.75) * imgWidth)targetHeight = int((random() * 0.25 + 0.75) * imgHeight)# 对图片进行随机crop,并保证bbox大小xmin = int(random() * (imgWidth - targetWidth))ymin = int(random() * (imgHeight - targetHeight))img = img.crop((xmin, ymin, xmin + targetWidth, ymin + targetHeight))img = img.resize((self.config.targetWidth, self.config.targetHeight), Image.BILINEAR)imgT = self.transformer(img)imgT = imgT * 256# 调整bboxbboxes = []for i in allBboxes:xl = int(i[0]) - xminyt = int(i[1]) - yminxr = int(i[2]) - xminyb = int(i[3]) - yminif xl < 0:xl = 0if xr >= targetWidth:xr = targetWidth - 1if yt < 0:yt = 0if yb >= targetHeight:yb = targetHeight - 1xl = xl / targetWidth  # 经过随机裁剪后得到targetwidth与height,求得是左右与上下占总体长宽的比例xr = xr / targetWidthyt = yt / targetHeightyb = yb / targetHeightif (xr - xl >= 0.05 and yb - yt >= 0.05):bbox = [1, xl, yt, xr, yb]bboxes.append(bbox)  # 生成的bbox是对整体位置比例的换算if len(bboxes) == 0:return self[index + 1]target = sampleEzDetect(self.config, bboxes)'''### 对预测图片进行测试 ##########draw = ImageDraw.Draw(img)num = int(target[0])for j in range(0,num):offset = j * 6if ( target[offset + 1] < 0):breakk = int(target[offset + 6])trueBox = [ target[offset + 2],target[offset + 3],target[offset + 4],target[offset + 5] ]predBox = self.config.predBoxes[k]draw.rectangle([trueBox[0]*self.config.targetWidth,trueBox[1]*self.config.targetHeight,trueBox[2]*self.config.targetWidth,trueBox[3]*self.config.targetHeight])draw.rectangle([predBox[0]*self.config.targetWidth,predBox[1]*self.config.targetHeight,predBox[2]*self.config.targetWidth,predBox[3]*self.config.targetHeight], None, "red")del drawimg.save("/tmp/{}.jpg".format(index) )'''return imgT, targetdef __len__(self):if self.isTraining:num = len(allTrainingData) - (len(allTrainingData) % self.config.batchSize)return numelse:num = len(allTestingData) - (len(allTestingData) % self.config.batchSize)return num
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#调用就会加载
allData=[]
allTrainingData=[]
allTestingData=[]
for i in range(10):i+=1train_path_filename=('E:/数据集2/FDDB/FDDB-folds/FDDB-fold-0{}-ellipseList.txt'.format(i))if i==10:train_path_filename = ('E:/数据集2/FDDB/FDDB-folds/FDDB-fold-10-ellipseList.txt')train_info=text_info(train_path_filename,istraining=True,predict=False)allPREData,_=train_info.creat_dict_of_bbox(train_info.path)allData+=allPREData
for path_11 in allData:if Image.open(path_11).mode == 'L':if allData.index(path_11):p = allData.index(path_11)allData.pop(p)
for index in range(len(allData)):if index%10==0:allTestingData.append(allData[index])else:allTrainingData.append(allData[index])train_data_mean_std={'mean_rgb': [0.3925,0.35197,0.39247], 'std_rgb': [0.0748, 0.0646, 0.0618]}
test_data_mean_std={'mean_rgb': [0.4890,0.4392,0.4890], 'std_rgb': [0.1013, 0.0899, 0.088]}vocClassName = ['face']
vocClassID={}
for i in range(len(vocClassName)):vocClassID[vocClassName[i]]=i+1

FDDB人脸数据集dataset的dataset数据集的制作相关推荐

  1. Dataset:GiveMeSomeCredit数据集的简介、下载、使用方法之详细攻略

    Dataset:GiveMeSomeCredit数据集的简介.下载.使用方法之详细攻略 目录 GiveMeSomeCredit数据集的简介 1.数据集基本描述 2.EDA后总结 3.数据集基本形状 G ...

  2. Dataset:机器学习和深度学习中对数据集进行高级绘图(数据集可视化,箱线图等)的简介、应用之详细攻略——daidingdaiding

    Dataset:机器学习和深度学习中对数据集进行高级绘图(数据集可视化,箱线图等)的简介.应用之详细攻略--daidingdaiding 目录 箱线图 箱线图 箱线图(box plots):这些图显示 ...

  3. Dataset:数据集集合(NLP方向数据集)——常见的自然语言处理数据集大集合(建议收藏,持续更新)

    Dataset:数据集集合(NLP方向数据集)--常见的自然语言处理数据集大集合(建议收藏,持续更新) 目录 NLP数据集特点 常见的NLP数据集 1.生物数据集以及自然语言处理数据集 常见的使用案例 ...

  4. Dataset之谷歌地图数据集:谷歌地图数据集的简介、安装、使用方法之详细攻略

    Dataset之谷歌地图数据集:谷歌地图数据集的简介.安装.使用方法之详细攻略 目录 谷歌地图数据集的简介 谷歌地图数据集的安装 谷歌地图数据集的使用方法 谷歌地图数据集的简介 谷歌地图中的1000多 ...

  5. Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略

    Dataset之COCO数据集:COCO数据集的简介.安装.使用方法之详细攻略 目录 COCO数据集的简介 0.COCO数据集的80个类别-YoloV3算法采用的数据集 1.COCO数据集的意义 2. ...

  6. Dataset:数据集集合(CV方向数据集)-常见的计算机视觉图像数据集大集合包括表面缺陷检测数据集(持续更新)

    Dataset:数据集集合(CV方向数据集)-常见的计算机视觉图像数据集大集合包括表面缺陷检测数据集(建议收藏,持续更新) 目录 CV常用数据集平台集合 Mendeley Data CAISA-Web ...

  7. 在数据集Euroc v dataset下跑双目ORB-SLAM2

    在数据集Euroc v101 dataset下跑双目ORB-SLAM2 前提:之前orb-slam2已编译通过了,我之前的博客有写. 首先下载数据集Euroc v103(EuRoC MAV Datas ...

  8. 多模态分析数据集(Multimodal Dataset)整理

    这里整理一下平时所用的多模态数据集以备之用,主要分为 多模态情感分析数据集 多模态问答数据集 多模态检索(匹配)数据集 后面会不断地去添加,也希望能够帮到其他人,欢迎大家补充. [0].多模态以及其他 ...

  9. The Movies Dataset(电影数据集)

    原文: The Movies Dataset Metadata on over 45,000 movies. 26 million ratings from over 270,000 users. T ...

  10. Dataset - DeepFashion 服装数据集

    Dataset - DeepFashion 服装数据集 [Dataset - DeepFashion] [Project - DeepFashion] 对于数据集有学习科研等需求的,请在 AIUAI- ...

最新文章

  1. 分享Kali Linux 2016.2第49周虚拟机
  2. bootstrap回顾
  3. VerifyRenderingInServerForm 和EnableEventValidation引发的两个问题
  4. 效率,互联网生态模式的本质!——保险科技生态建设...
  5. poj 1287 Networking 最小生成树 Kruskal Prim
  6. 详解回调函数(同步回调,异步回调)
  7. razorPage三元运算符使用注意
  8. 网线的分类,以及作用
  9. 排序算法 稳定和不稳定_稳定和不稳定排序算法之间的区别?
  10. 携程工作感言(一)(6.30)
  11. Android 三方数据库ObjectBox使用
  12. 360极速浏览器极速模式通过hosts文件切换兼容模式bat脚本
  13. java:POI导出excel
  14. mysql varchar 单引号_char、varchar数据类型值在使用时可以要用单引号或双引号括起来。...
  15. 秀一下大连TimesTen 18.1培训的结业证
  16. Nginx中文域名配置
  17. pango design suite使用外部编辑器
  18. 主流锂电池保护板BMS蓝牙模块芯片的选型说明之KT6368A双模芯片
  19. 钢绞线的弹性模量的计算方法_钢绞线计算公式
  20. threejs结合tween实现动画效果

热门文章

  1. EXE4J 错误提醒 Pleasedefine EXE4J_JAVA_HOME to point to an installes 64-bit JDK or JRE
  2. RIP总结(转自鸿鹄论坛)
  3. pdf转word工具内含注册码【pdf转word】
  4. Autodesk AutoCAD 2018 for Mac 汉化破解版安装教程
  5. celebA_hq高清人脸图片下载、生成代码
  6. 大气压力换算公式_大气压怎么算
  7. CefSharp入门-winform
  8. 适合新手入门—嵌入式C语言
  9. Android 自定义带文字图片的view,宝马上线娱乐亚洲第一-宝马上线娱乐亚洲第一...
  10. MATLAB的非线性变换