基于爬虫+人脸识别库实现指定人物自动采集
- 项目目的,为后面基于GAN的换脸大法做准备
更新
- 无需多张照片只需要一张原照就可以了
前言
如今大数据时代下的深度学习发展的火热,但是总是发现找不到合适的自己的数据集,现在基于python爬虫制作的脚本可以帮助我们获取到想要的明星脸了
用到的关键库
requests
用于访问网络请求的基本库re
正则表达式专用库,用于匹配想要的东西face_recognition
人脸识别专用库,可以用来判断两张人脸是否是同一人 开源地址- 以及
paddle
的人脸检测库paddlehub
cv2
图像处理库
下面介绍基本使用
- 先准备几张想要爬的明星脸,放在环境的根目录,也就是
aistudio
环境目录
- 修改自己需要的下载配置
- 点击它
- 这里就可以看到获取到多少张人物的头像了
vgg-face网络结构介绍
想要自己训练网络?
- 数据VGGFace
- 由于训练需要花很长时间,先使用官方提供的工具使用
# 爬虫必要的模块
import requests
import re
video_name = '关晓彤' # 视频关键字
download_iter = 3 # 下载多少个视频
# person_pic = ['ab%s.jpg' % i for i in range(4)] # 人物的原图片,用于机器辨识,必须人自己筛选
person_pic = ['gxt.jpg']
tolerance = 0.45 # 越低辨识度越高,如果不想自己筛选建议低点 0.5左右为宜,如果生成了其他人物的脸还需调低
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小时哦~ 注册地址