在看文献的时候偶然发现原来WiderFace有难度分类,但官网看半天,搜索半天也没有教程。
前言:在查了半天资料后发现,官方的难度分类写在了mat文件中,也就是matlib的格式,但我们可以利用scipy将分类读取出来。
一、下载WiderFace数据集:
WIDER FACE: A Face Detection Benchmark (shuoyang1213.me)
现在有腾讯下载节点,下载速度很快,顺便把标签文件也给下载下来(Face annotations文件)。
二、将WiderFace格式的标签文件转换为yolo的txt格式:
参考链接:Widerface数据集 | widerface数据集转成YOLO格式_widerface数据集转yolo数据集格式_Liaojiajia-2020的博客-CSDN博客
这篇文章的大佬写得很好。跟着步骤走基本上可以转换成功。
三、下载官网的mat分类文件:
在官网这里可以下载到eval_tools.zip压缩文件,解压,里面的ground_truth文件中就有难度分类的mat文件
在用matlib打开后发现不同难度的文件名是放在file_list中,点开发现是嵌套的list,我们可以利用scipy读取他们。
四、读取难度文件,并在val中找出对应的图片放到新文件夹中:
1.首先我们需要安装三个库scipy、shutil、Pillow(后面写分类label文件的时候发现根本用不上Pillow,但懒得改代码了).
2.然后运行下面代码:
只需要修改output_folder difficulty_file img_file改成注释对应的路径就行了。读取到的是4维ndarray套娃。
import shutil
import scipy.io as sio
import os
from PIL import Image
output_folder= r'F:\data\WiderFaceEasy\val\images' #难度分出来的图片的新路径
difficulty_file=sio.loadmat(r'E:\Wider Face_VOC\ground_truth\wider_easy_val.mat')['file_list']#你要读取的难度文件的路径
img_file=r'F:\data\WiderFace\val\images' #原本的整个验证集图片的存放位置
img_name_list=os.listdir(img_file)
#print(mat_file[0][0])
file_name=[]
i=k=0 ##i选择类别,widerface对图片进行了分类,j不变,k为二维数组一个为名称一个为类型,l0拿到具体文件名
count=0
def find_images_with_strings_and_copy(folder_path, destination_folder):
matching_files = []
# 创建目标文件夹(如果不存在)
if not os.path.exists(destination_folder):
os.makedirs(destination_folder)
for root, _, files in os.walk(folder_path):
for file_name in files:
file_path = os.path.join(root, file_name)
try:
# 使用Pillow库来打开图片文件
with Image.open(file_path) as img:
matching_files.append(file_path)
except Exception as e:
print(f"Error processing file {file_path}: {str(e)}")
# 复制匹配的图片到目标文件夹
for file_path in matching_files:
file_name = os.path.basename(file_path)
destination_path = os.path.join(destination_folder, file_name)
shutil.copy2(file_path, destination_path)
while (i<=60): #WiderFace中图片分类文件夹数目为60
if (i == 61):
break
file_name.append(((str(difficulty_file[i][0][k][0])).strip('[]')).strip('\'')+'.jpg')
if(k == (len(difficulty_file[i][0])) - 1):
i=i+1
k=0
count=count+1
continue
count=count+1
k=k+1
print(len(file_name))
find_images_with_strings_and_copy(img_file,file_name,output_folder)
运行完代码就能在文件夹中看到你选择的难度的图片,例如easy难度是3226张:
五、根据难度将label文件分出来:
基于上面得到的图片,我们很轻易就能将label文件也分出来。
import shutil
import scipy.io as sio
import os
label_dir=r'F:\data\WiderFace\val\labels' #原本的验证集的label文件夹位置
img_dir=r'F:\data\WiderFaceEasy\val\images' #对应难度的图片位置
outout_dir=r'F:\data\WiderFaceEasy\val\labels' #找出来的对应难度的label文件存放位置,即另存位置
difficulty_file=sio.loadmat(r'E:\Wider Face_VOC\ground_truth\wider_easy_val.mat')['file_list'] #测试用,无视
img_name_list=os.listdir(img_dir)
file_name=[]
count=0
i=k=0
print(len(img_name_list))
for i in range(len(img_name_list)):
img_name_list[i]=img_name_list[i].removesuffix('.jpg')+'.txt'
for i in range(len(img_name_list)):
count=count+1
shutil.copy2(os.path.join(label_dir,img_name_list[i]),os.path.join(outout_dir,img_name_list[i]))
print('over')
运行上面的代码后,我们就可以得到分难度后的label文件了(可以开始为水论文做实验了)
注意:如果想用imglabel打开看看标注上是否正确,得先在labels文件夹创一个classes文件写上face。
训练后: