基于爬虫+人脸识别库实现指定人物自动采集
项目目的,为后面基于GAN的换脸大法做准备
更新
无需多张照片只需要一张原照就可以了
前言
如今大数据时代下的深度学习发展的火热,但是总是发现找不到合适的自己的数据集,现在基于python爬虫制作的脚本可以帮助我们获取到想要的明星脸了
用到的关键库
requests 用于访问网络请求的基本库re 正则表达式专用库,用于匹配想要的东西face_recognition 人脸识别专用库,可以用来判断两张人脸是否是同一人 开源地址以及paddle的人脸检测库 paddlehubcv2 图像处理库
下面介绍基本使用
先准备几张想要爬的明星脸,放在环境的根目录,也就是aistudio环境目录
修改自己需要的下载配置
点击它
这里就可以看到获取到多少张人物的头像了
vgg-face网络结构介绍
想要自己训练网络?
数据VGGFace由于训练需要花很长时间,先使用官方提供的工具使用
import requests
import re
video_name
= '关晓彤'
download_iter
= 3
person_pic
= ['gxt.jpg']
tolerance
= 0.45
def _download_video(
vid
=5531478263371949884,
chunk_size
=2048):
video_url
= 'https://haokan.baidu.com/v?vid=%s' % vid
save_filename
= '%s.mp4' % vid
headers
= {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
'referer': 'https://haokan.baidu.com/v?vid=16427198956923979611&pd=bjh&fr=bjhauthor&type=video'
}
try:
response
= requests
.get
(video_url
, headers
=headers
, verify
=False)
ret
= re
.search
(r
'<video class="video" src=(?P<src>.*?)></video>', response
.text
)
video_real_url
= ret
.group
('src')
except:
return False
response
= requests
.get
(video_real_url
, headers
=headers
, verify
=False, stream
=True)
length
= float(response
.headers
['content-length'])
cur_length
= length
f
= open(save_filename
, 'wb')
for content
in response
.iter_content
(chunk_size
=chunk_size
):
f
.write
(content
)
cur_length
-= chunk_size
cur_process
= 1 - cur_length
/ length
print('\r当前下载进度{}{:.2f}%'.format('>' * int(cur_process
* 100), cur_process
* 100), end
='')
print('%s下载完毕' % save_filename
)
f
.close
()
return True
def download_video(
v_info
='lissa',
download_iter
=1):
params
= {
'query': v_info
}
response
= requests
.get
('https://haokan.baidu.com/videoui/page/search', params
=params
)
vid
= re
.findall
(r
'"vid":"(?P<vid>\d+)"', response
.text
)
vid_
= []
for i
in range(download_iter
):
_download_video
(vid
[i
])
vid_
.append
(vid
[i
])
return vid_
vids
= download_video
(v_info
=video_name
,download_iter
=download_iter
)
try:
import face_recognition
except:
!pip install face_recognition
import cv2
import matplotlib
.pyplot
as plt
import paddlehub
as hub
import os
import face_recognition
os
.environ
["CUDA_VISIBLE_DEVICES"] = '0'
known_encodings
= []
for pic
in person_pic
:
known_encoding
= face_recognition
.face_encodings
(face_recognition
.load_image_file
(pic
))[0]
known_encodings
.append
(known_encoding
)
pic_index
= 0
mask_detector
= hub
.Module
(name
="pyramidbox_lite_mobile_mask")
for vid
in vids
:
video
= cv2
.VideoCapture
('%s.mp4' % vid
)
if not os
.path
.exists
(video_name
):
os
.mkdir
(video_name
)
while video
.isOpened
():
is_read
, frame
= video
.read
()
if not is_read
:
break
result
= mask_detector
.face_detection
(images
=[frame
,], use_gpu
=True)
for face
in result
[0]['data']:
top
= face
['top']
bottom
= face
['bottom']
left
= face
['left']
right
= face
['right']
unknown_image
= frame
[top
:bottom
, left
:right
]
unknown_encoding
= face_recognition
.face_encodings
(unknown_image
)
if not unknown_encoding
:
continue
results
= face_recognition
.compare_faces
(known_encodings
, unknown_encoding
[0], tolerance
=tolerance
)[0]
if results
:
cv2
.imwrite
(os
.path
.join
(video_name
, '%s.jpg' % pic_index
), unknown_image
)
pic_index
+= 1
print('\r获得%s照片%s张' % (video_name
,pic_index
), end
='')
效果如何
获取到的图片质量完全取决于视频的质量,以及tolerance的设置可以通过增加视频的数量来获取跟多的图片
展示
以爬取angelababy的图片来展示吧,因为本人脸盲,机器可能比我分的清除
原图片
获取到的
很小的图片也可以获取得到说明效果还不错,如果要使用大图片,可以自己进行判断筛选了
总结
欢乐时光总是那么短暂python果然很强大,简单的几行代码就可以实现自己想要的demo当然就便捷性而言,没有打包成脚本好
本人简述
热爱深度学习,热爱python全栈也不是不可以哈我在AI Studio上获得白银等级,点亮2个徽章,来互关呀~
运行
直接将代码fork到自己的项目里就可以运行了,从这里下载数据集贼快,虽然出自一家人的产品,但是这里下载东西真的良心网速,我发现了一个炒鸡棒的AI学习与实训社区!为我助力赢10小时免费算力,助力成功您可领100小时哦~ 注册地址