计算机视觉,与语音识别、自然语言理解,并称为人工智能的三大主要技术领域,也是AI技术落地产业化最广泛的领域。
计算机视觉主要分为2D视觉和3D视觉两大研究领域,2D视觉的研究内容包括:目标识别、目标跟踪、视频内容理解等;3D视觉的研究内容包括:基于图像的三维重建、目标三维姿态估计等。
当下2D视觉领域几乎被基于学习的方法统治,其中深度学习在2D视觉领域中发挥着重要的角色,许多视觉应用都是基于深度学习算法改进实现,尤其是CNN卷积神经网络,许多的算法模型都是基于CNN进行改进增加网络结构层来实现的。
如下图所示,2D视觉领域中,通过基础技能构建不同结构的神经网络,来实现中间技能层的核心模块,进而结合实际应用,实际的数据集,开发出不同的视觉应用。
这里不同中间层的实现,更多采用深度学习神经网络算法实现。
数据集
图像分割顾名思义,对输入的视觉图像分割成不同的片段,类似于美图秀秀的抠图以简化应用于图像分析。
这里科普一下做图像分析的流程
常用算法:FCN、DeepLab、Pyramid Scene Parsing Network、Mask R-CNN、U-Net
在深度学习的另一个主要应用是生成模型(Generative Model),所谓生成模型,就是给定一组随机数,根据随机数来生成服从训练数据分布的数据,在计算机视觉中的一个重要应用就是给定一组图像,构造出一个模型,在这组图像上进行训练,这个模型能够生成类似于给定训练图像中实例的图像。
图像转换,图像到图像的转换被定义为将一个场景的可能表示转换成另一个场景的问题,例如图像结构图映射到RGB图像,或者反过来。该问题与风格迁移有关。
常用算法:变分自编码器(Variational AutoEncoder,VAE)和生成对抗网络(Generative Adversarial Network,GAN)二种。
图像重构就是对图像中缺少的像素进行填补,并基于背景的像素信息进行重建的技术。有点像外面店里做老照片修复。
常用算法如下图所示:
目标检测也叫做目标提取,基于目标几何和统计特征的图像分割,大白话说,就是基于图像,可以识别出图像中存在的物体和人,并告诉我们这个识别出的是啥子。
传统目标检测技术可以分为三个步骤:首先选择图像中的候选区域,之后提取Haar、HOG等视觉特征,最后基于支持向量机模型、RF模型等常用分类器进行分类。
下图是一张目标检测领域算法发展:
随着深度学习技术发展,可以自动学习图像特征
目标跟踪实现分为生成式基于相关滤波的传统opencv实现与判别式深度学习实现二种
生成式:在当前帧对目标区域建模,下一帧寻找与模型最相似的区域就是预测位置,比较著名的有卡尔曼滤波,粒子滤波,mean-shift等。
这里详细介绍一下帧差分法,备注:帧差分法是检测物体是否发生运动行为的方法。
判别式:当前帧以目标区域为正样本,背景区域为负样本,机器学习训练分类器,下一帧用训练好的分类器找最优区域。
2018年的VOT,基于全卷积孪生网络(SiamNet)的方法大崛起,凭借超越DCF方法的准确度和端到端训练的优势,成为目标追踪新的研究方向。
下图是GitHub上发布的2018VOT系统分支结构,包含了所有的目标跟踪算法。
它主要是通过神经网络,将一幅艺术风格画(style image)和一张普通的照片(content image)巧妙地融合,形成一张非常有意思的图片。
大白话说,图像往往由风格与内容组成,比如我们常常说画家的画风是怎么样的,毕加索的画风、动漫的画风。
风格迁移就是保留一张图片的内容(物体,人物),用另一张图片的色彩画图风格去填充。
风格迁移原理:
首先我们需要获取一张内容图片和一张风格图片;然后定义二个度量,一个度量值为内容度量值,另一个度量为风格度量值,其中内容度量值衡量二个图片之间的内容差异程度,风格度量衡量图片之间风格差异程度,最后建立神经网络模型,对内容图片中的内容和风格图片的风格进行提取,以内容图片为基准将其输入建立的模型中,不断调整内容度量值和风格度量值,让它们趋近于最小,最后输出的图片就是内容和风格融合的图片。
风格迁移大致可以分成四个步骤(图片的内容与风格提取是基于CNN算法,一般认为图像在CNN网络中,卷积层较低的层描述了图像的具体视觉特征(即纹理和颜色等),较高层特征是较为抽象的图像内容描述):
超分辨率是从给定的低分辨率(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)
代码也可以做图像姿态估计,只需要修改获取视频图像的那段代码即可
多人姿态估计:
自上而下的方法:
自顶向下的算法先从图像中检测出所有人,随后利用单人姿态估计的方法对所有人进行姿态估计。自顶向下算法的缺点是算法运行效率随着人数增加而降低,且部分被遮挡的人无法被检测,精度不高。
如下图中的上半示意图所示。
自下而上的方法:。
自底向上的算法,先检测出所有人的骨点,再将骨点进行连接形成图,最后通过图优化的方法剔除错误的连接,实现多人姿态估计。自底向上算法的优点是运行时间不随人数增加而线性增加,更有利于实时多人姿态估计。
如下图中的下半示意图所示。