计算机视觉概述
计算机视觉,与语音识别、自然语言理解,并称为人工智能的三大主要技术领域,也是AI技术落地产业化最广泛的领域。
计算机视觉主要分为2D视觉和3D视觉两大研究领域,2D视觉的研究内容包括:目标识别、目标跟踪、视频内容理解等;3D视觉的研究内容包括:基于图像的三维重建、目标三维姿态估计等。
当下2D视觉领域几乎被基于学习的方法统治,其中深度学习在2D视觉领域中发挥着重要的角色,许多视觉应用都是基于深度学习算法改进实现,尤其是CNN卷积神经网络,许多的算法模型都是基于CNN进行改进增加网络结构层来实现的。
如下图所示,2D视觉领域中,通过基础技能构建不同结构的神经网络,来实现中间技能层的核心模块,进而结合实际应用,实际的数据集,开发出不同的视觉应用。
中间技能层算法汇总
这里不同中间层的实现,更多采用深度学习神经网络算法实现。
图像分类
二分类:判断图片是否包含人
常用算法:SVM
多类别分类:比如鸟类识别
常用算法:LetNet、AlexNet、VGGNet系列、GoogLeNet、ResNet系列、Inception系列、DenseNet系列
多标签分类:每个类别包含多种属性的标签,比如对于服饰的分类,服饰是由上衣服颜色、纹理、袖长等标签组合
常用算法:R-CNN&LSTM
数据集
图像分割
图像分割顾名思义,对输入的视觉图像分割成不同的片段,类似于美图秀秀的抠图以简化应用于图像分析。
这里科普一下做图像分析的流程
图像检测:对图像中的目标进行检测,并识别出是人还是动物等类别,并用矩形画出检测区域
分割:识别矩形部分的对象,并理解分割对象。
普通分割:将图像中不同类型不同物体的像素区域分开,例如前景后景分割
常用方法:普通分割在平时的图像处理应用中还是会用到一些,常用方法有,阈值处理分割、k-means聚类、基于直方图、边缘检测、GrabCut算法
语义分割:在普通分割基础上,分类出每一块区域的语义,即在图像中标注每个区域是什么物体
实例分割:在语义分割基础上,由于图像中可能存在多个一种类型的物体,比如一个图像有三只狗,实例分割,对画面中的狗进行编号1,2,3。
- 从上面的分割的介绍看实例分割是功能最全的分割方法,因此只枚举对实例分割的常用算法。
常用算法:FCN、DeepLab、Pyramid Scene Parsing Network、Mask R-CNN、U-Net
图像生成与转换
在深度学习的另一个主要应用是生成模型(Generative Model),所谓生成模型,就是给定一组随机数,根据随机数来生成服从训练数据分布的数据,在计算机视觉中的一个重要应用就是给定一组图像,构造出一个模型,在这组图像上进行训练,这个模型能够生成类似于给定训练图像中实例的图像。
图像转换,图像到图像的转换被定义为将一个场景的可能表示转换成另一个场景的问题,例如图像结构图映射到RGB图像,或者反过来。该问题与风格迁移有关。
常用算法:变分自编码器(Variational AutoEncoder,VAE)和生成对抗网络(Generative Adversarial Network,GAN)二种。
图像重构(图像修复)
图像重构就是对图像中缺少的像素进行填补,并基于背景的像素信息进行重建的技术。有点像外面店里做老照片修复。
常用算法如下图所示:
目标检测
目标检测也叫做目标提取,基于目标几何和统计特征的图像分割,大白话说,就是基于图像,可以识别出图像中存在的物体和人,并告诉我们这个识别出的是啥子。
传统目标检测技术可以分为三个步骤:首先选择图像中的候选区域,之后提取Haar、HOG等视觉特征,最后基于支持向量机模型、RF模型等常用分类器进行分类。
下图是一张目标检测领域算法发展:
随着深度学习技术发展,可以自动学习图像特征
基于区域提取两阶段:之所以叫两阶段,是因为这几种算法的检测处理过程为两个过程。
1.基于图片提出若干可能包含物体的区域
2.提出这些区域运行时表现好点分类网络,得出每个区域的物体类别
常用算法:R-CNN、SPP-Net、FAST R-CNN、FASTER R-CNN
基于回归单阶段:表示没有中间区域检测的过程,直接从图片进行预测分类。
常用算法:YOLO系列、SSD
目标跟踪
目标跟踪实现分为生成式基于相关滤波的传统opencv实现与判别式深度学习实现二种
生成式:在当前帧对目标区域建模,下一帧寻找与模型最相似的区域就是预测位置,比较著名的有卡尔曼滤波,粒子滤波,mean-shift等。
这里详细介绍一下帧差分法,备注:帧差分法是检测物体是否发生运动行为的方法。
- 提取二帧连续图像
- 灰度化
- 高斯滤波(可选)
- cv2.absdiff求二帧图像差异部分
- 阈值处理
- 腐蚀膨胀
- 找出边框cv2.findContours
- 获取边框坐标,画出矩阵
判别式:当前帧以目标区域为正样本,背景区域为负样本,机器学习训练分类器,下一帧用训练好的分类器找最优区域。
2018年的VOT,基于全卷积孪生网络(SiamNet)的方法大崛起,凭借超越DCF方法的准确度和端到端训练的优势,成为目标追踪新的研究方向。
下图是GitHub上发布的2018VOT系统分支结构,包含了所有的目标跟踪算法。
风格迁移
它主要是通过神经网络,将一幅艺术风格画(style image)和一张普通的照片(content image)巧妙地融合,形成一张非常有意思的图片。
大白话说,图像往往由风格与内容组成,比如我们常常说画家的画风是怎么样的,毕加索的画风、动漫的画风。
风格迁移就是保留一张图片的内容(物体,人物),用另一张图片的色彩画图风格去填充。
风格迁移原理:
首先我们需要获取一张内容图片和一张风格图片;然后定义二个度量,一个度量值为内容度量值,另一个度量为风格度量值,其中内容度量值衡量二个图片之间的内容差异程度,风格度量衡量图片之间风格差异程度,最后建立神经网络模型,对内容图片中的内容和风格图片的风格进行提取,以内容图片为基准将其输入建立的模型中,不断调整内容度量值和风格度量值,让它们趋近于最小,最后输出的图片就是内容和风格融合的图片。
风格迁移大致可以分成四个步骤(图片的内容与风格提取是基于CNN算法,一般认为图像在CNN网络中,卷积层较低的层描述了图像的具体视觉特征(即纹理和颜色等),较高层特征是较为抽象的图像内容描述):
内容损失
内容损失选择通常是CNN卷积层高层的特征,比较两幅图像的内容相似性。
风格损失
风格损失选择通常是CNN卷积层低层的特征,比较两幅图的风格相似性
总损失
内容+风格的相似度评价
训练
计算总损失的模型,可以选择VGG系列模型
超分辨率
超分辨率是从给定的低分辨率(LR)图像恢复高分辨率(HR)图像的过程。
常用算法:SRCNN
人体姿态估计
体姿态骨架以图形格式表示人的活动。
本质上,它是一组坐标,将坐标组合起来就可以描述人的姿态。骨架中的每个坐标都称为关键点(或关节)。两个关键点之间的有效连接称为肢体。请注意,并非所有关键点组合起来都会产生有效的配对(肢体)。
单人姿态估计
无须深度学习,可以使用opecv&mediapipe包实现
代码如下:
import cv2 import mediapipe as mp import time mpDraw = mp.solutions.drawing_utils mpPose = mp.solutions.pose pose = mpPose.Pose() cap = cv2.VideoCapture('PoseVideos/3.mp4') pTime = 0 while True: success, img = cap.read() imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = pose.process(imgRGB) # print(results.pose_landmarks) if results.pose_landmarks: mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS) for id, lm in enumerate(results.pose_landmarks.landmark): h, w, c = img.shape print(id, lm) cx, cy = int(lm.x * w), int(lm.y * h) cv2.circle(img, (cx, cy), 5, (255, 0, 0), cv2.FILLED) cTime = time.time() fps = 1 / (cTime - pTime) pTime = cTime cv2.putText(img, str(int(fps)), (70, 50), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3) cv2.imshow("Image", img) cv2.waitKey(1)
代码也可以做图像姿态估计,只需要修改获取视频图像的那段代码即可
多人姿态估计:
自上而下的方法:
自顶向下的算法先从图像中检测出所有人,随后利用单人姿态估计的方法对所有人进行姿态估计。自顶向下算法的缺点是算法运行效率随着人数增加而降低,且部分被遮挡的人无法被检测,精度不高。
如下图中的上半示意图所示。
自下而上的方法:。
自底向上的算法,先检测出所有人的骨点,再将骨点进行连接形成图,最后通过图优化的方法剔除错误的连接,实现多人姿态估计。自底向上算法的优点是运行时间不随人数增加而线性增加,更有利于实时多人姿态估计。
如下图中的下半示意图所示。