老板给了你1000张美女model照片,让你选5位出来参加展会,请问你如何选?
A:我会嗖嗖嗖过一遍,然后随机挑5张顺眼的。
紫薯:还不如让老板随机选顺眼的。
B:开个小组会,集合大家的意见选5个最漂亮的。
紫薯:你真不在乎老板想看到哪几位美女么?
C:随机选5个身材满足标准、容貌可佳的就可以了。
紫薯:你的决策也很随机哇。
紫薯觉得:我们需要考虑老板最喜欢长成什么样的女生,需要知道来看台的客户对美女的偏好,要知道哪些美女的长相与产品、场景更相配。
所以...最好还是用上图像识别技术,让“万能”的算法帮你搞定,不然搞完这些保证你看到美女就想吐。
为了简单起见,这里只考虑老板喜好这一个因素。因为无论因素多少,我们只需要确定一个标准美女便可。
紫薯的解决方案:
第一步:紫薯:“老板,你觉得哪个明星最漂亮?” 老板:“ 孙俪”。
第二步:小叔花了3秒钟找了张孙俪姐姐的照片。
第三步:又花了3秒钟把自己的那套人脸识别、人脸相似度匹配的软件程序打开。(mac pro,)
第四步:跑程序自动匹配从1000张原始图片中抠出人脸结果,花了30分钟,这期间我喝了个茶看看了远处的风景。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20class="python plain">......
modelin
/
1
(
9
)(
8
).jpg
modelin
/
1
(
9
)(
9
).jpg
modelin
/
1
(
9
).jpg
modelin
/
Alyson
-
Hannigan
-
5.jpg
modelin
/
Alyson_Hannigan_200512.jpg
modelin
/
fangbingbing.jpg
modelin
/
gaoyuanyuan.jpg
modelin
/
libingbing.jpg
modelin
/
linqingxia.jpg
modelin
/
linzhiling.jpg
modelin
/
liushishi.jpg
modelin
/
liuyifei.jpg
modelin
/
lizhi.jpg
modelin
/
Miley
-
Cyrus
-
Photos.jpg
modelin
/
Screenshot at Dec
11
22
-
10
-
55.png
modelin
/
shuwei.jpg
modelin
/
tangwei.jpg
modelin
/
zhangmanyu.jpg
detect
1015
faces, cost
1777.025725
seconds!
/
/
/
/
/
耗时
下面是给每张图片打分,733张有效人脸,耗时35s:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19......
图片名称:[
1
(
9
)(
7
)face.jpg], 与目标图片相似度
=
[
74
]
图片名称:[
1
(
9
)(
8
)face.jpg], 与目标图片相似度
=
[
64
]
图片名称:[
1
(
9
)(
9
)face.jpg], 与目标图片相似度
=
[
66
]
图片名称:[
1
(
9
)face.jpg], 与目标图片相似度
=
[
54
]
图片名称:[Alyson
-
Hannigan
-
5face
.jpg], 与目标图片相似度
=
[
52
]
图片名称:[Alyson_Hannigan_200512face.jpg], 与目标图片相似度
=
[
46
]
图片名称:[gaoyuanyuanface.jpg], 与目标图片相似度
=
[
44
]
图片名称:[libingbingface.jpg], 与目标图片相似度
=
[
42
]
图片名称:[linqingxiaface.jpg], 与目标图片相似度
=
[
58
]
图片名称:[linzhilingface.jpg], 与目标图片相似度
=
[
56
]
图片名称:[liushishiface.jpg], 与目标图片相似度
=
[
44
]
图片名称:[liuyifeiface.jpg], 与目标图片相似度
=
[
44
]
图片名称:[lizhiface.jpg], 与目标图片相似度
=
[
54
]
图片名称:[Miley
-
Cyrus
-
Photosface.jpg], 与目标图片相似度
=
[
44
]
图片名称:[Screenshot at Dec
11
22
-
10
-
55face
.jpg], 与目标图片相似度
=
[
56
]
图片名称:[tangweiface.jpg], 与目标图片相似度
=
[
44
]
图片名称:[zhangmanyuface.jpg], 与目标图片相似度
=
[
48
]
detect
733
faces, cost
35.284538999999995
seconds!
/
/
/
/
/
/
耗时
前五名的结果出来了
1 2 3 4 5图片名称: (
52
)face.jpg , 与目标图片相似度
=
94
图片名称:
0
(
142
)face.jpg , 与目标图片相似度
=
94
图片名称:
1
(
27
)face.jpg , 与目标图片相似度
=
94
图片名称:
1
(
26
)(
5
)face.jpg , 与目标图片相似度
=
92
图片名称:
1
(
2
)face.jpg , 与目标图片相似度
=
92
第五步:又花了3秒钟,5位绝色美女的照片被发到老板面前,而这五位都是老板最喜欢的。
耗时计算:3秒+3秒+3秒 = 9秒干活 ,外加 30分钟休息。
看一张结果中第一位美女的全图,是不是还可以?
以下进入高能编码区。
介绍下程序实现方法原理:
首先遍历文件夹下所有图片,识别其面部区域,并抠图保存。
主要使用opencv的人脸识别算法,有兴趣的可以了解下haar特征,核心代码如下:
1 2 3 4 5 6 7 8start
=
time.clock()
for
functions">file
in
files:
##mac系统,删除SD_Store隐藏文件
if
'DS_Store'
in
file
:
continue
print
(
'modelin/'
+
file
)
outFaces(
'modelin/'
+
file
,
file
[:
-
4
])
print
(
"detect %d faces, cost %s seconds!"
%
(
len
(files),time.clock()
-
start))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def
detectFaces(image_path):
img
=
cv2.imread(image_path)
face_cascade
=
cv2.CascadeClassifier(
"cvdata/haarcascades/haarcascade_frontalface_default.xml"
)
if
img.ndim
=
=
3
:
gray
=
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
else
:
gray
=
img
faces
=
face_cascade.detectMultiScale(gray, scaleFactor
=
1.1
, minNeighbors
=
3
, minSize
=
(
10
,
10
),
flags
=
cv2.CASCADE_SCALE_IMAGE)
result
=
[]
for
(x,y,width,height)
in
faces:
result.append((x,y,x
+
width,y
+
height))
return
result
图像识别最常用的是通过颜色特征判断。图片相似性主要通过比较汉明距离来确定。像手指一样,每张图片也有自己的图像指纹,它是由一组哈希算法运算后得到的二进制结果。所谓汉明距离,便是一组二进制数据变成另一组二进制数据所需步骤。两张相同的图片,汉明距离便是0.
遍历抠出的面部区域文件夹,使用pHash(感知哈希算法)进行图片指纹的对比:
1 2 3 4 5 6 7for
fname
in
files:
image2
=
Image.
open
(
'modelout/'
+
fname)
score
=
classify_DCT(imageStand,image2)
dicAll[fname]
=
score
print
(
"图片名称:[%s], 与目标图片相似度=[%d]"
%
(fname,(
100
-
score)))
print
(
"detect %d faces, cost %s seconds!"
%
(
len
(files),time.clock()
-
start))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def
simmilar_people(image1,image2,size
=
(
32
,
32
),part_size
=
(
8
,
8
)):
assert
size[
0
]
=
=
size[
1
],
"size error"
assert
part_size[
0
]
=
=
part_size[
1
],
"part_size error"
image1
=
image1.resize(size).convert(
'L'
).
filter
(ImageFilter.BLUR)
image1
=
ImageOps.equalize(image1)
matrix
=
get_matrix(image1)
DCT_matrix
=
DCT(matrix)
List
=
sub_matrix_to_list(DCT_matrix, part_size)
middle
=
get_middle(
List
)
code1
=
get_code(
List
, middle)
image2
=
image2.resize(size).convert(
'L'
).
filter
(ImageFilter.BLUR)
image2
=
ImageOps.equalize(image2)
matrix
=
get_matrix(image2)
DCT_matrix
=
DCT(matrix)
List
=
sub_matrix_to_list(DCT_matrix, part_size)
middle
=
get_middle(
List
)
code2
=
get_code(
List
, middle)
return
comp_code(code1, code2)
小决策,大学问。
此项目代码已经开源。但是千张美女图片因怕涉嫌传播**...,所以不敢乱放。
关注公众号,输入“识别美女”,便可获得资源下载地址,当然是整个项目的源码大包(180M),下下来后,请阅读readme了解运行环境。
个人博客地址 http://www.adbtime.com/view/428 ,欢迎访问
原创文章,转载请注明出处,感谢!