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) |
小決策,大學問。
此項目代碼已經開源。但是千張美女圖片因怕涉嫌傳播**...,所以不敢亂放。