为啥我树莓派安装的虚拟键盘
sudo apt-get install matchbox-keyboard
和别人的不一样
为啥我树莓派安装的虚拟键盘
sudo apt-get install matchbox-keyboard
和别人的不一样
爬取人脸图片的核心思路就是获取中国明星的名字,然后使用明星的名字作为图片搜索的关键字进行获取图片,然后删除下载过程损坏的图片和没有包含人脸的图片,或者过多人脸的图片(我们只保存一张图片只包含一张人脸的图片)。
首先获取中国明星的名字,该功能主要在get_star_name.py
中实现。获取明显的名字核心代码如下,获取的名字不能保证百分之百正确,所以可能需要手动去检查。
# 获取明星的名字并保存到文件中
def get_page(pages, star_name):
params = []
# 设置访问的请求头,包括分页数和明星所在的地区
for i in range(0, 12 * pages + 12, 12):
params.append({
'resource_id': 28266,
'from_mid': 1,
'format': 'json',
'ie': 'utf-8',
'oe': 'utf-8',
'query': '明星',
'sort_key': '',
'sort_type': 1,
'stat0': '',
'stat1': star_name,
'stat2': '',
'stat3': '',
'pn': i,
'rn': 12})
# 请求的百度接口获取明星的名字
url = 'https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php'
x = 0
# 根据请求头下载明星的名字
for param in params:
try:
# 获取请求数据
res = requests.get(url, params=param, timeout=50)
# 把网页数据转换成json数据
js = json.loads(res.text)
# 获取json中的明星数据
results = js.get('data')[0].get('result')
except AttributeError as e:
print('【错误】出现错误:%s' % e)
continue
# 从数据中提取明星的名字
for result in results:
img_name = result['ename']
f.write(img_name + '\n',)
然后根据明星的名字从网上下载图片,该功能主要在download_image.py
中实现,以下就是下载图片的核心代码片段。
# 获取百度图片下载图片
def download_image(key_word, download_max):
download_sum = 0
str_gsm = '80'
# 把每个明显的图片存放在单独一个文件夹中
save_path = 'star_image' + '/' + key_word
if not os.path.exists(save_path):
os.makedirs(save_path)
while download_sum < download_max:
# 下载次数超过指定值就停止下载
if download_sum >= download_max:
break
str_pn = str(download_sum)
# 定义百度图片的路径
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&' \
'word=' + key_word + '&pn=' + str_pn + '&gsm=' + str_gsm + '&ct=&ic=0&lm=-1&width=0&height=0'
try:
# 获取当前页面的源码
result = requests.get(url, timeout=30).text
# 获取当前页面的图片URL
img_urls = re.findall('"objURL":"(.*?)",', result, re.S)
if len(img_urls) < 1:
break
# 把这些图片URL一个个下载
for img_url in img_urls:
# 获取图片内容
img = requests.get(img_url, timeout=30)
img_name = save_path + '/' + str(uuid.uuid1()) + '.jpg'
# 保存图片
with open(img_name, 'wb') as f:
f.write(img.content)
with open('image_url_list.txt', 'a+', encoding='utf-8') as f:
f.write(img_name + '\t' + img_url + '\n')
download_sum += 1
if download_sum >= download_max:
break
except Exception as e:
download_sum += 1
continue
下载图片完成之后,有很多损坏的图片,需要把这些损坏的图片删除,该功能主要在delete_error_image.py
实现。下面是删除损坏图片的核心代码片段。
# 删除不是JPEG或者PNG格式的图片
def delete_error_image(father_path):
# 获取父级目录的所有文件以及文件夹
image_paths = []
for root, dirs, files in os.walk(father_path):
for file in files:
image_paths.append(os.path.join(root, file))
for image in tqdm(image_paths):
try:
# 获取图片的类型
image_type = imghdr.what(image)
# 如果图片格式不是JPEG同时也不是PNG就删除图片
if image_type is not 'jpeg' and image_type is not 'png':
os.remove(image)
continue
# 删除灰度图
img = numpy.array(Image.open(image))
if len(img.shape) is 2:
os.remove(image)
except:
os.remove(image)
下载的图片中可能没有人脸,或者包含多张人脸,所以我们要把这些图片删除掉,该功能主要在delete_more_than_one.py
中实现。删除没有人脸或者过多人脸图片的关键代码片段如下。
# 删除两个人脸以上的图片或者没有人脸的图片
def delete_image(result, image_path):
try:
face_num = int(result['result']['face_num'])
if face_num is not 1:
os.remove(image_path)
else:
face_type = result['result']['face_list'][0]['face_type']['type']
probability = result['result']['face_list'][0]['face_type']['probability']
if face_type == 'cartoon' and probability > 0.8:
os.remove(image_path)
except:
os.remove(image_path)