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

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

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

更新

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

前言

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

用到的关键库

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

下面介绍基本使用

  1. 先准备几张想要爬的明星脸,放在环境的根目录,也就是aistudio环境目录

  1. 修改自己需要的下载配置

  1. 点击它

  1. 这里就可以看到获取到多少张人物的头像了

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小时哦~ 注册地址

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值