第1关:计算机眼中的图片
代码文件
#encoding=utf8
import cv2
def get_img(img_path, save_path):
'''
img_path: 图片存储路径
save_path: 图片保存路径
img: 处理后的图片
'''
# ********* Begin *********#
# 加载图片
img = cv2.imread(img_path)
# 将图片尺寸转换成300x300x3
img = cv2.resize(img, (300, 300))
# 保存图片
cv2.imwrite(save_path, img)
# ********* End *********#
return img
题目描述
任务描述
本关任务:利用openCV
对图片进行相应的处理。
相关知识
为了完成本关任务,你需要掌握:1.计算机眼中的图片,2.如何利用openCV
处理图片。
计算机眼中的图片
图片在计算机中以像素矩阵的形式储存,每个像素值在0
到255
之间,对于灰度图片,它只有一个通道,如下图:
对于人类而言,我们知道这是数字8
,而对于计算机,所有图片都是一堆数字。相比灰度图片,彩色图片稍微复杂一点,它有RGB三个通道,每一个通道对应着一个如上图中的像素矩阵。
如何利用openCV处理图片
openCV
是一款功能非常强大的计算机视觉库,在这里,我们学习一些基本的处理图片的方法。我们要对一张图片进行处理,首先我们得获取它,具体代码如下:
import cv2
#加载图片
img = cv2.imread(img_path)
其中,cv2.imread()
即为获取图片的方法,其中需要填写的参数img_path
即图片在计算机中所储存的路径。
加载图片后,我们可以改变图片的尺寸,即宽高,使它变成我们需要的大小:
import cv2
#将图片尺寸转换成HxWx3
img = cv2.resize(img,(H,W))
其中,cv2.resize()
为改变图片尺寸的方法,参数img
为你需要改变的图片,H
为你需要设定成多高,W
为你需要设定成多宽。
将图片处理后,我们还需要保存它:
import cv2
#保存图片图片
cv2.imwrite(save_path, img)
其中,cv2.imwrite()
为保存图片的方法,参数save_path
为你将图片保存的位置,img
为你所需保存的图片。
编程要求
根据提示,在右侧编辑器补充代码,实现改变图片尺寸与保存图片方法。
测试说明
程序会调用你实现的方法对图片进行处理,处理后图片与正确图片L1
距离均值小于10
则视为通关,否则输出处理后图片与正确图片L1
距离。
开始你的任务吧,祝你成功!
第2关:人物性别识别
代码文件
# -*- coding: utf-8 -*-
from load_face_dataset import get_img_and_label
from keras.models import load_model
def get_acc(data_path, model_path):
'''
data_path: 数据所在路径
model_path: 模型所在路径
'''
# ********* Begin *********#
# 加载测试数据
data, label = get_img_and_label(data_path)
# 加载模型
model = load_model(model_path)
# 计算正确率
_, acc = model.evaluate(data, label, verbose=0)
# ********* End *********#
return acc
题目描述
任务描述
本关任务:使用keras
调用已训练好模型对图片中人物性别进行预测。
相关知识
为了完成本关任务,你需要掌握:1.计算机是如何识别人物性别,2.使用keras
识别人物性别流程。
计算机是如何识别人物性别
如何识别人物性别这个对我们人类来说是非常简单的任务,我们一眼就能识别出上图中是一位女性,而对于计算机来说,想要识别出图中人物性别就没这么容易了。因为,对于任何图片,在计算机中都是一堆数字。那么,我们该如何让我们的计算机能够识别人物性别呢?首先,我们得构造一个模型,这个模型就像我们初高中所学的函数,你输入一个x
,它就输出一个y
。而我们这个模型,输入的是图片,输出的是性别类型。如下图所示:
相信大家都记得,函数它的输入跟输出都应该是数字。对于图片来说,它本身就是以像素矩阵的形式储存在计算机中,输出我们则可以用0
来表示女性,1
来表示男性。当然这只是一种选择,在深度学习中我们通常使用另外一种形式[0,1]
表示女性,[1,0]
表示男性。不管哪种方式,我们都把问题转换成了去求函数f(.)的表达式。只要求出正确的表达式,就能对人物进行正确的性别识别。
而在图像问题中,我们常用的是卷积神经网络模型,如何训练模型,得到能正确识别性别的流程大致如下:
首先,我们搭建好模型后,会随机的为模型的参数赋值。这个时候,模型并不能准确的识别出人物的性别,如上图,它认为图中人物是男性的可能为0.8
,女性的可能性为0.2
,而我们知道,正确情况应该为男性可能性为0
,女性可能性为1
,即真实情况。这个时候,我们将模型的预测情况与真实情况结合构造出一个损失函数,这个损失函数你可以当作是用来衡量预测值与真实值差异的一个指标。很明显,预测值与真实值越接近越好,即损失函数值越接近0
越好。而优化器就是用来达到这一目的的。优化器不断的使损失函数变小,从而达到更新模型参数的目的。最后,我们就能得到一个能够准确预测的模型。
使用keras识别人物性别流程
keras
是一个高层神经网络API
,我们使用它来实现人物性别识别是非常方便的。使用keras
实现人物性别识别的第一部就是得获取数据,有了数据才能对模型进行训练。这里获取数据的方法已经给大家写好了,直接调用就可以了,代码如下:
#导入获取数据的方法
from load_face_dataset import get_img_and_label
#加载测试数据
data,label = get_img_and_label(data_path)
其中,get_img_and_label()
是获取图像和标签的方法,data_path
是数据存储的路径,data
与label
是我们获取的图像与图像相对应的标签。
由于训练模型需要一定的时间,所以已经将模型提前训练好,大家只需加载模型,就能使用模型来进行预测。代码如下:
#导入加载模型方法
from keras.models import load_model
#加载模型
model = load_model(model_path)
其中,load_model()
是加载模型的方法,model_path
为模型存储的路径。model
为我们所加载的模型。
最后我们就可以对加载的数据进行预测了:
#计算正确率
_,acc = model.evaluate(data,label,verbose=0)
其中,model.evaluate
为测试模型的方法,data
,label
为输入的图像与对应的标签。acc
为模型预测的正确率。
编程要求
根据提示,在右侧编辑器补充代码,实现对人物性别进行预测,并返回正确率的方法。
测试说明
程序会调用你实现的方法,若正确率大于0.95
则视为通关。
开始你的任务吧,祝你成功!
第3关:人脸检测
代码文件
# -*- coding: utf-8 -*-
import cv2
def face_detection(img_path, img_save_path, model_path):
'''
img_path: 待识别图片路径
img_save_path: 图片保存路径
model_path: 模型所在路径
'''
# ********* Begin *********#
# 加载图片
img = cv2.imread(img_path)
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载模型
face_cascade = cv2.CascadeClassifier(model_path)
# 获取识别框坐标
face_rects = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
# 将识别框加入图片中
for (x, y, w, h) in face_rects:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 保存图片
cv2.imwrite(img_save_path, img)
# ********* End *********#
# 返回所有检测到的人脸坐标
return face_rects
# 使用示例
# face_detection('/path/to/image.jpg', '/path/to/save_image.jpg', '/path/to/haarcascade_frontalface_default.xml')
题目描述
任务描述
本关任务:利用openCV
对图片进行相应的处理。
相关知识
为了完成本关任务,你需要掌握:1.人脸检测,2.如何利用openCV
实现人脸检测。
人脸检测
在上一关,我们已经知道如何去检测图片中人物的性别。然而,在真实项目中,我们不仅仅是需要知道图片中人物的性别,有时候还需要将图片中人脸的位置检测出来。
如上图,我们用一个方框将人脸部分给划分出来,人脸检测就是需要找出这个方框的正确位置。需要将检测框位置确定下来需要知道四个参数:
x:检测框左上角点的横坐标。
y:检测框左上角点的纵坐标。
w:检测框宽的值。
h:检测框高的值。
如何确定这四个参数的值其实与上一关相似,都需要构建一个损失函数再进行优化,只不过上一关是分类问题,而这一关是回归问题。
如何利用openCV实现人脸检测
跟其它任务一样,要进行人脸检测首先得加载待检测图片:
import cv2
#加载图片
img = cv2.imread(img_path,1)
#转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
其中,cv2.imread()
为加载图片方法,参数img_path
为待识别图片路径,1
表示加载BGR
图片,接下来再使用cv2.cvtColor()
方法将图片转换为灰度图。img
为待处理图片,cv2.COLOR_BGR2GRAY
表示将BGR
图转换为灰度图。
然后我们再加载已经训练好的检测模型:
#加载模型
face_cascade = cv2.CascadeClassifier(model_path)
cv2.CascadeClassifier()
为加载模型方法,model_path
为模型存放路径。
利用训练好的模型,我们就能检测出人脸的位置,代码如下:
#获取识别框坐标
face_rects = face_cascade.detectMultiScale(gray, 1.1, 10)
x, y, w, h = face_rects[0]
face_cascade.detectMultiScale()
为人脸检测方法,gray
为待检测灰度图,1.1
表示检测框按1.1
的比例放大,10
表示一个目标至少要被检测到10
次才算真正的目标。(x,y)
为检测框左上角坐标,w,h
为检测框宽高长度值。
最后,我们将检测框添加进图像中并保存图像:
#将识别框加入图片中
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
#保存图片
cv2.imwrite(img_save_path,img)
img
为目标图片,(x,y)
为检测框左上角坐标,(x+w,y+h)
为右下角坐标。(255,0,0)
表示蓝色,(0,255,0)
表示绿色,(0,0,255)
表示红色,3
表示BGR
三个通道。
编程要求
根据提示,在右侧编辑器补充代码,实现人脸检测方法。
测试说明
程序会调用你实现的方法对图片进行检测,并画出检测框。若检测框位置与正确位置l1
距离均值小于10
则视为通关,否则输出你的检测框位置。
开始你的任务吧,祝你成功!