WIDER FACE数据集转YOLO格式
1. 引出问题
本人最近在做毕设相关内容,第一阶段目标是通过目标检测来统计课堂人数,因此需要对人脸和人头进行目标检测。模型方面没什么好说的无脑用YOLO,数据集方面,人脸部分找到了来自港中文的WIDER FACE数据集。但是解压后发现标注数据并不是YOLO格式的,因此通过分析后写了一个简单的脚本进行转换。

2. 标注数据转YOLO格式
2.1 源代码
通过分析发现原标注数据的格式如下:
[图片路径]
[该图片中检测框数量]
[左上角x坐标 左上角y坐标 检测框宽 检测框高 …(一些额外信息)]
…
因此得到如下格式转换代码:
import os
from PIL import Imageparent_path = "P:/Graduation_Design/Dataset/WIDER_FACE/"def convert_to_yolo_format(input_file, output_dir, image_dir):with open(input_file, 'r') as f:lines = f.readlines()i = 0while i < len(lines):image_path = lines[i].strip() # Get the relative path of imagenum_boxes = int(lines[i + 1].strip()) # Get the number of boxes# Path of the label filelabel_path = os.path.join(output_dir, os.path.basename(image_path).replace('.jpg', '.txt'))os.makedirs(os.path.dirname(label_path), exist_ok=True)# Get the Absolute Path of the imageimage_abs_path = os.path.join(image_dir, image_path)# Open the image to get the real size of itwith Image.open(image_abs_path) as img:img_width, img_height = img.size# Create the file and write data inwith open(label_path, 'w') as label_file:for j in range(num_boxes):# Fetch the box data (x_min, y_min, width, height)box_data = list(map(int, lines[i + 2 + j].strip().split()))x_min, y_min, width, height = box_data[:4]# Calculate the center coordinate (x_center, y_center)x_center = (x_min + width / 2)y_center = (y_min + height / 2)# Convert to the relative coordinatesx_center /= img_widthy_center /= img_heightwidth /= img_widthheight /= img_height# The class is defaulted by 0label_file.write(f"0 {x_center} {y_center} {width} {height}\n")# Update the index and jump to the next imagei += 2 + (1 if num_boxes == 0 else num_boxes)if __name__ == "__main__":# Modify the additional section by your own pathinput_path = parent_path+"wider_face_split/"output_path = parent_path+"wider_for_yolo/"input_file_pre = "wider_face_"input_file_sub = "_bbx_gt.txt"if not os.path.exists(output_path):os.makedirs(output_path)# Train and Validationdatasetfile = ["train", "val"]for category in datasetfile:convert_to_yolo_format(input_path + input_file_pre + category + input_file_sub,output_path + category + "/labels",parent_path+f"WIDER_{category}/WIDER_{category}/images")
2.2 使用方法
- 首先修改代码第五行的
parent_path变量,修改成自己解压后WIDER FACE数据集所在的路径。 - 接着在主程序部分将
input_path改成自己下载的标注数据所在文件夹路径 - 随后在主程序部分将
output_path改成自己需要导出YOLO格式标注数据的路径
3. 合并图片到一个目录
标注数据格式转换完成后,由于原数据集文件夹中对不同情景下的图片做了一个分类,而YOLO训练时要求所有训练图片在一个文件夹下,因此训练前还需要将数据集所有图片copy到一个文件夹下。
3.1 源代码
import os
import shutildef copy_images(src_dir, dest_dir):# 确保目标目录存在if not os.path.exists(dest_dir):os.makedirs(dest_dir)# 递归查找所有图片for root, _, files in os.walk(src_dir):for file in files:if file.lower().endswith(('.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.webp')):src_path = os.path.join(root, file)dest_path = os.path.join(dest_dir, file)# 如果目标文件已存在,可以选择覆盖或跳过if not os.path.exists(dest_path):shutil.copy2(src_path, dest_path) # 保留原文件元数据print(f"Copied: {src_path} -> {dest_path}")else:print(f"Skipped (already exists): {dest_path}")# 配置源文件夹和目标文件夹路径
train_source_folder = r"P:\Graduation_Design\Dataset\WIDER_FACE\WIDER_train\WIDER_train\images"
train_destination_folder = r"P:\Graduation_Design\Dataset\WIDER_FACE\WIDER_train\WIDER_train\data"
val_source_folder = r"P:\Graduation_Design\Dataset\WIDER_FACE\WIDER_val\WIDER_val\images"
val_destination_folder = r"P:\Graduation_Design\Dataset\WIDER_FACE\WIDER_val\WIDER_val\data"# 执行复制
copy_images(train_source_folder, train_destination_folder)
copy_images(val_source_folder, val_destination_folder)
3.2 使用方法
- 首先将
train_source_folder和val_source_folder修改为自己解压后的WIDER FACE数据集的训练集和验证集的images路径 - 接着将
train_destination_folder和val_destination_folder修改为自己导出转换后的标注数据的路径
4. 使用YOLO模型进行训练
经过上面的标注数据格式转换和图片合并两个步骤后,确保你得到了train和val两个路径:

并且这两个文件夹中的结构应该都如下图所示:

这里的classes.txt只需要写一个Face或者人脸即可
一切准备就绪后建立一个data.yaml文件填入如下内容:
train: P:/Graduation_Design/Dataset/WIDER_FACE/wider_for_yolo/train # 这里改成自己处理后的训练集路径
val: P:/Graduation_Design/Dataset/WIDER_FACE/wider_for_yolo/val # 这里改成自己处理后的验证集路径nc: 1 # 类别数
names: ['face'] # 类别名称
至此便可以通过加载这个data.yaml文件完成YOLO模型的训练了。
相关文章:
WIDER FACE数据集转YOLO格式
1. 引出问题 本人最近在做毕设相关内容,第一阶段目标是通过目标检测来统计课堂人数,因此需要对人脸和人头进行目标检测。模型方面没什么好说的无脑用YOLO,数据集方面,人脸部分找到了来自港中文的WIDER FACE数据集。但是解压后发现…...
项目启动的基本配置
开启驼峰命名 如果字段名与属性名符合驼峰命名规则,MyBatis会自动通过驼峰命名规则映射。 在application.yml配置文件中,可以添加以下配置来开启驼峰命名规则: mybatis:configuration:map-underscore-to-camel-case: true 这段配置的作用…...
Ubuntu桌面突然卡住,图形界面无反应
1.可能等待几分钟,系统会自动反应过来。你可以选择等待几分钟。 2.绝大多数情况系统是不会反应过来的,这时候可以进入tty终端直接注销用户。 (1)Ubuntu有6个tty终端,按住CtrlAltF1可以进入tty1终端,(同理CtrlAltF2&a…...
Next.js系统性教学:拦截路由与路由处理器
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 1. 路由拦截 (Intercepting Routes) 1.1 什么是路由拦截? 1.2 配置拦截路由 1.3 示例:模态框预览 1.4 使用场景 2. 路由处理器 (Route Handl…...
Python编码风格
Python代码的常用排版格式主要遵循PEP 8规范,这是Python社区广泛接受的编码风格指南。以下是一些关键的排版格式要求: 一、缩进 使用4个空格作为缩进级别,不要使用Tab键,更不能混合使用Tab和空格。 二、行长度 每行代码的最大…...
flask创建templates目录存放html文件
首先,创建flask项目,在pycharm中File --> New Project,选择Flask项目。 然后,在某一目录下,新建名为templates的文件夹,这时会是一个普通的文件夹。 然后右击templates文件夹,选择Unmark as …...
微信小程序里的小游戏研发需要什么技术栈
研发小程序里的小游戏通常需要以下技术栈: 前端技术 HTML5 / CSS3:用于构建游戏的界面布局和样式。JavaScript:作为核心编程语言,实现游戏的逻辑和交互。小程序开发框架:如微信小程序的开发框架,了解其 API…...
2024年上半年网络工程师案例分析真题及答案解析
2024年上半年网络工程师案例分析真题及答案解析 1、试题一(20分) 阅读以下说明,回答问题。 [说明]某高校网络拓扑如下图所示,两校区核心(CORE-1,CORE-2),出口防火墙(NGFW-1,NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收效,校区相距40km。两校区默认由本地出…...
Ant Design Vue v4版本如何解决1px没有被postcss-px2rem转成rem的问题
背景说明 如果你的 Ant Design Vue 项目有要做适配的需求,那首先要选择一种适配方案。笔者选择的是用 postcss-px2rem 进行适配。笔者在配置了 postcss-px2rem的相关配置后,发现 postcss-px2rem 没有对 Ant Design Vue 进行适配。在网上看了一些文章之后…...
武汉科技大学《2024年814自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《武汉科技大学814自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...
【锂电池实战】A123磷酸铁锂在线参数识别-一阶戴维南模型
A123磷酸铁锂在线参数识别-一阶戴维南模型 提要 理论介绍:一篇就够了,为你答疑解惑:锂电池一阶模型-在线参数辨识(附代码)_在线参数辨识方法-CSDN博客 数据源:Battery Data | Center for Advanced Life Cycle Engineering 打包下载地址:A123-DST-US06-FUDS-25.zip资源…...
Java多线程与线程池技术详解(四)
接受失败:“失败是什么?没有什么,只是更走近成功一步;成功是什么?就是走过了所有通向失败的路,只剩下一条路,那就是成功的路。”这句话很好地诠释了如何看待失败的问题,即每一次跌倒…...
树莓派开发笔记
一. 登录方式 1.1 方式一:HDMI视频线 1.2 方式二:串口 查看串口有否被加密,默认情况下树莓派串口和蓝牙连接,需先断开蓝牙连接,串口才能用于数据通信。 1.2.1 如何使用串口登录 打开SD卡根目录的"config.txt"文件,将以下内容添加在最后并且保存。这样就停止…...
【数据结构】遍历二叉树
遍历二叉树的算法描述(递归定义) 先序遍历 若二叉树为空,则空操作; 否则 (1)访问根节点 (2)先序遍历左子树 (3)先序遍历右子树 中序遍历 若二叉树为空…...
嵌入式蓝桥杯学习7 产生PWM
Cubemx配置 打开cubemx,前面的配置看上文,这里主要配置定时器产生PWM波。 以PA1的TIM2-CH2通道为例进行演示。 1.在Timers中打开TIM2,将Channel2配置为PWM Generation CH2。 2.将Clock Source 选择为Internal Clock。 3.配置Paramater Settings中的参…...
档案学实物
档案工作 档案工作的性质 服务性 文化性 管理性 政治性 科学性 档案工作的地位 档案工作的效益 社会性,隐蔽性,滞后性 档案工作的发展规律 档案收集 档案收集工作的内容意义 档案收集工作的具体要求 档案室的档案收集工作 档案馆的档案收集工作 档案…...
数据清洗代码:缺失值,异常值,离群值Matlab处理
目录 基本介绍程序设计参考资料基本介绍 一、过程概述 本过程适用于处理SCADA系统采集到的数据,以及具有类似需求的数据集。处理步骤包括缺失值处理、异常值处理和离群值处理,旨在提升数据质量,增强数据的相关性,同时保持数据的原始特征和随机性。 二、缺失值处理 对于SC…...
Windows设备go环境安装配置
一、下载go安装包 官网链接:All releases - The Go Programming Language (google.cn) 安装过程比较简单,这里不再赘述,可参考这位博主的文章。本文重点在环境配置。golang环境详细安装、配置_golang安装-CSDN博客 二、环境变量配置 1.添…...
导体、半导体和绝缘体
半导体可以根据不同的组合去改变电阻,所以可以用来制作芯片。...
shell 6 if条件判断与for循环结构 (泷羽sec)
声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面,了解网络安全领域的见闻,了…...
3步实现AutoHotkey脚本独立运行:Ahk2Exe编译工具完全指南
3步实现AutoHotkey脚本独立运行:Ahk2Exe编译工具完全指南 【免费下载链接】Ahk2Exe Official AutoHotkey script compiler - written itself in AutoHotkey 项目地址: https://gitcode.com/gh_mirrors/ah/Ahk2Exe 你是否厌倦了每次运行AutoHotkey脚本都需要安…...
IDEA 2018.2.3 下 Maven 依赖包消失?别慌,可能是版本兼容性在作祟
IDEA 2018.2.3 下 Maven 依赖包消失的深度排查指南 当你打开一个尘封已久的老项目,准备继续维护或迁移时,突然发现IDEA的External Libraries里空空如也,只剩下孤零零的JDK包,整个项目文件一片飘红——这种场景对许多维护历史代码库…...
将HermesAgent项目接入Taotoken的详细配置步骤与注意事项
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 将HermesAgent项目接入Taotoken的详细配置步骤与注意事项 本文旨在为开发者提供一份清晰的指南,帮助你将HermesAgent项…...
Flutter GetX实战:从Provider迁移到GetX,我的开发效率提升了多少?
Flutter GetX实战:从Provider迁移到GetX的效率革命 当Flutter开发团队面临状态管理方案的选择时,往往会陷入一种甜蜜的烦恼——官方推荐的Provider虽然稳定可靠,但第三方库GetX却以"全家桶"式的解决方案不断吸引开发者的目光。作为…...
解锁你的音乐宝藏:ncmdump让网易云音乐文件自由播放
解锁你的音乐宝藏:ncmdump让网易云音乐文件自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 当你精心收藏的网易云音乐只能在特定客户端播放时,那种被束缚的感觉是否让你感到无奈?想象一下…...
用Keras和MNIST数据集,5分钟搞定一个图像去噪的CNN自编码器(附完整代码)
5分钟实战:用Keras构建图像去噪自编码器的极简指南 当一张布满噪点的老照片在AI处理后重现清晰画面时,这种"数字魔法"背后往往是自编码器在发挥作用。作为深度学习领域的瑞士军刀,自编码器不仅能用于图像去噪,还在数据压…...
终极指南:如何在Mac上免费备份和导出微信聊天记录
终极指南:如何在Mac上免费备份和导出微信聊天记录 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而懊恼?或是需要…...
如何在Mac上完美读写NTFS硬盘:Free NTFS for Mac终极指南
如何在Mac上完美读写NTFS硬盘:Free NTFS for Mac终极指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management…...
生物信息学逆向解析mRNA疫苗序列:从公开数据组装BNT-162b2与mRNA-1273的基因蓝图
1. 项目概述与背景解析 最近在生物信息学和疫苗研究领域,一个名为“NAalytics/Assemblies-of-putative-SARS-CoV2-spike-encoding-mRNA-sequences-for-vaccines-BNT-162b2-and-mRNA-1273”的项目引起了我的注意。这个项目标题看起来很长,但核心非常明确&…...
dotai:将AI大模型无缝集成到Shell终端的智能助手工具
1. 项目概述:当AI遇上你的终端如果你是一个重度命令行用户,每天在终端里敲击着ls、cd、git commit这些命令,有没有那么一瞬间,希望有个助手能帮你自动补全、解释命令,甚至直接帮你写出复杂的管道操作?dotai…...
