老闆給了你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位絕色美女的照片被髮到老闆面前,而這五位都是老闆最喜歡的。

 

以下進入高能編碼區。

介紹下程序實現方法原理:

首先遍歷文件夾下所有圖片,識別其面部區域,並摳圖保存。

主要使用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)

 

小決策,大學問。

此項目代碼已經開源。但是千張美女圖片因怕涉嫌傳播**...,所以不敢亂放。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章