基于爬虫+人脸识别库实现指定人物自动采集

tech2022-08-19  79

基于爬虫+人脸识别库实现指定人物自动采集

项目目的,为后面基于GAN的换脸大法做准备

更新

无需多张照片只需要一张原照就可以了

前言

如今大数据时代下的深度学习发展的火热,但是总是发现找不到合适的自己的数据集,现在基于python爬虫制作的脚本可以帮助我们获取到想要的明星脸了

用到的关键库

requests 用于访问网络请求的基本库re 正则表达式专用库,用于匹配想要的东西face_recognition 人脸识别专用库,可以用来判断两张人脸是否是同一人 开源地址以及paddle的人脸检测库 paddlehubcv2 图像处理库

下面介绍基本使用

先准备几张想要爬的明星脸,放在环境的根目录,也就是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小时哦~ 注册地址

最新回复(0)