目前我正在研究一个涉及人脸分类的计算机视觉问题。这通常意味着需要应用深度学习,因此在将图像注入到我们的神经网络之前需要一个特殊的预处理阶段。

为了提高我们的模型精度,这是一项非常重要的任务,通过以下几个简单的步骤可以很好地完成。对于本文,我们使用OpenCV:一个高度优化的计算机视觉开源库,在C++、java和Python中都可用。

这是一篇简短的文章,包含了一些基本的指导原则、示例和代码,你可以根据需求将它们应用到人脸分类或识别问题上。

注意:本文中使用的所有静态图像都来自 https://imgflip.com/memetemplates

图片载入

我们将使用imread()函数加载图像,指定文件的路径和mode,第二个参数对于动态运行通道和像素转换非常重要。

  • mode:https://docs.opencv.org/4.1.0/d4/da8/group__imgcodecs.html#ga61d9b0126a3e57d9277ac48327799c80

img = cv2.imread('path/image.jpg', cv2.IMREAD_COLOR)

要查看图像,我们有imshow()函数:

cv2.imshow(img)

如果你写的是类型(img),你会看到尺寸是(height, weight, channels)。

我们的彩色图像有3个通道:蓝色,绿色和红色(在OpenCV中按这个顺序)。

我们可以轻松查看单个通道:

# Example for green channelimg[:, :, 0]; img[:, :, 2]; cv2.imshow(img)

灰度版本

为了避免在人脸图像分类中的干扰项,使用黑白图片是个好主意(也可能不是!)你可以两者都试试)。为了得到灰度版本,我们只需要在图像加载函数中指定,将适当的值作为第二个参数传递:

img = cv2.imread('path/image.jpg', cv2.IMREAD_GRAYSCALE)

现在我们的图像有了一个单独的通道!

人脸和眼睛检测

当处理人脸分类问题时,我们可能想要做人脸检测,来做人脸验证任务(是否有脸?)。我们可以使用OpenCV中包含的基于Haar特性的级联分类器进行人脸检测。(https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html)

首先,我们选择预先训练的人脸和眼睛检测分类器。有一个可用的XML文件列表,我们可以使用此列表:

  • https://github.com/opencv/opencv/tree/master/data/haarcascades

1)对于人脸检测,OpenCV提供以下(从最宽松的先验到最严格的先验):

  • haarcascade_frontalface_default.xml

  • haarcascade_frontalface_alt.xml

  • haarcascade_frontalface_alt2.xml

  • haarcascade_frontalface_alt_tree.xml

2) 对于眼睛检测,我们可以选择两种方法:

  • haarcascade_eye.xml

  • haarcascade_eye_tree_eyegasses.xml

我们以这种方式加载预先训练的分类器:

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + ‘haarcascade_frontalface_default.xml’)eyes_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + ‘haarcascade_eye.xml’)

你可以测试几种组合。记住,在所有情况下,它们中没有一个是最优的(如果第一个分类器失败,你可以尝试第二个分类器,或者甚至尝试所有分类器)。

对于人脸检测,我们使用以下代码:

faces_detected = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)

结果是一个数组,包含所有检测到的人脸。我们可以很容易地画出矩形:

(x, y, w, h) = faces_detected[0]cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 1);cv2.imshow(img)

对于眼睛,我们以类似的方式进行搜索,但将搜索范围缩小到面部矩形:

eyes = eyes_cascade.detectMultiScale(img[y:y+h, x:x+w])for (ex, ey, ew, eh) in eyes:    cv2.rectangle(img, (x+ex, y+ey), (x+ex+ew, y+ey+eh),                   (255, 255, 255), 1)

成啦!

虽然这是预期的结果,但我们会遇到很多其他方面的问题。很多时候,我们没有正面和清晰的人的脸,甚至……

没有眼睛:

眼睛是被白色包围的黑色污点:

此处有4只眼,仅检测到3只眼:

矫正脸部

通过计算两只眼睛之间的角度,我们可以拉直脸部图像(这很容易)。计算后,我们仅需两个步骤即可旋转图像:

rows, cols = img.shape[:2]M = cv2.getRotationMatrix2D((cols/2, rows/2), <angle>, 1)img_rotated = cv2.warpAffine(face_orig, M, (cols,rows))

裁剪脸部

为了帮助我们的神经网络完成人脸分类任务,最好去掉背景、衣服或配饰等外部干扰信息。在这种情况下,裁剪脸部是一个很好的选择。

我们需要做的第一件事是从矫正的人脸图像中再次得到人脸矩形。然后我们需要做一个步骤:我们可以按原样裁剪矩形区域,或者添加一个额外的填充,这样我们可以获得更多的空间。

这取决于要解决的具体问题(按年龄、性别、种族等分类);也许你想要更多的头发;也许不需要。

最后,裁剪(p表示填充):

cv2.imwrite('crop.jpg', img_rotated[y-p+1:y+h+p, x-p+1:x+w+p])

看!这张脸是孤立的,几乎可以进行深度学习了

图像缩放

神经网络需要所有的输入图像具有相同的形状和大小,因为GPU在同一时间对一批图像应用相同的指令,以达到超级快的速度。我们可以动态地调整它们的大小,但这可能不是一个好主意,因为在训练期间将对每个文件执行多个转换。

因此,如果我们的数据集有很多图像,我们应该考虑在训练阶段之前实现批量调整大小的过程。

在OpenCV中,我们可以使用resize()函数执行向下缩放和向上缩放,有几种可用的插值方法,指定最终尺寸的例子:

cv2.resize(img, (<width>, <height>), interpolation=cv2.INTER_LINEAR)

为了缩小图像,OpenCV建议使用INTER_AREA插值,而要放大图像,可以使用INTER_CUBIC(慢)或INTER_LINEAR(快,效果仍然不错)。

最后是质量和时间之间的权衡。

我做了一个快速的升级比较:

前两幅图像的质量似乎更高(但你可以观察到一些压缩伪像)。

线性方法的结果明显更平滑并且噪点更少。

最后一个是像素化的。

归一化

我们可以使用normalize()函数应用视觉归一化,以修复非常暗/亮的图片(甚至可以修复低对比度)。

该归一化类型(https://docs.opencv.org/3.4/d2/de8/group__core__array.html#gad12cefbcb5291cf958a85b4b67b6149f) 在函数参数中指定:

norm_img = np.zeros((300, 300))norm_img = cv2.normalize(img, norm_img, 0, 255, cv2.NORM_MINMAX)

例子:

当使用图像作为深度卷积神经网络的输入时,不需要应用这种归一化。

在实践中,我们将对每个通道进行适当的归一化,比如减去平均值,然后除以像素级的标准差(因此我们得到平均值0和偏差1)。如果我们使用迁移学习,最好的方法总是使用预先训练的模型统计数据。

结论

在处理人脸分类/识别问题时,如果输入的图像不是护照图片,则检测和分离出人脸是一项常见的任务。

OpenCV是一个很好的图像预处理库,不仅仅如此,它也是一个强大的工具,为许多计算机视觉应用…

来看文档吧!

  • https://docs.opencv.org/master/

希望你喜欢这篇文章!

原文链接:https://medium.com/yottabytes/a-quick-guide-on-preprocessing-facial-images-for-neural-networks-using-opencv-in-python-47ee3438abd4

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文(无广告)。

扫描二维码添加小编↓

使用Python+OpenCV实现神经网络预处理人脸图像的快速指南相关推荐

  1. 【Python+OpenCV+sklearn+easygui】人脸(口罩)识别+口罩下人脸补全的系统设计

    [写在前面:笔者是一个才接触python半年之久的编程菜鸡,刚好这学期的课程需要用到python做一些有关计算机视觉的设计,于是就根据自己所学,同时借鉴了一些CSDN上各位大佬的思路和代码,做了一个简 ...

  2. Python OpenCV开发MR智能人脸识别打卡系统(四、服务模块设计)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...

  3. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

  4. Python OpenCV开发MR智能人脸识别打卡系统(三、工具模块设计)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...

  5. python opencv调用摄像头并追踪移动物体,浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估...

    使用摄像头追踪人脸由于血液流动引起的面部色素的微小变化实现实时脉搏评估. 效果如下(演示视频): 由于这是通过比较面部色素的变化评估脉搏所以光线.人体移动.不同角度.不同电脑摄像头等因素均会影响评估效 ...

  6. Python OpenCV开发MR智能人脸识别打卡系统(一、需求分析与系统设计)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下链接 Python OpenCV开发MR智能人脸识别打卡系统(二.文件系统.数据实体模块设计) Python OpenCV开发MR智能人脸 ...

  7. Python OpenCV开发MR智能人脸识别打卡系统(五、程序入口设计与测试)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...

  8. Python+Opencv实现简单PCA人脸识别

    基本原理:人脸识别-PCA特征脸_Python_萬仟网 上面那个链接被识别成不安全网址,谨慎访问吧 PCA,principal Component Analysis(主成成分分析方法) 1.基本原理 ...

  9. Python OpenCV 图片滑块验证码 滑块图片验证码 快速自动识别方案 代码简单 模板匹配识别 识别成功率达90%+

    前言 通过上一篇的文章大家已经对图片滑块验证码已经有了初步的了解,图片滑块验证码的核心关键在于图片识别接下来接入讲解.因为初版滑块图片识别虽然能识别验证码,通过一些策略调整也相对提高了一些图片识别率, ...

最新文章

  1. 5G商用对视频会议市场增长具有积极意义
  2. Zepto源码分析-zepto模块
  3. matlab第二次上机作业答案,第二次上机作业
  4. C#调用ORACLE存储过程返回结果集及函数
  5. IDEA15 下运行Scala遇到问题以及解决办法
  6. Word2Vec学习笔记(三)续
  7. 马云:捐钱很容易 但当所有人行动才能有变化
  8. CSS定位属性(position)
  9. 蓝桥杯c语言基础试题答案,蓝桥杯试题C语言答案.doc
  10. 家庭mesh网络与IPTV的搭建
  11. 投屏软件_五款良心投屏软件,将安卓iOS投射到大屏幕
  12. bmd硬盘测试_disk speed test mac版下载-Blackmagic Disk Speed Test for Mac(硬盘读写速度测试工具) v3.2免费版 - Mac天空...
  13. 从简单泛函到第二类拉格朗日方程
  14. openwrt nas_【群晖】用群晖虚拟机安装New Pi(OpenWRT)软路由系统
  15. flutter_interview面试题和答案(2022)
  16. 中台服务架构的一点思考
  17. 华为往事(十一)---华为的“中南海”
  18. 【错误】vs 应用程序无法正常启动0xc00007b
  19. “耳根”发布新作《一念永恒》,交易记录
  20. 如何用navicat导入数据?

热门文章

  1. 更新Composer依赖报错处理Fatal error: Declarat…
  2. adb 查看磁盘占用_adb log存储大小查看
  3. 北京/上海内推 | 小红书社区技术部招聘NLP算法工程师/实习生/tech lead
  4. 佳能打印机复印身份证的双面到A4纸上的方法
  5. 百度副总裁李硕:AI能深入场景创造真价值,从传感器到大屏仅是数字化开始...
  6. 虚拟网络编辑器三种模式工作原理详细介绍(桥接-网络地址转换-主机模式)
  7. Java写一个复数类并进行加法操作
  8. 大数据24小时:小米与微软就云计算等达成合作,哈佛大学发明爬行机器人用于医疗搜救
  9. 北斗终端与计算机传输信息,北斗短报文数据传输终端
  10. 浅谈Batch(批次合并)