计算机视觉概述
概述
计算机视觉(CV,Computer Vision)是一个跨学科的领域,涉及科学和工程技术的许多不同领域。作为围绕计算机视觉的一系列领域,我们会触及类似于物理这样的领域,因为需要光学知识和成像原理,也要理解在物理意义上图像是怎么构成的,我们需要了解生物学和心理学,了解生物层面动物大脑如何,看到并处理视觉信息。当然我们会涉及到计算机科学数学和工程学方面,致力于构建实现我们的计算机视觉算法的计算机系统。斯坦福大学实验室在语言和视觉方面做了很多研究,并在神经科学和认知科学方面做了很多努力。
计算机视觉
发展历程
生物的视觉出现使得物种种类呈爆炸式增长,让机器获得视觉会有什么效果?
手机摄像头是最常用的传感器之一,同时生物学家也研究视觉的机理,其中影响了人类视觉、动物视觉,并且启发了计算机视觉的一项研究要数五六十年代休伯尔和威泽尔使用电生理的研究,他们提出的问题是,哺乳动物的视觉处理机制是怎样的,于是他们选择了大脑视觉处理机制与人类相似的猫类来进行研究。他们发现视觉处理是始于视觉世界的简单结构,面向边缘、沿着视觉处理途径的移动,信息也在变化,大脑建立了复杂的视觉信息,直到它可以识别更为复杂的视觉世界,所以计算机视觉的历史也从60年代初开始的。
Block World是由Larry Roberts出版的一部作品,被广泛地称为第一个,当然也是计算机视觉的第一篇博士论文。其中视觉世界被简化为简单的几何形状,谜底是能识别它们,重建这些形状是什么。
1996年有一个著名的MIT暑期项目——The Summer Vision Project,试图有效地使用我们的暑期工作时间来构建视觉系统的重要组成部分,最终目标将解决在大部分视觉系统中的问题,50年过去了,计算机视觉领域已经从那个夏季项目发展成为全球数千名研究人员的领域,并且仍然处理一些最根本的问题。虽然我们还没有弄清楚人类视力的原理,但这个领域已经成长为人工智能最重要和发展最快的领域之一。
David Marr(麻省理工学院视觉科学家),在70年代后期撰写了一本非常有影响力的书,内容包括如何理解视觉,应该如何处理计算机视觉、开发,甚至如何可以使计算机识别视觉世界的算法。
他在书中指出,为了拍摄一副图像并获得视觉世界的最终全面的3D表现,我们必须经历几个过程,第一个过程就是他所说的原始草图,大部分边缘、端点、虚拟线条、曲线、边界等都被使用其他元素来表示,这是受到了神经科学家的启发,Hubel和Wiesel告诉我们,视觉处理的早期阶段有很多关于像边缘的简单结构,然后边缘和曲线之后的下一步是David Marr所说的2.5维草图,我们开始将表面、深度信息层或视觉场景的不连续性拼凑在一起的,然后最终将所有内容放在一起,并在表面和体积图等分层组织了一个3d模型,这是一个非常理想化的思想过程,这种思维方式实际上已经在计算机视觉领域影响了几十年,非常直观,并考虑如何解构视觉信息。
70年代的另一个非常重要的开创性的工作组提出了一个问题,我们如何越过简单的块状世界开始识别或表示现实世界的对象。想想70年代,这是几乎没有数据可用的时代,计算机速度非常慢,笔记本电脑都还没有出现的时代,但计算机科学家们开始思考如何识别和表示对象,这个想法是一个被称为广义圆柱体,一个被称为图形结构,他们的基本思想是每个对象都是由简单的几何图单位组成,如下图,一个人有一些广义的圆柱体组成,或者人也可以由一些关键元素按照不同的间距组合在一起,在这些部分之间的变化的距离拼接在一起,所以任何一种表示方法是将物体的复杂结构简约成一个集合体,有更简单的形状和几何结构。这些研究已经影响了很长一段时间。
另一个例子是,在80年代David Lowe思考如何重建或者识别由简单的物体结构组成的视觉空间。这项研究开始是David Lowe尝试识别剃须刀,他通过线和边缘进行构建,其中大部分都是直线以及直线之间的组合。
所以说,曾经的这些努力都试图去思考计算机视觉的任务是什么。从60年代到80年代,要解决物体识别的问题非常难,现在讨论的问题都是非常有脑洞,并且有野心的尝试,但是他们仅仅停留在简单样本的阶段,或很少的样本,没有产生很大的进展。输出可以在现实世界有用的东西,当人们思考在解决视觉问题过程中出现的问题时,一个很重要的问题出现了,如果目标识别太难了,那么我们首先要做的是目标分割,这个任务就是把一张图片中的像素点归类到有意义的区域,我们可能不知道这些像素点组合到一起是一个人形,但是我们可以把这些属于这人的像素点从背景中扣出来,这个过程就叫图像分割,这里有一个早期非常具有开创性的工作,Berkeley的Jitendra Malik用一个图算法对图像进行分割。
还有一个另外的问题,先于其他计算机视觉问题有进展,也就是面部检测,脸部是人类最重要的部位之一。1999-2000年机器学习技术,特别是统计机器学习方法开始加速发展,出现了一些方法,如支持向量机模型、Boosting方法、图模型,有一种特别工作做出了很多贡献,就是使用AdaBoost算法进行实时面部检测,由Paul Viola和Michael Jones完成,这项工作中有大量值得我们称赞的,这是在计算机芯片还是非常慢的2001年完成的,但是他们还是能实现准实时的面部检测。在他们发表论文后的第五年,也就是2006年,富士推出第一个能在数码相机中实现实时面部检测的数码相机,所以这是从基础科学研究到实际应用的一个快速转化。关于如何才能做到更好的目标识别,这是一个我们可以继续研究的领域。
在90年代末到2000年的前十年,有一个非常有影响力的思想方法就是基于特征的目标识别,这里有一个影响深远的工作由David Lowe完成,叫做SIFT特征,思路就是去匹配整个目标,例如这里有一个stop标识去匹配另外一个stop标识很困难,因为有很多变化的因素,比如相机的角度、遮挡、视角、光线以及目标自身的一些变化。但是可以得到一些启发,通过观察目标的某些部分、某些特征,它们往往能在变化中具有表现性和不变性,所以目标识别的首要任务是在目标上确认这些关键的特征,然后把这些特征与相似的目标进行匹配,它比匹配整个目标要容易很多。这里有一张他论文中的图,这张图显示在一个stop标识中有少量几打的SIFT特征能够被识别,这些特征与另一个stop标识的SIFT特征相匹配,使用相同的构成要素特征,图片中的表现特征。
我们这个领域另一个进展是识别整幅图的场景,这里有一个算法作为例子,叫空间金字塔匹配,背后的思想是,图片里有各种特征,这些特征可以告诉我们这是哪种场景,到底是风景还是厨房或者是高速公路等等,这个算法从图片的各部分各像素抽取特征,并把他们放在一起作为一个特征描述符,然后在特征描述符上做一个支持向量机。
有个在人类认知方面很类似的工作正处于风头浪尖上,有些工作是把这些特征放在一起以后,研究如何在实际图片中比较合理地设计人体姿态和辨认人体姿态,这方面一个工作被称为方向梯度直方图,另一个被称为可变形部件模型。
有一件事那就是图片的质量随着互联网的发展、数码相机发展、计算机视觉的研究不断提高,也能拥有更好的数据了,计算机视觉在21世纪早期指出了一个非常重要的基本问题,而且是非常重要的识别问题,就是目标识别。我们一直在提目标识别,但是直到21世纪的早期,我们才开始真正拥有标注的数据集,能供我们衡量在目标识别方面取得的成果,其中最有影响力的标注数据集之一叫PASCAL Visual Object Challenge,这个数据集由20个类别,我们这里展示三个,火车、飞机、人。数据集中的每个种类有成千上万张图片,现场不同的团队开发算法来和数据测试集做对抗训练来看有没有优化,通过下图可以看到从2007-2012年在基准数据集上检测图像中的20种目标的检测效果,可以看到在稳步提升,也就是说有了很大的进展。
PASCAL Visual Object Challenge(来自cs231n)
在差不多时候,普林斯顿和斯坦福中的一批人开始向我们或者说我们这个领域提出一个更困难的问题,我们是否具备了识别真实世界中的每一个物体的能力或者说大部分物体,这个问题也是由机器学习中的一个现象驱动的,就是大部分的机器学习算法,无论是图模型还是支持向量机,或是AdaBoost都很可能会在训练过程中过拟合,部分原因是可视化的数据非常复杂,而正是因为它们太复杂了,我们的模型往往维数比较高,输入是高维的模型,则还有一堆参数要调优,当我们的训练数据量不够时,很快就会产生过拟合现象,这样我们就无法很好地泛化,因此就是有两方面的动力,一是我们单纯就是想识别自然世界中的万物,二是要回归机器学习,克服机器学习的瓶颈——过拟合问题。我们开展了这样一个叫ImageNet的项目,汇集所有能找到的图片,包含世界万物,组建一个尽可能大的数据集,耗时三年完成了这个项目。从简单的从网上下载上亿张图片开始,用一个我们称为WorldNet的字典来排序,这个字典里有上万个物体类别,接下来不得不用一些投机的众包工程的技巧,用亚马逊土耳其机器人平台来排序,清洗数据,给每张图片打上标签,最终的结果是一个ImageNet,由将近1500万甚至4000万多的图片分成22000类的物体或场景,这是一个巨大的很可能是当时AI领域最大的数据集,它将目标检测算法的发展推到一个新的高度,尤其重要的是如何推动这个基准测试的进展,所以从2009年开始ImageNet团队组织了一场国际比赛,叫做ImageNet大规模视觉识别比赛,这是一个筛选更严格的测试集,总共140万的目标(图像)有1000种目标类别分类识别来测试计算机视觉算法。
下图显示识别错误率在稳步下降,尤其在2012年错误率下降最为明显,这是卷积神经网络的作用,这是本次课程的重点。
ImageNet Large Scale Visual Recognition Challenge(来自cs231n)
虽然没有完全解决,在这个课上你将了解到的所有目标识别问题,开始时让人不可接受的错误率无法在真实世界应用,只用了很短的几年,在2015年识别率达到与人类不分伯仲。
要深入研究什么是卷积神经网络模型,就是现在被熟知的深度学习,该领域有哪些模型,模型的原理是什么,又有哪些好的实践,以及该领域最新的进展是什么。
首先深度学习什么时候开始,2012,卷积神经网络或者说深度学习,展示了强大的模型容量和能力,在计算机视觉领域与其他领域一起取得了巨大的进步,如NLP和语音识别领域。
课程延申——CV经典任务
计算机视觉四大任务,分别是图像识别、目标检测、图像分割、目标跟踪(单目标、多目标)。
四大任务的区别,如下,
- 图像分类/图像识别:整张图只判是什么;
- 目标检测:找在哪+是什么,画框;
- 图像分割:像素级,找每个目标轮廓;
- 目标跟踪:视频里,同一目标连续跟着跑。
整体演进
- 粗粒度整张图–>框级定位–>像素级精细–>视频时序连续
- 难度:识别 < 检测 < 分割 < 跟踪
- 算力需求:识别 < 检测 < 分割 < 跟踪
图像识别(CV基础)
传统时期
- 流程:灰度–>滤波–>
SIFT/HOG特征–>SVM分类 - 缺点:人工特征、泛化差、复杂场景拉胯
深度学习阶段
2012:AlexNet,CNN引爆CV- 后续:
VGG、GoogLeNet、ResNet、EfficientNet、ViT - 核心:从手工特征–>自动特征提取,分类精度飞跃
- 定位:所有
CV任务的backbone基础
目标检测
发展:慢精–>快准–>轻量化实时
传统
HOG+SVM、DPM,速度慢、精度低
深度学习
- 两阶段:
RCNN–>SPP–>Fast RCNN–>Faster RCNN- 精度高、速度慢
- 一阶段:
YOLO系列、SSD、RetinaNet- 速度快、落地首选
- 现在:
YOLOv5/v7/v8、RTMDet,工业主流
图像分割
分级递进,本质是从框–>像素全覆盖,精度最高、计算最大
- 语义分割:同类物体不分个体(马路全算马路)
- 发展:
FCN–>U-Net–>SegNet–>DeepLab–>HRNet
- 发展:
- 实例分割:同类分开个体(两个人分开)
- 代表:
Mask RCNN
- 代表:
- 全景分割:语义+实例统一
目标跟踪(视频CV)
从单纯追踪,逐渐发展到检测+跟踪联合,遮挡、卡顿优化
传统
- 光流法、卡尔曼滤波、
Meanshift
深度学习
- 单目标跟踪:
Siam系列(SiamRPN) - 多目标跟踪:
DeepSORT–>ByteTrack、StrongSORT - 现在主流:检测+嵌入匹配,先检测每一帧,再跨帧关联
学习递进路线(从零到落地)
基础必备
- 数学:线性代数、概率、导数
- 深度学习基础:
CNN、卷积/池化/归一化、损失函数 - 框架:
PyTorch、TensorFlow
按顺序学任务(最简路径)
- 图像分类
- 学:
ResNet、EfficientNet、ViT - 练:
CIFAR10、ImageNet
- 学:
- 目标检测
- 学:
Faster RCNN–>YOLO全系列 - 练:
VOC、COCO
- 学:
- 图像分割
- 学:
FCN、U-Net、DeepLab、MaskRCNN - 练:
Cityscapes
- 学:
- 目标跟踪
- 学:
DeepSORT、ByteTrack、YOLO+Track - 练:公开视频数据集
- 学:
资料渠道
- 入门理论
- 李飞飞
cs231n(CV圣经)
- 李飞飞
- 代码实战
Github:YOLO官方、mmdetection、ultralytics- 数据集:
Kaggle、COCO、VOC
- 论文进阶
- 先看综述,再看经典:
AlexNet、FasterRCNN、YOLOv1-v8、DeepSORT - 平台:
arxiv、PapersWithCode
- 先看综述,再看经典:
落地顺序
- 先跑通
YOLO检测–>再Unet分割–>最后ByteTrack跟踪,工业最实用。
总结下,技术层面上,分类打底–>框选目标–>像素细化–>视频续跟。学习路径上,理论–>分类–>检测–>分割–>跟踪–>项目落地。
cs231n整体课程概况
以上是计算机视觉的历史,下面讲解cs231n的课程总览。
本课程重要问题之一是图像分类问题,我们会先了解一下ImageNet挑战赛的背景,然后讲在图像分类中,让你的算法接收一张图作为输入,从固定的类别集合中选出该图像所属的类别,从而对图像进行分类。
这似乎看起来有一定局限性,或有一些认为干预的柑橘,但其实这种做法很普遍,并且这算法可以应用在许多不同的问题设定,不仅是在产业界和学术界,还有其他不同的地方,比如说,你可以将它应用于食物识别,或者识别到世界上不同的产品,所以这个基础的分类器非常有用。很多地方都有不同的应用。
本次课程讨论一些其他的视觉识别问题,它们都建立在我们专门为图像分类而开发的各种工具之上,将介绍一些其他的问题,比如目标检测或者图像摘要生成,所以在目标检测中会有小小的区别,相比于对一整副图像的分类,比如猫狗马或其他东西,在目标检测中我们要画出边界框,说明这里有一只狗,这里有一只猫,背景中有一辆车,并且用方框标识出这些东西在图像中的位置,我们也会讲到图像摘要,当给一副图像需要生成一段句子来描述这幅图像,这听起来这是一个完全不同的复杂问题,我们已经为图像分类开发了很多工具都可以在这个问题中重新用到。
CNN使得ImageNet大赛取得了巨大的进步,有时也称convnets。从2012年卷积神经网络在ImageNet大赛中取得胜利之后,以后的几年夺冠的都是神经网络,只是网络的深度在逐年增加。由最初的7层网络到现在的100多层,微软研究院的残差网络达到了152层,以后将网络加到200层以上,性能总能得到一点提高,但有时会导致GPU内存溢出。
CNN Object Recognition(来自cs231n)
自2012年CNN取得了突破。之后的许多工作专注于微调这些算法,以在图像分类中取得更好的效果。接下来的课堂里,将深入了解它们,详细了解它们之间的区别,以及如何工作。
虽然CNN是在2012年一举成名,但并不是在2012年被发明的。与卷积神经网络有关的其中一项基础性工作是由Yann LeCun和他的合作伙伴于90年代在贝尔实验室完成的,所以在1998年他们使用卷积神经网络进行数字识别,他们希望将它用于自动识别手写的支票以及邮局识别地址,他们建立这个卷积神经网络可以将像素图像中的数字进行分类或者识别字母。该网络看起来和2012年的AlexNet非常相似,可以看到,输入的是这些原始像素,我们有很多卷积层和下采样以及全连接层,所有详细的解释在后续课程中讲解,但如果只是看这两幅图像,它们非常的相似,在结构上有诸多相似之处,为什么这么相像,到最近才突然变得流行?这是由于计算能力的提高,如今还有了GPU这样的图像处理单元,它们提供了超高的并行计算能力,非常适合进行卷积神经网络模型这类高强度的计算。正是由于更高的计算能力,研究人员才能开发更大的模型和架构。
在某些情况下只是扩大了算法的规模,而依然沿用经典的方法和算法就能得到更好的结果,这种增加计算的思想在深度学习的历史上占据了非常重要的地位。除了计算能力的提高,另一个关键的创新就是数据,这些算法需要大量的数据,用这些高质量的数据集,可以实现更强大的模型,并训练这些模型,很好地处理现实世界中的问题。
对计算机视觉的研究,目前还只是对图像进行识别,并没有能力判断图像中的场景语义。就是说理想的情况下,不仅仅是简单的框出图像中的物体,还能描述出图像,不只有对方的身份,还包括对象关系、对象属性,以及场景中发生的动作。这种表达可能允许我们使用简单分类去捕捉一些丰富的视觉世界,但这绝不是一种标准的做法,只是给你一个体会——深刻的图像理解。






















