老板给了你1000张美女model照片,让你选5位出来参加展会,请问你如何选

7 篇文章 0 订阅
7 篇文章 0 订阅

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
20
......
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位绝色美女的照片被发到老板面前,而这五位都是老板最喜欢的。

 

以下进入高能编码区。

介绍下程序实现方法原理:

首先遍历文件夹下所有图片,识别其面部区域,并抠图保存。

主要使用opencv的人脸识别算法,有兴趣的可以了解下haar特征,核心代码如下:

1
2
3
4
5
6
7
8
start  =  time.clock()
for  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
7
for  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)

 

小决策,大学问。

此项目代码已经开源。但是千张美女图片因怕涉嫌传播**...,所以不敢乱放。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值