基于爬虫+人脸识别库实现指定人物自动采集
 
项目目的,为后面基于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小时哦~ 注册地址