我处理这个数据集是用来训练MTCNN网络的,celebA数据集由202599张人脸组成,这里主要是将样本扩容,即在原有的图片上抠图。

因为上面是MTCNN的框架,由P,R,O三个网络组成,P网络输入的是12×12的图片,R网络输入的是24×24的图片,O网络输入的是48×48的图片。
所以要把celebA数据集处理成三种尺寸的图片。
又因为损失函数有两个,一个是置信度的损失,另一个是偏移量的损失。置信度的损失要用正样本和负样本做,偏移量的损失用正样本和部分样本做.
所以每种尺寸图片下面又要有三种不同的样本:正样本(置信度为1,整张人脸),负样本(置信度为0,不包含人脸),部分样本(置信度为2,包含人脸的一部分)。

这是celebA数据集的图片,红框是建议框,判断是正样本、负样本,部分样本的依据是:新生成的图片和建议框的重叠度(iou,iou的计算方法和代码在上一篇博客)
iou>0.4:正样本
0.15<iou<0.4:部分样本
iou<0.15负样本

比如:新生成的图片(蓝框)和红框的重叠度为0.35,认为是部分样本

新生成的图片(蓝框)和红框的重叠度为0.1,认为是负样本

新生成的图片(蓝框)和红框的重叠度为0.8,认为是正样本

celebA图片数据集:

这是两个坐标点的信息(左上角的点和右下角的点)


代码

import os
from PIL import Image
import numpy as np
import utils
import tracebackanno_src = r"G:\数据集\celebA\celebA(分卷形式,一起解压)\celebA\Anno\list_bbox_celeba.txt"
img_dir = r"G:\数据集\celebA\celebA(分卷形式,一起解压)\celebA\img\img_celeba"save_path = r"H:\dataset"for face_size in [12,24,48]:print("gen %i image" % face_size)# 样本图片存储路径positive_image_dir = os.path.join(save_path, str(face_size), "positive")negative_image_dir = os.path.join(save_path, str(face_size), "negative")part_image_dir = os.path.join(save_path, str(face_size), "part")for dir_path in [positive_image_dir, negative_image_dir, part_image_dir]:if not os.path.exists(dir_path):os.makedirs(dir_path)# 样本描述存储路径positive_anno_filename = os.path.join(save_path, str(face_size), "positive.txt")negative_anno_filename = os.path.join(save_path, str(face_size), "negative.txt")part_anno_filename = os.path.join(save_path, str(face_size), "part.txt")positive_count = 0negative_count = 0part_count = 0try:positive_anno_file = open(positive_anno_filename, "w")negative_anno_file = open(negative_anno_filename, "w")part_anno_file = open(part_anno_filename, "w")for i, line in enumerate(open(anno_src)):if i < 2:continuetry:# strs = line.strip().split(" ")# strs = list(filter(bool, strs))strs = line.strip().split()image_filename = strs[0].strip()print(image_filename)image_file = os.path.join(img_dir, image_filename)with Image.open(image_file) as img:img_w, img_h = img.sizex1 = float(strs[1].strip())y1 = float(strs[2].strip())w = float(strs[3].strip())h = float(strs[4].strip())x2 = float(x1 + w)y2 = float(y1 + h)px1 = 0#float(strs[5].strip())py1 = 0#float(strs[6].strip())px2 = 0#float(strs[7].strip())py2 = 0#float(strs[8].strip())px3 = 0#float(strs[9].strip())py3 = 0#float(strs[10].strip())px4 = 0#float(strs[11].strip())py4 = 0#float(strs[12].strip())px5 = 0#float(strs[13].strip())py5 = 0#float(strs[14].strip())#过滤字段if max(w, h) < 40 or x1 < 0 or y1 < 0 or w < 0 or h < 0:continueboxes = [[x1, y1, x2, y2]]#建议框坐标,因为有很多[x1, y1, x2, y2],所以用二维# 计算出人脸中心点位置cx = x1 + w / 2cy = y1 + h / 2# 使正样本和部分样本数量翻倍for _ in range(5):# 让人脸中心点有少许的偏移w_ = np.random.randint(-w * 0.5, w * 0.5)h_ = np.random.randint(-h * 0.5, h * 0.5)cx_ = cx + w_cy_ = cy + h_# 让人脸形成正方形,并且让坐标也有少许的偏离side_len = np.random.randint(int(min(w, h) * 0.8), np.ceil(1.25 * max(w, h)))#新框边长x1_ = np.max(cx_ - side_len / 2, 0)y1_ = np.max(cy_ - side_len / 2, 0)x2_ = x1_ + side_leny2_ = y1_ + side_lencrop_box = np.array([x1_, y1_, x2_, y2_])#新框坐标# 计算坐标的偏移值offset_x1 = (x1 - x1_) / side_lenoffset_y1 = (y1 - y1_) / side_lenoffset_x2 = (x2 - x2_) / side_lenoffset_y2 = (y2 - y2_) / side_lenoffset_px1 = 0#(px1 - x1_) / side_lenoffset_py1 = 0#(py1 - y1_) / side_lenoffset_px2 = 0#(px2 - x1_) / side_lenoffset_py2 = 0#(py2 - y1_) / side_lenoffset_px3 = 0#(px3 - x1_) / side_lenoffset_py3 = 0#(py3 - y1_) / side_lenoffset_px4 = 0#(px4 - x1_) / side_lenoffset_py4 = 0#(py4 - y1_) / side_lenoffset_px5 = 0#(px5 - x1_) / side_lenoffset_py5 = 0#(py5 - y1_) / side_len# 剪切下图片,并进行大小缩放face_crop = img.crop(crop_box)#crop抠图face_resize = face_crop.resize((face_size, face_size))iou = utils.iou(crop_box, np.array(boxes))[0]if iou > 0.4:  # 正样本positive_anno_file.write("positive/{0}.jpg {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15}\n".format(positive_count, 1, offset_x1, offset_y1,offset_x2, offset_y2, offset_px1, offset_py1, offset_px2, offset_py2, offset_px3,offset_py3, offset_px4, offset_py4, offset_px5, offset_py5))positive_anno_file.flush()face_resize.save(os.path.join(positive_image_dir, "{0}.jpg".format(positive_count)))positive_count += 1elif 0.15<iou < 0.4:  # 部分样本part_anno_file.write("part/{0}.jpg {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15}\n".format(part_count, 2, offset_x1, offset_y1,offset_x2,offset_y2, offset_px1, offset_py1, offset_px2, offset_py2, offset_px3,offset_py3, offset_px4, offset_py4, offset_px5, offset_py5))part_anno_file.flush()face_resize.save(os.path.join(part_image_dir, "{0}.jpg".format(part_count)))part_count += 1elif iou < 0.15:negative_anno_file.write("negative/{0}.jpg {1} 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n".format(negative_count, 0))negative_anno_file.flush()face_resize.save(os.path.join(negative_image_dir, "{0}.jpg".format(negative_count)))negative_count += 1# 生成负样本,因为按照上面的方法负样本数量不够_boxes = np.array(boxes)for i in range(5):side_len = np.random.randint(face_size, min(img_w, img_h) / 2)x_ = np.random.randint(0, img_w - side_len)y_ = np.random.randint(0, img_h - side_len)crop_box = np.array([x_, y_, x_ + side_len, y_ + side_len])if np.max(utils.iou(crop_box, _boxes)) < 0.15:face_crop = img.crop(crop_box)face_resize = face_crop.resize((face_size, face_size), Image.ANTIALIAS)negative_anno_file.write("negative/{0}.jpg {1} 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n".format(negative_count, 0))negative_anno_file.flush()face_resize.save(os.path.join(negative_image_dir, "{0}.jpg".format(negative_count)))negative_count += 1except Exception as e:traceback.print_exc()finally:positive_anno_file.close()negative_anno_file.close()part_anno_file.close()

结果


样本的txt文件,里面是:图片名,置信度,四个偏移量

MTCNN中celebA数据集的处理(一个置信度,两个坐标点)相关推荐

  1. sklearn中的数据集2 (Covertype 一个关于植被的数据集)

    Covertype 简介 植被覆盖类型数据集,包括位于美国科罗拉多州北部罗斯福国家森林的四个荒野区域.样本总数为581012,在kaggle中,样本划分为训练集(training set):15120 ...

  2. 利用celebA数据集训练MTCNN网络

    利用celebA数据集训练MTCNN网络 celebA数据集简介 训练数据的处理 网络和训练 侦测部分 结果展示 有问题可以联系我的邮箱:2487429219@qq.com 关于MTCNN网络可以看我 ...

  3. celeba数据集_人脸识别常用数据集介绍(附下载链接)及常用评估指标

    为什么要聊到数据集这个话题..因为数据集的noise对训练效果的影响很大!很长一段时间MegaFace的效果都上不去,就是因为数据集噪声的原因.而且自己在训练人脸的时候,如果不对数据集的噪声和属性有一 ...

  4. MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现

    MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现 一.重叠度iou 从在一张照片上框人脸时,因为图像金字塔的原因可能会把人脸框两次以上,每个框的坐标为[X1,Y1X2,Y2,C], ...

  5. MTCNN中的IOU详解

    在MTCNN中,NMS的使用里面最重要的有一环就是IOU, 下面就来说一说IOU(Intersection Over Union)的基本原理: IOU的意思是交并比,下图可以看到求IOU过程会遇到的几 ...

  6. 目标检测中NMS和mAP指标中的的IoU阈值和置信度阈值

    有时候路走的太远,会忘了为什么要出发. 学习亦如是 在目标检测中,经常看到置信度阈值和IoU阈值这两个关键参数,且NMS计算和mAP计算中都会有这两个,那它们的区别是什么?本文就这个问题做一次总结. ...

  7. 转:使用 PHP 直接在共享内存中存储数据集

    概述 共享内存是一种在相同机器中的应用程序之间交换数据的有效方式.一个进程可创建一个可供其他进程访问的内存段,只要它分配了正确的权限.每个内存段拥有一个惟一的 ID(称为 shmid),这个 ID 指 ...

  8. CelebA数据集在Linux下解压

    近来在公司实习时,接触了一些人脸检测.识别相关的项目,在人脸关键点检测的项目中需要用到CelebA数据集,关于这个数据集的介绍,网上有很多博客分析,此处附上知乎大佬的数据集分析博客:CelebA数据集 ...

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

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

最新文章

  1. 安装Android SDK需要选择哪些,开始为Android开发,我应该选择安装哪些SDK?
  2. 第六阶段 小学期(一)——电子商务
  3. private修饰的变量如何调用_梳理c++ const 修饰函数
  4. Pycharm 配置autopep8到菜单
  5. java抽象和接口的理解_Java接口实现与抽象类的区别理解 | 彬菌
  6. [转]大数据环境搭建步骤详解(Hadoop,Hive,Zookeeper,Kafka,Flume,Hbase,Spark等安装与配置)
  7. mysql用户_MySQL用户权限管理详解
  8. 求矩阵中各列数字的和
  9. CAD输出的局部平面坐标数据配准转换到WGS84坐标系
  10. c语言调用sqlite
  11. echarts时间散点图_ECharts 实现地图散点图(下)
  12. Sharepoint2010 表单认证常见问题
  13. =====BJmeter性能测试小接=====
  14. [!] No `Podfile' found in the project directory.
  15. 樊登读书会用事实说话读后感_用事实说话樊登读书笔记
  16. MIPS单周期CPU
  17. 中国设备工程杂志中国设备工程杂志社中国设备工程编辑部2022年第18期目录
  18. Vs code 进行硬件设计实用插件-语法高亮、语法检查、自动例化、Testbench生成、对齐、代码块等
  19. 车载颚式移动破碎机让资源重生,刻不容缓
  20. 微信6个新表情衍生职场好戏,『程序员』版也太太太真实了吧……

热门文章

  1. office2016实用论文排版技巧
  2. 图像开运算、闭运算、形态学梯度、“礼帽”和“黑帽”
  3. 淘宝聚划算怎么做?大神导航,一个神奇的网站从此开启大神之路
  4. 【C++】小而快的Ninja
  5. html5 plus 支付,h5+ app 第三方支付调用步骤
  6. Server returns invalid timezone.问题解决
  7. 前端基础学习之h5c3-购物车宣传页动画小练习
  8. java软件工程师自我评价_java软件工程师自我评价
  9. 如何看待2022届秋招嵌入式开发岗位薪资大涨?
  10. 怀旧服1区人口最多的服务器,wow怀旧服服务器人口普查-wow怀旧服服务器人口分布_牛游戏网...