基于yolov labels格式,WiderFace数据集验证集难度分类

在看文献的时候偶然发现原来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。

                          训练后:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值