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实现代码

 

posted @ 2018-09-21 17:49  rmticocean  阅读(115)  评论(0)    收藏  举报