Python在人工智能测试领域的一次实践
https://mp.weixin.qq.com/s?__biz=MjM5OTI2MTQ3OA==&mid=2652181223&idx=1&sn=8aa118340ff33231e2554eef8ec78251&chksm=bcdf96ae8ba81fb803d0fce02d7434abb865b83f737efc3b7e3a346248f5abe1865484b6e3b5&scene=0#rd
目标
实现一个遍历文件夹,并排列组合该文件夹下图片的py脚本。
1背景需求
因测试AI人脸识别项目,从LFW图像库中,我们要准备两组数据:
1. 3万组预期结果为“匹配”的图像集合
2. 3万组预期结果为“不匹配”的图像集合
组长让我们写个python脚本自动生成测试图像数据。简单介绍一下LFW,它是无约束自然场景人脸识别数据集,主要测试人脸识别的准确率,该数据集由13000多张全世界知名人士互联网自然场景不同朝向、表情和光照环境人脸图片组成,共有5000多人,其中有1680人有2张或2张以上人脸图片。每张人脸图片都有其唯一的姓名ID和序号加以区分。
2整理思路
LFW数据集已经在我本地电脑上,它的结构是:一个LFW主文件夹,下面有5000多个以人名命名的子文件夹,子文件夹中是对应人名的人脸图片,图片命名规则是人名_0001.jpg.
创建3万组预期匹配的图像集合的过程如下:
1.从LFW子文件夹中,找出那些有2张或2张以上人脸图片的文件夹
2.从同一人名文件夹中取出不重复的2张人脸图片
3.循环取3万组不重复的数据(A_0001.jpg A_0002.jpg与A_0002.jpg A_0001.jpg视为重复数据)
4.写入一个txt文件
创建3万组预期不匹配的图像集合的过程如下:
1.让LFW子文件夹两两组合(5000多个人名文件夹共有一百多万种组合)
2.从组合的2个子文件夹中分别随机取出1张人脸图片
3.重复步骤2,3万次
4.写入txt文件
3遇到的问题及处理
1.如何遍历文件夹?
咨询了吴老后,知道了Python内置的os模块有个walk()方法,用于通过在目录树中游走输出在目录中的文件名。
os.walk()方法需要传入一个待遍历的文件路径,它返回的是一个三元组(root,dirs,files):
• root 指的是当前正在遍历的这个文件夹的本身的地址
• dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
• files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
import os
root_path = "F:\Faker\光荣之路"
for root, dirs, files in os.walk(root_path, topdown=True):
print(root, dirs, files)
运行结果:
2.如何实现找出那些人脸图片大于等于2的子文件夹?
根据os.walk()返回的files,我们可以通过len(files)判断该子文件夹下的图片张数是否满足条件
3.如何实现从同一个子文件中组合出不同的2张人脸图片?
咨询了组长,让我去了解下python内置itertools模块的combinations()方法。
combinations(iterable,r)创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序不重复组合。
迭代器还有个优势就是延迟计算,按需使用,从而提高开发体验和运行效率。
举个例子:
>>> import itertools
>>> l=[1,2,3,4,5]
>>> type(itertools.combinations(l,2))
<class 'itertools.combinations'>
>>> for i in itertools.combinations(l,2):
... print(i)
...
(1, 2)
(1, 3)
(1, 4)
(1, 5)
(2, 3)
(2, 4)
(2, 5)
(3, 4)
(3, 5)
(4, 5)
>>>
4.如何保证运行效率?
5749个人名,通过itertools.combinations()方法得到的人名组合很庞大,有16522626万种组合,而我们只需要3万种,所以需要加入一个判断,当我们取到3万条数据时,通过使用return语句结束遍历这个组合。
4实现代码
浙公网安备 33010602011771号