Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

如何使用深度学习框架检索女Q*资源

$
0
0

情人节刚过,单身狗也想飙一把车。在这篇技术博客(资源的真义)中,日本开发者使用深度学习框架实现了根据图片检索女优的功能。


如何使用深度学习框架检索女Q*资源
开发环境:
PC: MacBook Air
CPU: 1.4 GHz Intel Core i5
内存: 4GB
普通的MacBook Air就可以实现这一程序,但是学习速度缓慢,由内存不足导致的各种Crash让开发工作变得非常痛苦。
0. 简单的流程
(1)收集各女优的图片
(2)使用dlib提取面部图像并调整为96*96的大小
(3)使用数据扩张(Data Augmentation)将女优面部图像的数据扩张到1000张
(4)将数据转换为numpy文件
(5)使用Chainer进行面部图像的学习
(6)在完成学习后的模型下,对任意图片进行预测
1. 收集女优图片
这段有很多方法但是并不好写出来,所以请略过。只介绍下可以使用python的Beautiful Soup4从网页上批量抓取数据。
将取得的女优图片按名字建立存储目录。
./folder
|--- /actress1
| |--- image1.jpg
| |--- image2.jpg
| |--- image3.jpg
|
|--- /actress2
| .
| .
|--- /actress3
.
.
.

2. 使用 dlib 提取面部图像

说到图像识别,OpenCV应该更加有名。不过在提取面部图像部分,dlib程序库的误识别比较少,因此这里使用dlib可以更加精确。

使用OpenCV和dlib进行人脸识别的比较可以参考这个视频:

dlib vs OpenCV face detection

(译者注: youtube 的视频,有必要的话可以搬过来。)

dlib不仅可以提取面部图像,也有识别眼睛,鼻子,脸形等要素的机能。

importos
import sys
import glob
import cv2
from PIL import Image
import dlib
"""
INPUT_DIR是收集的女优图片所在的目录名
OUTPUT_DIR是提取后的图片存放的目录名(文件夹的构成与INPUT_DIR一样)
"""
detector = dlib . get_frontal_face_detector()
# 取得各女优的目录列表
dir_list = os . listdir(INPUT_DIR)
for i, dir_name in enumerate(dir_list):
if not os . path . exists(os . path . join(OUTPUT_DIR, dir_name)):
os . mkdir(os . path . join(OUTPUT_DIR, dir_name))
image_files = glob . glob(os . path . join(INPUT_DIR, dir_name, "*.jpg"))
for j, image_file in enumerate(image_files):
img = cv2 . imread(image_file)
dets = detector(img, 1)
open_img = Image . open(image_file)
for k, d in enumerate(dets):
# 丢弃尺寸小于80的图像
if d . right() - d . left() < 80 or d . bottom() - d . top() < 80:
continue
image_file = image_file . replace(INPUT_DIR, OUTPUT_DIR)
# 如果一张图中提取了多个人脸,则进行重命名
output_file = image_file . replace('.jpg', '_' + str(k) + '.jpg')
cropped_img = open_img . crop((d . left(), d . top(), d . right(), d . bottom()))
cropped_img . resize((96,96)) . save(output_file, 'JPEG', quality = 100, optimize = True)

参考资料: dlib.net face_detect.py

3. 数据扩张 (Data augmentation)

在深度学习的过程中,如果数据量不够大,可以人工增加训练集的大小。通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据,这就是数据扩张(Data augmentation)。

importos
import math
import random
import glob
import numpy as np
from scipy import misc
from PIL import Image
import cv2
# 左右翻转
def flip_left_right (image):
return image[:, - 1:: - 1]
# 改变亮度
def random_brightness (image, max_delta = 63, seed = None):
img = np . array(image)
delta = np . random . uniform( - max_delta, max_delta)
image = Image . fromarray(np . uint8(img + delta))
return image
# 改变对比度
def random_contrast (image, lower, upper, seed = None):
factor = np . random . uniform( - lower, upper)
mean = (image[0] + image[1] + image[2]) . astype(np . float32) / 3
img = np . zeros(image . shape, np . float32)
for i in range(0, 3):
img[i] = (img[i] - mean) * factor + mean
return img
# 裁剪图片
def crop (image, name, crop_size, padding_size):
(width, height) = image . shape
cropped_images = []
for i in xrange(0, width, padding_size):
for j in xrange(0, height, padding_size):
box = (i, j, i + crop_size, j + crop_size) #left, upper, right, lower
cropped_name = name + '_' + str(i) + '_' + str(j) + '.jpg'
cropped_image = image[i:i + crop_size, j:j + crop_size]
resized_image = cv2 . resize(cropped_image, (IMAGE_SIZE, IMAGE_SIZE))
cropped_images . append(resized_image)
return cropped_images
# 数据扩张
# 将选取的图片文件进行「左右翻转」「改变亮度」「改变对比度」「裁剪」操作data_num次
def data_augmentation (image_files, data_num):
image_list = []
file_num = len(image_files)
for image_file in image_files:
image_list . append(misc . imread(image_file))
if file_num >= data_num:
return image_list
# 左右翻转
random . shuffle(image_list)
for image in image_list:
flipped_image = flip_left_right(image)
image_list . append(flipped_image)
if len(image_list) == data_num:
return image_list
# 随机亮度
random . shuffle(image_list)
for image in image_list:
brightness_image = random_brightness(image)
image_list . append(brightness_image)
if len(image_list) == data_num:
return image_list
# 随机对比度
random . shuffle(image_list)
for image in image_list:
contrast_image = random_contrast(image)

Viewing all articles
Browse latest Browse all 9596

Trending Articles