计算机视觉入门:我推荐你这样学习!【转】
近年来,计算机视觉取得了很大进展。这些是我将在这里提到的主题内容:
技术:
- 人脸检测:Haar,HOG,MTCNN,Mobilenet
- 面部识别:CNN,Facenet
- 对象识别:alexnet,inceptionnet,resnet
- 迁移学习:在一个新主题上用很少的资源重新训练大型神经网络
- 图像分割:rcnn
- GAN
- 计算机视觉硬件:选择什么,GPU很重要
- 集成视觉的UI应用程序:ownphotos
应用:
- 个人照片组织
- 自动驾驶汽车
- 自主无人机
- 解决验证码/ OCR
- 过滤基于图片的网站/应用程序的图片
- 自动标记应用的图片
- 从视频中提取信息(电视节目、电影)
- 视觉问题回答
- 艺术
关注的人:
重要的深度学习创始人:Andrew ng,Yann lecun,Bengio yoshua,Hinton joffrey
课程 :
- deep learning@ coursera
- machine learning@ coursera
相关领域:
- 深度强化学习:使用cnn作为输入层,查看ppo和dqn
- 与nlp的交互:lstm 2 cnn
人脸检测
人脸检测是检测人脸的其中一项任务。有几种算法可以做到这一点。
https://github.com/nodefluxio/face-detector-benchmark提供了这些方法的速度基准,并且有易于重用的实现代码。
Haar 分类器
它们是自2000年以来在opencv中出现的旧计算机视觉方法。
它是一种机器学习模型,具有专门用于对象检测的功能。 Haar 分类器速度快但准确度低。
请参阅https://docs.opencv.org/3.4.3/d7/d8b/tutorial_py_face_detection.html中有关如何使用它的更长解释和示例
HOG:方向梯度直方图
HOG是一种新的生成对象检测功能的方法:它自2005年开始使用。它基于计算图像像素的梯度,然后将这些特征馈送到机器学习算法中,例如SVM。它具有比haar分类器更好的精度。
它的一个实现在dlib中。这是在face_recognition(https://github.com/ageitgey/face_recognition)库中。
MTCNN
一种使用CNN变化来检测图像的新方法,精度更高但速度稍慢。请参阅https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html
MobileNet
这是我这些天用于面部检测的最好和最快的方法,基于通用移动网络架构。请参阅https://arxiv.org/abs/1704.04861
物体检测
可以使用与面部检测类似的方法来实现对象检测。
这里有2篇文章介绍了实现它的最新方法。这些方法有时也提供了对象类(实现对象识别):
- (https://towardsdatascience.com/review-r-fcn-positive-sensitive-score-maps-object-detection-91cd2389345c r-fcn
- https://towardsdatascience.com/r-cnn-fast-r-cnn-faster-r-cnn-yolo-object-detection-algorithms-36d53571365e a comparison of r-cnn, fast r-cnn, faster r-cnn and yolo)
卷积神经网络
最近深度学习的进展使新架构取得了很大成功。
使用许多卷积层的神经网络就是其中之一。卷积层利用图像的2D结构在神经网络的下一层中生成有用信息。有关什么是卷积的详细说明,请参阅https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1。
物体识别
对象识别是将对象分类为类别(如猫,狗,......)的一般问题
基于卷积的深度神经网络已被用于在此任务上取得很好的效果。
ILSVR会议一直在ImageNet上举办竞赛(http://www.image-net.org/许多图片的数据库,包括猫、狗等物品标签)
更成功的神经网络现在已经使用越来越多的层。
ResNet架构是迄今为止对对象进行分类的最佳选择。
要正确地训练它,需要使用数百万张图像,即使使用数十个昂贵的GPU也仍然需要花费大量时间。
这就是为什么每次都不需要在这些大数据集上进行重新训练的方法非常有用的原因。迁移学习和嵌入就是采用的这样的方法。
有关resnet的预训练模型,请访问https://github.com/tensorflow/tensor2tensor#image-classification
人脸识别
面部识别就是要弄清楚谁是一张脸。
历史方法
解决该任务的历史方法是将特征工程应用于标准机器学习(例如svm)或应用深度学习方法进行对象识别。
这些方法的问题是它们需要每个人的大量数据。实际上,数据并不总是可用的。
Facenet
谷歌研究人员在2015年推出了Facenet( https://arxiv.org/abs/1503.03832)。它提出了一种识别面部的方法,但却不需要为每个人提供大量的面部样本。
它的工作方式是拍摄大量面孔的图片数据集(例如http://vis-www.cs.umass.edu/lfw/)。
然后采用现有的计算机视觉架构,例如初始(或resnet),然后用计算面部嵌入的层替换对象识别NN的最后一层。
对于数据集中的每个人,(负样本、正样本、第二正样本)选择三个面(使用启发法)并将其馈送到神经网络,这产生了3个嵌入。在这3次嵌入中,计算三重态损失,这使得正样本与任何其他正样本之间的距离最小化,并且最大化位置样本与任何其他负样本之间的距离。
最终结果是每个面(即使在原始训练集中不存在的面)现在也可以表示为一个嵌入,它与其他人的面部嵌入有很大距离的嵌入(128数字的向量)。
然后,这些嵌入可以与任何机器学习模型(甚至简单的诸如knn)一起使用来识别人。
关于facenet和face embedding非常有趣的事情就是使用它你可以识别只有几张照片或者只有一张照片的人。
这是它的一个tensorflow实现:https://github.com/davidsandberg/facenet
这是人脸识别管道背后的思想的一个很酷的应用,而不是识别熊脸:https://hypraptive.github.io/2017/01/21/facenet-for-bears.html
迁移学习
训练非常深的神经网络(如resnet)是非常耗费资源的,需要大量数据。
计算机视觉是高度计算密集型的(对多个gpu进行数周的训练)并且需要大量数据。为了解决这个问题,我们已经讨论过为面部计算通用嵌入。另一种方法是采用现有网络并仅在其他数据集上重新训练其几个层。
这是一个教程:codelab教程。它建议你重新训练一个初始模型,训练未知的花类。
https://medium.com/@14prakash/transfer-learning-using-keras-d804b2e04ef8提供了在进行迁移学习时应该对哪一层进行再训练的良好指导。
图像分割
近年来,图像分割成为了一项令人印象深刻的新任务。它包括识别图像的每个像素。
此任务与对象检测有关。实现它的一种算法是mask r-cnn。
GAN
由ian goodfellow引入的Generative Adversial Networks是一个神经网络架构,分为两部分:鉴别器和发生器。
- 鉴别器检测图片是否是类,它通常在对象分类数据集上预先训练。
- 生成器为给定的类生成图像
在学习期间调整发生器的权重,以便产生鉴别器无法与该类的真实图像区分的图像。
以下是最大的GAN(https://arxiv.org/abs/1809.11096)生成的图像示例
请参阅https://github.com/eriklindernoren/Keras-GAN在keras中的GAN实现
计算机视觉硬件
要训练大型模型,需要大量资源。实现这一目标有两种方法。首先是使用云服务,例如google cloud或aws。第二种方法是自己构建一台带有GPU的计算机。
只需1000美元,就可以构建一台体面的机器来训练深度学习模型。
视觉界面
Ownphotos是一个令人惊叹的用户界面,您可以导入照片并自动计算面部嵌入,进行物体识别和识别面部。
它用 :
- 面部识别:face_recognition
- 物体检测:densecap,places365
应用
计算机视觉有很多应用:
- 个人照片组织
- 自动驾驶汽车
- 自动无人机
- 解决验证码/ OCR
- 过滤基于图片的网站/应用程序的图片
- 自动标记应用的图片
- 从视频中提取信息(电视节目,电影)
- 视觉问题解答:结合NLP和计算机视觉
- 艺术:GAN
结论
正如我们在这里看到的,这里有许多新的有趣的方法和应用程序。
我认为人工智能在一般情况下最有趣的是特别是在可以重复使用的学习算法中,能够将这些方法应用于越来越多的任务,而不需要太多的处理能力和数据:
- 迁移学习:它可以使得重新利用预训练的大型神经网络成为可能
- 嵌入(例如facenet):可以识别许多类而无需对这些类中的任何类进行训练