999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于多線程爬蟲和OpenCV的人臉數據集制作方法

2020-02-22 03:09:35張值銘楊德剛
現代信息科技 2020年18期

張值銘 楊德剛

摘? 要:深度學習的訓練往往需要用到大量數據,但目前主要是以部分著名開源的數據集為主。其中開源的人臉數據集大多是基于西方人種,缺乏多樣性。針對以上問題,提出一種人臉數據集制作方法,用于后續訓練和研究。文章讓計算機承擔大部分工作,可以極大減輕人工收集制作以及篩選中耗費的時間精力,準確率高、不規范圖片少,是一種可行的人臉數據集收集制作方法。

關鍵詞:爬蟲;OpenCV庫;數據集;人臉;dlib庫

中圖分類號:TP391? ? 文獻標識碼:A? ? 文章編號:2096-4706(2020)18-0098-06

Abstract:Deep learning training often needs to use a lot of data,but at present it is mainly based on some famous open source data sets. Most of the open source face data sets are based on the Western race,and lack of diversity. In view of the above problems,a method of making face data set is proposed for subsequent training and research. In this paper,let the computer undertake most of the work,which can greatly reduce the time and energy consumed in the manual collection and production and screening,with high accuracy and less nonstandard images. It is a feasible method of face data collection and production.

Keywords:crawler;OpenCV library;datasets;face;dlib library

0? 引? 言

人臉數據集是一種通過僅對人物圖像的面部區域進行切割形成的數據集,被廣泛用于人臉識別[1],人臉生成對抗[2]等神經網絡模型的訓練,目前著名人臉數據集往往基于西方人種,如CelebA[3]人臉數據集等,缺乏對亞裔人種的支持,而兩者人臉特征存在較大差異,不利于在亞裔人群的使用場景中對模型進行優化,因此需要進行針對性的亞裔人臉數據集制作。作者通過在學校的服務器上制作亞裔人臉數據集為后續的人臉打卡系統,宿舍人臉門禁系統等實驗的研究提供基礎訓練數據。

傳統采集數據集的方式主要為人工進行拍攝后再進行后期加工,費時費力,且數據集的容量往往不足以用于深度學習訓練,因此急需一種在低人工成本的前提下,可以大量采集并且可以精確定位并裁剪人臉部分的人臉數據集收集和制作方法。

1? 相關技術介紹

1.1? 爬蟲模塊

爬蟲[4]是一種按照一定目的在互聯網上自動獲取對應信息或資源的技術。爬蟲往往偽裝成正常的瀏覽器,并通過向目標網站發起請求,獲取對應資源或信息后進行有目的的存儲或分析,如搜索引擎,通過向互聯網進行信息抓取提取和存儲,為用戶進行搜索提供便利。

本文使用的是基于Python語言的爬蟲技術,Python是一種提供各類第三方工具包的高級腳本語言,其中本文用于爬蟲的工具包有Requests,Beautiful Soup。Requests[5]是一種著名的開源Python HTTP第三方庫,該庫的優勢在于遵循PEP 20開發準則,API具有較高的可讀性,優雅簡潔等特點,比Python自帶的urllib和urllib2更靈活,使得開發人員更容易使用,Requests庫可以實現對服務器發出get或者post請求以及接收響應,該庫還可以通過傳遞請求頭參數模擬瀏覽器,使用代理等方式來規避反爬蟲策略,本文選用Requests并使用并發的方式進行爬取,可以有效地實現目的。Beautiful Soup 5[6]是一種網頁解析庫,該庫主要用于分析網頁信息,支持多種格式,如HTML,XML等,該庫可以方便地將獲取的網頁結構化,并提供了一系列方法方便開發者方便的定位和獲取目標內容。

1.2? OpenCV模塊

OpenCV[7]是一種跨平臺的開源的計算機視覺和圖像處理庫,該庫由C++語言編寫而成,同時提供了多種語言接口,本文使用其Python接口。該庫應用領域廣泛,如邊緣檢測,三維重建,圖像分割等。其中CascadeClassifier是OpenCV中用于目標檢測的級聯分類器,該分類器通過使用局部二值特征(Local Binary Pattern,LBP)導入特定的分類器文件,如人臉分類器haarcascade_frontalface_alt.xml,可以實現對人臉的檢測。如圖1所示,其中矩形框部分為使用此分類器后標注的人臉位置。

1.3? dlib模塊

dlib[8]是一種包含多種機器學習算法以及工具的開源庫,該庫基于C++語言編寫,同樣支持Python接口,該庫在學術以及工業領域有著廣泛的應用。該庫包含如深度學習算法,多分類支持向量機[9],以及多種聚類算法等,也包含一些圖像處理工具,比如常見的圖像操作工具邊緣查找,形態學工具等,甚至還包括一些網絡方面的工具,如簡單的HTTP服務器對象,以及TCP Socket API等。其中get_frontal_face_detector為dlib的人臉檢測器函數,若輸入圖片不包含人臉則該函數返回為空。本文使用此函數進行對人臉的篩選。

2? 項目分析與設計

2.1? 項目分析

本項目需要實現對人物圖片網站的爬取,存儲到硬盤中,然后將人臉部分切割出來并保存,實現人臉數據集的制作。在此過程中最重要的目的是在保證質量和速度的前提下降低人工復檢的難度,也就是使用程序處理的結果只能包含極少量的非人臉圖片,因此本文必須設計篩選模塊。

2.1.1? 爬蟲過程分析

項目首先需要實現對人物圖像網站的爬取,對不同類型人群的人臉數據集制作則需要找到對應目標網站,目的在于將該網站上所有亞裔人物圖像保存到硬盤中,用于后續的處理,同時由于單線程會在數據寫入,數據分析,等待服務器響應等過程耗費較多時間,無法充分利用帶寬,因此本文將使用多線程的方式進行爬取,爬取的速度主要取決于帶寬上限。

本文以wallhavean為例,首先進行網頁分析,打開wallhaven主頁:https://wallhaven.cc/,搜索asian people,會跳到亞洲人物圖片網頁:https://wallhaven.cc/search?q=id%3A449&categories=001&purity=100&sorting=relevance&order=desc&page=2,如圖2所示。

通過測試,發現其中網址中的page是對應網頁編號,使用for循環即可遍歷該網站所有頁面,使用火狐瀏覽器F12開發者工具,可以定位到每個頁面中圖片的href屬性值,如圖3所示。

其網頁DOM中a標簽的href屬性值為該圖片預覽圖地址,打開該網址,可以發現跳轉到了一個新的頁面,如圖4所示。

對該頁面中出現的大圖進行定位,發現該圖的src地址為:https://w.wallhaven.cc/full/qd/wallhaven-qdr6w5.jpg,通過訪問此地址,確認為最終的圖片地址,只要對該地址進行請求即可完成目標圖片的下載,圖5為最終的高清大圖。

2.1.2? 人臉處理過程分析

對爬蟲保存的所有人物圖片進行處理,使用OpenCV的級聯分類器,對保存下來的人物圖片進行面部識別,并將面部進行切割保存,同時由于僅使用OpenCV在進行人臉識別時的準確率不夠高,在原始圖像足夠多的情況下將產生大量不包含人臉部分的圖片,因此使用dlib模塊進行篩選,去掉不合格的部分。

2.2? 項目設計

項目設計包含四個方面,第一是使用爬蟲進行圖像收集,第二個是人臉識別模塊,使用OpenCV模塊實現對人臉的裁剪,第三個是篩選模塊,使用dlib模塊對裁剪的圖像進行篩選,去除不合格圖片,最后是人工復檢。具體流程如圖6所示。

2.3? 項目部分代碼

2.3.1? 爬蟲部分代碼

作者通過在學校實驗室服務器上運行home/lab/cqnu/face/spyder.py腳本,實現對目標網站的請求與網頁分析,獲取目標圖片的完整url地址,并以多線程的方式實現對圖片的爬取,其中部分代碼為:

#此函數實現對wallheaven頁面的請求,通過偽裝成瀏覽器獲取頁面信息

def request_url(page):

url='https://wallhaven.cc/search?q=id%3A449&categories=001&purity=100&sorting=relevance&order=desc&page={}'.format(str(page))

#此處傳遞不同的page參數可以實現請求不同的網頁

headers = {'User-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36','Referer':url,'Host':'wallhaven.cc'}

#請求頭參數,包含瀏覽器偽裝,Referer,以及Host,其中User-Agent用于偽裝成Windows系統下的谷歌瀏覽器,為常見的反爬蟲策略

time.sleep(random.randint(1,10))#此項為程序隨機休眠,為防止同一時間大量的請求被服務器認為是爬蟲

r=requests.get(url,headers=headers)#向服務器發出請求

if not r.status_code==200:#此處為判斷返回狀態碼,狀態為200代表正常,非200則結束函數

print(url,'status code error ',r.status_code)

return

r.encoding='gb2312'

r_text=r.text

r.close()#結束時關閉連接

return r_text#返回網頁數據

#此部分函數實現對頁面的分析,定位并找到高清圖片的url地址

def soup(r_text):

if not r_text:

print('soup is None')

return

#此處為判斷網頁數據是否為空,如果為空,則結束函數

soup=BeautifulSoup(r_text,'html.parser')#使用beautiful soup進行網頁數據分析

a_list=soup.find_all('a',class_='preview')#定位該網頁中縮略圖的位置

md5_text_list=[]#此數組為存儲縮略圖url中的特征字段

md5_text=a['href'].split('/')[-1]

fullPic_url_list=[]

for a in a_list:

md5_text=a['href'].split('/')[-1]#此項為特征字段,如eodqxl,為后續構成完整高清圖像url的關鍵

md5_text_list.append(md5_text)

#print(md5_text)

fullPic_url='https://w.wallhaven.cc/full/{}/wallhaven-{}.jpg'.format(md5_text[:2],md5_text)

#print(fullPic_url)#打印完整高清圖像url,其中第一個大括號為特征字段的前兩個字符,如eodqxl的前兩個字符為eo

#https://w.wallhaven.cc/full/qd/wallhaven-qdr6w5.jpg

fullPic_url_list.append(fullPic_url)

#print(fullPic_url_list)#打印該頁所有圖像的完整url地址

#返回特征字段,作為后續保存文件的文件名,返回完整圖像的url地址

return md5_text_list,fullPic_url_list

#此函數用于下載圖像并保存到硬盤中

def download(file_name,fullPic_url):

#保存圖片的文件夾絕對路徑,若不存在則創建該文件夾

root_dir=os.path.join('home/lab/cqnu/face/data/pic')

if not os.path.exists(root_dir):

os.makedirs(root_dir)

#此項為判斷文件是否存在,若存在則無需進行下面服務器請求等步驟,直接停止

file_path=os.path.join(root_dir,file_name+'.jpg')

if os.path.exists(file_path):

print('{} 已存在'.format(file_path))

return

headers={'User-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36','Host':'w.wallhaven.cc'}

r=requests.get(fullPic_url,stream=True,headers=headers)#向服務器發出請求

time.sleep(random.randint(1,10))#隨機休眠

if not r.status_code==200:

print('{} is wrong!status code error {}'.format(fullPic_url,r.status_code))

return 1

#返回狀態碼非200則停止函數

with open(file_path,'wb') as f:

print('正在寫入 :{}'.format(file_path))

for chunk in r.iter_content(chunk_size=8192):

#使用流式的方式進行下載時,將最大的字節流設置成8192,可以實現一邊下載一邊存儲

if chunk:

f.write(chunk)

f.flush()

r.close()#關閉連接

#此函數為封裝以上過程,方便后續使用多線程

def run_download(page):

r_text=request_url(page)

md5_text_list,fullPic_url_list=soup(r_text)

if not fullPic_url_list:

return

for md5_text,fullPic_url in zip(md5_text_list,fullPic_url_list):

download(md5_text,fullPic_url)

print('page %s download over'%str(page))#當每頁下載完成后,打印此信息

if __name__=='__main__':

for page in range(1,435):

p=Thread(target=run_download,args=(page,))#此處為使用多線程的方式進行爬取,傳入page參數即可

p.start()

2.3.2? 人臉分割部分代碼

編輯/home/lab/cqnu/face/detect.py腳本實現人臉檢測與分割,并將分割后的人臉進行保存,其中部分代碼為:

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#加載默認人臉檢測分類器

img = cv2.imread(src_img_path)#讀取圖片

faces = face_cascade.detectMultiScale(img,1.3,5)#獲取人臉坐標位置

for (x,y,w,h) in faces:#臉部的坐標數據,包括x,y坐標以及寬高

face_result = img[y:y+h, x:x+w]#根據坐標獲取人臉所在的矩形框內的像素數據

cv2.imwrite('face.jpg',face_result)#保存人臉圖片

2.3.3? 檢測部分代碼

編輯/home/lab/cqnu/face/check.py腳本實現對人臉圖片的檢測,并將所有不合格的圖片移除。其中部分代碼為:

def detect_face(img_path,detector):

img=cv2.imread(img_path)

detector = dlib.get_frontal_face_detector()#加載dlib人臉檢測方法

if detector(img,0):

#此處返回一個信號

#如果檢測到圖片包含人臉,則返回1,不處理

return 1

else:

#否則,返回0,進行剪切操作。

return 0

def copy_remove(signal,img_path,img_name):

#此函數接收一個信號,然后進行保存或剪切操作

trash_dir='home/lab/cqnu/face/data/trash'#非人臉部分的文件夾

if not signal:

#如果是丟棄信號,則將當前圖片剪切到新文件夾

dst_path=os.path.join(trash_dir,img_name)

shutil.move(img_path,dst_path)

print('{} 未檢測到人臉,已剪切。'.format(img_name))#打印剪切掉的文件名

3? 實驗對比

如表1所示,本文在依次使用OpenCV分割和dlib篩選后,進行人工統計,人臉總數占當前總樣本數的比例。

其中在僅使用OpenCV后,發現有大量非人臉部分圖片,如圖7所示,隨后再使用dlib進行篩選,雖然篩選的同時對部分人臉圖片誤刪除,圖8為丟棄的圖片,但最后剩下的人臉圖片中,僅含有極少量的不合格圖片,極大減輕了人工篩選的工作量,圖9為最終結果,證明了本文方法可行。

4? 結? 論

本文基于多線程爬蟲對某女性人物圖片網站進行了數據收集,并對人臉部分進行了切割和篩選,最終實現了人臉數據集的制作,證明了本文的可行性。在對其他人臉數據集的制作中,唯一有區別的就是爬蟲部分,需要對特定網站進行有針對性的爬蟲代碼編寫。同時由于不同圖片的大小不一,所切割的臉部大小也可能不一樣,后續可以自行使用縮放算法統一人臉圖片尺寸。本文的不足之處在于使用dlib進行篩選時誤刪了部分人臉圖像,如果在總體樣本較少的情況下可能會使得最終的數據集圖片數量偏少,這個過程的優化有待日后做進一步研究。

參考文獻:

[1] 王碩.基于神經網絡的人臉識別研究 [C]//第三十四屆中國(天津)2020IT、網絡、信息技術、電子、儀器儀表創新學術會議論文集.天津:天津市電子學會,2020:270-272.

[2] 仝宗和,劉釗.基于深度生成對抗網絡的模糊人臉增強 [J].計算機應用與軟件,2020,37(9):146-151+193.

[3] 李欣,張童,厚佳琪,等.基于深度學習的多角度人臉檢測方法研究 [J].計算機技術與發展,2020,30(9):12-17.

[4] 羅安然,林杉杉.基于Python的網頁數據爬蟲設計與數據整理 [J].電子測試,2020(19):94-95+31.

[5] 荀雪蓮,姚文彬.大數據網絡爬蟲技術在智慧圖書館信息資源建設上的應用 [J].北華航天工業學院學報,2020,30(4):20-22.

[6] 沈承放,莫達隆.beautiful soup庫在網絡爬蟲中的使用技巧及應用 [J].電腦知識與技術,2019,15(28):13-16.

[7] 廖周宇,王鈺婷,陳科良.基于OpenCV的人臉識別算法 [J].電子技術與軟件工程,2020(9):133-136.

[8] 王曉紅,韓嬌,李珊珊.基于人臉檢測器的實時視頻人臉檢測與跟蹤 [J].信息通信,2019(2):56-57.

[9] TAHA A,DARWISH A,HASSANIEN A E,et al. Arabian horse identification based on whale optimised multi-class support vector machine [J].International Journal of Computer Applications in Technology,2020,63(1-2):83-92.

作者簡介:張值銘(1994—),男,漢族,重慶人,碩士研究生,研究方向:機器學習、圖像處理;楊德剛(1976—),男,漢族,四川內江人,教授,博士,研究方向:神經網絡、圖像處理。

主站蜘蛛池模板: 天天综合网在线| 亚洲天堂区| 伊人久久综在合线亚洲2019| 亚洲午夜福利精品无码不卡 | 一本色道久久88综合日韩精品| 国产综合色在线视频播放线视 | 免费a在线观看播放| 国产一区二区三区夜色| 亚洲国产成人麻豆精品| 亚洲视频欧美不卡| 啦啦啦网站在线观看a毛片| 亚洲AⅤ波多系列中文字幕| 欧美特级AAAAAA视频免费观看| 精品国产福利在线| 日本一区二区三区精品国产| a色毛片免费视频| 成人久久精品一区二区三区| 四虎永久在线精品影院| 欧洲极品无码一区二区三区| 伊人成人在线视频| 欧美福利在线播放| 伊人久久大香线蕉影院| 一本久道久久综合多人| av手机版在线播放| 国产高清无码第一十页在线观看| 中文字幕一区二区人妻电影| 日韩专区欧美| 亚洲人人视频| 尤物国产在线| 免费看久久精品99| 亚洲香蕉在线| 国产成人精品无码一区二| 国产女人在线| 国产高清精品在线91| 少妇极品熟妇人妻专区视频| 亚洲国产第一区二区香蕉| 欧美一区日韩一区中文字幕页| 国产一线在线| 欧美狠狠干| 亚洲欧美另类视频| 福利视频99| 国产福利一区在线| 99久久国产综合精品2020| 特级毛片8级毛片免费观看| 欧类av怡春院| 男女男精品视频| 亚洲VA中文字幕| 国产综合精品一区二区| 亚洲经典在线中文字幕| 综合天天色| 色视频国产| 精品国产一区二区三区在线观看| 亚洲欧美成人综合| 五月天综合网亚洲综合天堂网| 亚洲成人播放| 91娇喘视频| 色老二精品视频在线观看| 日韩欧美高清视频| 久久青草热| 欧美中出一区二区| 亚洲午夜片| 99在线视频免费| 国产福利拍拍拍| 亚洲国产成人精品无码区性色| 国产白浆一区二区三区视频在线| 99热这里只有精品2| 国产视频欧美| 天天综合网亚洲网站| 四虎精品国产永久在线观看| 色首页AV在线| 欧美天堂久久| 国产永久在线视频| 久久窝窝国产精品午夜看片| 国产精品一老牛影视频| 99精品这里只有精品高清视频| 国产成人资源| 国产肉感大码AV无码| 丁香五月亚洲综合在线| 最新日本中文字幕| 国产真实乱人视频| 秘书高跟黑色丝袜国产91在线 | 亚洲大学生视频在线播放|