给你1000位美女照片,你如何选出5位最漂亮的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给你1000位美女照片,你如何选出5位最漂亮的相关的知识,希望对你有一定的参考价值。
老板给了你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
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位绝色美女的照片被发到老板面前,而这五位都是老板最喜欢的。
耗时计算:3秒+3秒+3秒 = 9秒干活 ,外加 30分钟休息。
看一张结果中第一位美女的全图,是不是还可以?
以下进入高能编码区。
介绍下程序实现方法原理:
首先遍历文件夹下所有图片,识别其面部区域,并抠图保存。
主要使用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) |
小决策,大学问。
此项目代码已经开源。但是千张美女图片因怕涉嫌传播**...,所以不敢乱放。
关注公众号,输入“识别美女”,便可获得资源下载地址,当然是整个项目的源码大包(180M),下下来后,请阅读readme了解运行环境。
个人博客地址 http://www.adbtime.com/view/428 可见公众号,欢迎访问
原创文章,转载请注明出处,感谢!
以上是关于给你1000位美女照片,你如何选出5位最漂亮的的主要内容,如果未能解决你的问题,请参考以下文章