本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。
CV : Computer Vision 计算机视觉
CNN : Convolutional Neural Network 卷积神经网络
计算机视觉
图像分类
图像分类是计算机视觉中重要的基础问题。
举几个典型的例子:人脸识别、图片鉴黄、相册根据人物自动分类等。
目标检测
目标检测任务的目标是给定一张图像或是一个视频帧,让计算机找出其中所有目标的位置,并给出每个目标的具体类别。
语义分割
它将整个图像分成像素组,然后对像素组进行标记和分类。语义分割试图在语义上理解图像中每个像素是什么(人、车、狗、树…)。
如下图,除了识别人、道路、汽车、树木等之外,我们还必须确定每个物体的边界。
实例分割
除了语义分割之外,实例分割将不同类型的实例进行分类,比如用 5 种不同颜色来标记 5 辆汽车。我们会看到多个重叠物体和不同背景的复杂景象,我们不仅需要将这些不同的对象进行分类,而且还要确定对象的边界、差异和彼此之间的关系!
视频分类
与图像分类不同的是,分类的对象不再是静止的图像,而是一个由多帧图像构成的、包含语音数据、包含运动信息等的视频对象,因此理解视频需要获得更多的上下文信息,不仅要理解每帧图像是什么、包含什么,还需要结合不同帧,知道上下文的关联信息。
人体关键点检测
体关键点检测,通过人体关键节点的组合和追踪来识别人的运动和行为,对于描述人体姿态,预测人体行为至关重要。
在 Xbox 中就有利用到这个技术。
场景文字识别
很多照片中都有一些文字信息,这对理解图像有重要的作用。
场景文字识别是在图像背景复杂、分辨率低下、字体多样、分布随意等情况下,将图像信息转化为文字序列的过程。
停车场、收费站的车牌识别就是典型的应用场景。
目标跟踪
目标跟踪,是指在特定场景跟踪某一个或多个特定感兴趣对象的过程。传统的应用就是视频和真实世界的交互,在检测到初始对象之后进行观察。
无人驾驶里就会用到这个技术。
模型、算法和训练的关系
数据算法模型的关系:
卷积神经网络
CNN 有2大特点:
- 能够有效的将大数据量的图片降维成小数据量
- 能够有效的保留图片特征,符合图片处理的原则
CNN 的基本原理
MNN
MNN : 轻量级的深度神经网络推理引擎
开源的端上推理引擎除了OpenCV的DNN之外,还有tensorFlow-lite、paddle-lite、NCNN、MNN等多个推理框架。目前端上推理引擎主要支持CPU及端上GPU,主流的的设备是CPU(arm)+GPU(mali qualcomm powerVR),主要的编程语言包括c、neon、汇编、OpenCL、OpenGL、vulkan,其中前三种主要是针对CPU的优化,后三种是GPU编程语言。
NNIE
NNIE : Neural Network Inference Engine
海思媒体 SoC 中专门针对神经网 络特别是深度学习卷积神经网络进行加速处理的硬件单元,支持现有大部分的公开网 络,如 Alexnet、VGG16、Googlenet、Resnet18、Resnet50 等分类网络,Faster R- CNN、YOLO、SSD、RFCN 等检测网络,以及 SegNet、FCN 等场景分割网络。目前 NNIE 配套软件及工具链仅支持以 Caffe 框架,使用其他框架的网络模型需要转化 为 Caffe 框架下的模型。
神经网络模型可视化工具netron
名词解释
算力(TOPS)
TOPS是Tera Operations Per Second的缩写,1TOPS代表处理器每秒钟可进行一万亿次(10^12)操作。
与此对应的还有GOPS(Giga Operations Per Second),MOPS(Million Operation Per Second)算力单位。1GOPS代表处理器每秒钟可进行十亿次(109)操作,1MOPS代表处理器每秒钟可进行一百万次(106)操作。TOPS同GOPS与MOPS可以换算,都代表每秒钟能处理的次数,单位不同而已。
在某些情况下,还使用 TOPS/W 来作为评价处理器运算能力的一个性能指标,TOPS/W 用于度量在1W功耗的情况下,处理器能进行多少万亿次操作。
监督学习和非监督学习
监督学习是指存在先验知识的情况下进行训练,通过用带标签的数据来进行训练,然后运用训练结果来推导新的样本。
非监督学习是指在没有带标记的样本数据下进行训练(无先验知识),比如说想从大量的服务器日志中去找到异常的的记录,但是事先我们并不知道异常记录的特征是什么样的,没有任何的带标记的数据,只有靠计算机去找到其中隐藏的某种模式。非监督学习主要是一些聚类算法,即按照数据的相似度将它们分类。
训练集和测试集
训练集很好理解,就是真正用来训练模型的数据;测试集是用来检验训练效果的数据,简单来说就是用训练完的模型来推导测试集的数据,对比推导结果和测试数据的标签来评估训练效果,如准确率。
训练集和测试集的划分有很多方法,最简单的是将数据顺序打乱以后,按照一定比例进行切分,比如 70% 的数据划分到训练集,剩下 30% 的划分到测试集。
损失函数(Loss Function)
损失函数是用来衡量学习预测和现实结果差距的转换为具体数值(损失 Loss)的一方法,那么整个训练过程的就是不停的迭代优化(optimize),将损失减少到最小。比如我们用训练得到的模型来推导测试数据集里面的数据,将得到的结果和数据的真实标签进行对比,把他们的差距量化为一个数值,即损失值。然后再想办法降低这个损失值。
优化器(optimizer)
一个算法的参数可能有几十来个,对于复杂的神经网络,参数可能有成千上万个,显然用人来调整是不现实的,所以这个工作也是由计算机来完成的,即优化器(optimizer)。它的原理是先选择一个参数集作为起始的参数集,完成一次训练后,根据学习效果(损失值)按照一定算法调整参数,然后不停的迭代调整寻找最优参数集(损失值最小)。常见的优化算法有梯度下降和其变种,Adadelta、Adagrad、RMSProp 等。
转移学习(transfer learning)
转移学习:将已经训练好的模型的参数移植到新的模型上面帮助其训练,比起从零开始训练一个新模型,使用转移学习进行的训练所花的时间将大大减少。