python爬取人臉識別圖片數據集/py

前言

最近在做機器學習下的人臉識別的學習,機器學習這個東西有點暴力,很大程度上靠訓練的數據量來決定效果。為了找數據,通過一個部落格的指導,瀏覽了幾個很知名的數據集。

幾個大型數據集是通過發郵件申請進行下載,幾個小型數據集直接在網頁的鏈接下載,還有一個Pubfig數據集則是提供了大量圖片的鏈接來讓我們自己寫程式來下載。

權衡了數據量的需求,最後選擇Pubfig的數據集,於是就自己寫了一個python圖片採集程式,裡面用了urllib和requests兩種方法.

分析Pubfig提供的下載文件的特點

這個數據文件提供了在數據集中出現的所有人物

這個數據文件提供了每個人的urls

可以看出來這個數據集的處理其實非常簡單了,可以通過readlines的方式存進列表用空格分開一下數據就可以把urls提取出來了。

處理一下urls文件

urls在文件的中後部,寫個文件把它單純地提取出來,方便使用。 我單獨把Miley_Cyrus的部分提取出來放了一個txt文件

pic_url = []  with open('./Miley_Cyrus.txt') as f:      for i in f.readlines():          pic_url.append(i.strip('rn'))    urls = []  for s in pic_url:      _, _, _, url, _, _ = s.split()      urls.append(url)    # 寫入到文件裡面  with open('url.data', 'w') as f:      for i in urls:          f.write(i)          f.write('n')

爬取urls圖片

1. Urllibs方法

import urllib.request as request  import socket  import os    # 在同級目錄新建文件夾存圖片  os.mkdir('./img')    # 為請求增加一下頭  user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'  headers = ('User-Agent', user_agent)  opener = request.build_opener()  opener.addheaders = [headers]  request.install_opener(opener)    # 設定一下無響應時間,防止有的壞圖片長時間沒辦法下載下來  timeout = 20  socket.setdefaulttimeout(timeout)    # 從文件裡面讀urls  urls = []  with open('./url.data') as f:      for i in f.readlines():          if i != '':              urls.append(i)          else:              pass    # 通過urllibs的requests獲取所有的圖片  count = 1  bad_url = []  for url in urls:      url.rstrip('n')      print(url)      try:          pic = request.urlretrieve(url, './img3/%d.jpg' % count)          print('pic %d' % count)          count += 1      except Exception as e:          print(Exception, ':', e)          bad_url.append(url)      print('n')  print('got all photos that can be got')    # 把沒有抓取到的urls保存起來  with open('bad_url3.data', 'w') as f:      for i in bad_url:          f.write(i)          f.write('n')      print('saved bad urls')

2. Requests方法

import requests  import socket  import os    # 在同級目錄新建文件夾存圖片  os.mkdir('./img')    # 設定一下無響應時間,防止有的壞圖片長時間沒辦法下載下來  timeout = 20  socket.setdefaulttimeout(timeout)    # 從文件裡面讀urls  urls = []  with open('./url.data') as f:      for i in f.readlines():          if i != '':              urls.append(i)          else:              pass    # 為請求增加一下頭,獲取圖片  user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'  headers = {      'User-Agent': user_agent  }  bad_url = []  count = 1  for url in urls:      url.rstrip('n')      print(url)      try:          pic = requests.get(url, headers=headers)          with open('./img2/%d.jpg' % count, 'wb') as f:              f.write(pic.content)              f.flush()          print('pic %d' % count)          count += 1      except Exception as e:          print(Exception, ':', e)          bad_url.append(url)      print('n')  print('got all photos that can be got')    # 保存壞鏈接  with open('bad_url.data', 'w') as f:      for i in bad_url:          f.write(i)          f.write('n')      print('saved bad urls')