日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

关于Celeba人脸数据集的介绍

發布時間:2023/12/8 pytorch 103 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Celeba人脸数据集的介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CeleA是香港中文大學的開放數據,包含10177個名人身份的202599張圖片,并且都做好了特征標記,這對人臉相關的訓練是非常好用的數據集。

官網鏈接

網盤鏈接

別看只是一堆人臉,他們很貼心地做好了特征標記,也就是說,你可以找到類似下面這些標簽:

40種屬性:

01 5_o_Clock_Shadow 胡子,(清晨刮臉的人傍晚已長出的短髭 ) -1?
02 Arched_Eyebrows 柳葉眉 1?
03 Attractive 有魅力的 1?
04 Bags_Under_Eyes 眼袋 -1?
05 Bald 禿頭的 -1?
06 Bangs 劉海 -1?
07 Big_Lips 大嘴唇 -1?
08 Big_Nose 大鼻子 -1?
09 Black_Hair 黑發 -1?
10 Blond_Hair 金發 -1?
11 Blurry 睡眼惺松的 -1?
12 Brown_Hair 棕發 1?
13 Bushy_Eyebrows 濃眉 -1?
14 Chubby 豐滿的 -1?
15 Double_Chin 雙下巴 -1?
16 Eyeglasses 眼鏡 -1?
17 Goatee 山羊胡子 -1?
18 Gray_Hair 白發,灰發 -1?
19 Heavy_Makeup 濃妝 1?
20 High_Cheekbones 高顴骨 1?
21 Male 男性 -1?
22 Mouth_Slightly_Open 嘴輕微的張開 1?
23 Mustache 胡子 -1?
24 Narrow_Eyes 窄眼 -1?
25 No_Beard 沒有胡子 1?
26 Oval_Face 瓜子臉,鵝蛋臉 -1?
27 Pale_Skin 白皮膚 -1?
28 Pointy_Nose 尖鼻子 1?
29 Receding_Hairline 發際線; 向后梳得發際線 -1?
30 Rosy_Cheeks 玫瑰色的臉頰 -1?
31 Sideburns 連鬢胡子,鬢腳 -1?
32 Smiling 微笑的 1?
33 Straight_Hair 直發 1?
34 Wavy_Hair 卷發; 波浪發 -1?
35 Wearing_Earrings 戴耳環 1?
36 Wearing_Hat 帶帽子 -1?
37 Wearing_Lipstick 涂口紅 1?
38 Wearing_Necklace 帶項鏈 -1?
39 Wearing_Necktie 戴領帶 -1?
40 Young 年輕人 1

文件含義

進入百度網盤可以看到多個文件,但是都是干什么的呢?應該下載哪個來用呢?

在動手下載之前,最好先讀讀README文件,里面有比較詳細的描述,這里只簡單介紹一下:

  • Img文件夾下是所有圖片,圖片又分三類文件:

img_celeba.7z純“野生”文件,也就是從網絡爬取的沒有做裁剪的圖片
img_align_celeba_png.7z把“野生”文件裁剪出人臉部分之后的圖片,png格式
img_align_celeba.zipjpg格式的,比較小(推薦使用,直接解壓即可)

圖中可以看到,人臉圖片的名字只是簡單的編號,那膚色、發色、眼鏡、性別等特征標簽在哪呢,在之前的“Anno”文件夾中:

第一個“list_attr_celeba.txt”文本文件就記錄了每一張圖片的特征標簽:

如圖所示,第一行表示圖片個數,第二行是特征類型,以空格分開,可以看到有超多特征。下面的行就是每張圖片的標記了,第一列是圖片名,后面的每個數字對應每一個特征,1表示正例,-1表示反例。

這樣我們就有了圖片和特征描述了,那怎么篩選出我們要的人臉圖片呢?

假設我們要把所有人臉分成戴了眼鏡的和沒戴眼鏡的兩份集合,來訓練從戴眼鏡到不戴眼鏡的轉換。一個個地人眼去看去分類顯然是不現實的,描述文件的意義就在于此。

我們可以寫一份Python代碼來遍歷txt中每一張圖片對應的“Eyeglasses”屬性列,看是不是1,從而判斷對應圖片是否戴了眼鏡。

數一數可以知道“Eyeglasses”是第16個屬性,這樣,我們可以讀取這份屬性描述txt,遍歷每一行,看對應列是否是1,從而將圖片名篩分到兩個txt中去:

  • f = open("list_attr_celeba.txt")
  • newTxt = "glass.txt"
  • newf = open(newTxt, "a+")
  • newNoTxt = "noGlass.txt"
  • newNof = open(newNoTxt, "a+")
  • #跳過第一行202599
  • line = f.readline()
  • #跳過第二行屬性名稱
  • line = f.readline()
  • #第三行開始操作
  • line = f.readline()
  • while line:
  • array = line.split()
  • if (array[16] == "-1"):
  • new_context = array[0] + '\n'
  • newNof.write(new_context)
  • else:
  • new_context = array[0] + '\n'
  • newf.write(new_context)
  • line = f.readline()
  • lines = len(newf.readlines())
  • print ("There are %d lines in %s" % (lines, newTxt))
  • lines = len(newNof.readlines())
  • print ("There are %d lines in %s" % (lines, newNoTxt))
  • f.close()
  • newf.close()
  • newNof.close()
  • 篩選圖片

    得到兩個記錄了有無戴眼鏡的圖片名集合txt后,我們就可以根據這個來篩選圖片了。

    圖片共二十多萬張,我們如果采用針對一個txt中每個圖片名都去從頭到尾到文件夾里找一次的方案,處理起來就太慢了。

    這里我們采取更快速的方法,遍歷文件夾中所有圖片,對于遇到的每個圖片名(當然,因為文件夾中不止圖片,所以先判斷是否是圖片,也就是后綴是否是.jpg),去記錄有無戴眼鏡的兩個txt中分別找是否包含該圖片名,哪個包含,則把該圖片移動到對應文件夾下去。

    這里還可以優化的是,在txt中找圖片名時,也不能每次要找都從頭到尾找,而要記錄上次找到的位置,因為圖片名時按順序排好的,所以下一張要找的圖片名一定會在下面的行,而不會在之前出現過的行,這樣也可以提速。

    由于兩個txt中行數不一致(有無戴眼鏡的圖片數量不同),所以要判斷當一個txt全部找完后,之后就不要再去該txt中找了,更不要繼續往后移動行,這樣會出錯的。

    整體優化完成后代碼如下:

  • mport os
  • import shutil
  • nof = open("noGlass.txt")
  • hasf = open("glass.txt")
  • noLine = nof.readline()
  • hasLine = hasf.readline()
  • list = os.listdir("./CelebA/Img/img_align_celeba")
  • hasGo = True
  • noGo = True
  • for i in range(0, len(list)):
  • imgName = os.path.basename(list[i])
  • if (os.path.splitext(imgName)[1] != ".jpg"): continue
  • noArray = noLine.split()
  • if (len(noArray) < 1): noGo = False
  • hasArray = hasLine.split()
  • if (len(hasArray) < 1): hasGo = False
  • if (noGo and (imgName == noArray[0])):
  • oldname= "./CelebA/Img/img_align_celeba/"+imgName
  • newname="./data/noGlass/"+imgName
  • shutil.move(oldname, newname)
  • noLine = nof.readline()
  • elif (hasGo and (imgName == hasArray[0])):
  • oldname= "./CelebA/Img/img_align_celeba/"+imgName
  • newname="./data/hasGlass/"+imgName
  • shutil.move(oldname, newname)
  • hasLine = hasf.readline()
  • print(imgName)
  • nof.close()
  • hasf.close()
  • 方形臉部截取

    ?

  • from PIL import Image
  • import face_recognition
  • import os
  • list = os.listdir("./")
  • for i in range(0, len(list)):
  • imgName = os.path.basename(list[i])
  • if (os.path.splitext(imgName)[1] != ".jpg"): continue
  • image = face_recognition.load_image_file(imgName)
  • face_locations = face_recognition.face_locations(image)
  • for face_location in face_locations:
  • # Print the location of each face in this image
  • top, right, bottom, left = face_location
  • # print("A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))
  • # You can access the actual face itself like this:
  • width = right - left
  • height = bottom - top
  • if (width > height):
  • right -= (width - height)
  • elif (height > width):
  • bottom -= (height - width)
  • face_image = image[top:bottom, left:right]
  • pil_image = Image.fromarray(face_image)
  • pil_image.save('face%s'%imgName)
  • 這份代碼就是遍歷文件夾中的所有圖片,用face_recognition庫去識別出人臉位置的上下左右坐標,基本識別得出的坐標就已經是方形的了,特殊情況下會有一個像素的誤差,所以我強制對比了一次寬高,不一樣就改成一樣的,對裁剪的影響也不會很大。需注意的是要運行這份代碼需要安裝face_recognition庫和PIL庫,如何安裝就可以直接搜索教程了。

    這里我們就得到了所有高寬相等的人臉二次裁剪圖片。

    還要注意的一點是這里只保證了每張圖片自身高寬相等,圖片之間的尺寸并不一定是同樣大小的。

    參考:

    https://blog.csdn.net/Cloudox_/article/details/78432517

    總結

    以上是生活随笔為你收集整理的关于Celeba人脸数据集的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。