计算机视觉算法与应用汇总

简介: 计算机视觉算法与应用汇总

计算机视觉概述


计算机视觉,与语音识别、自然语言理解,并称为人工智能的三大主要技术领域,也是AI技术落地产业化最广泛的领域。


计算机视觉主要分为2D视觉和3D视觉两大研究领域,2D视觉的研究内容包括:目标识别、目标跟踪、视频内容理解等;3D视觉的研究内容包括:基于图像的三维重建、目标三维姿态估计等。


当下2D视觉领域几乎被基于学习的方法统治,其中深度学习在2D视觉领域中发挥着重要的角色,许多视觉应用都是基于深度学习算法改进实现,尤其是CNN卷积神经网络,许多的算法模型都是基于CNN进行改进增加网络结构层来实现的。


如下图所示,2D视觉领域中,通过基础技能构建不同结构的神经网络,来实现中间技能层的核心模块,进而结合实际应用,实际的数据集,开发出不同的视觉应用。


9c8894826f8e253f4de9b51e73fd0e6e.png

中间技能层算法汇总


这里不同中间层的实现,更多采用深度学习神经网络算法实现。


图像分类

f0d44b224f1240d8c64242d0f1f9aa51.png


二分类:判断图片是否包含人

常用算法:SVM

多类别分类:比如鸟类识别

常用算法:LetNet、AlexNet、VGGNet系列、GoogLeNet、ResNet系列、Inception系列、DenseNet系列

多标签分类:每个类别包含多种属性的标签,比如对于服饰的分类,服饰是由上衣服颜色、纹理、袖长等标签组合

常用算法:R-CNN&LSTM


数据集


bc65c7bf65cdf75f1baa3a45d7edaf99.jpg


图像分割


图像分割顾名思义,对输入的视觉图像分割成不同的片段,类似于美图秀秀的抠图以简化应用于图像分析。

这里科普一下做图像分析的流程

图像检测:对图像中的目标进行检测,并识别出是人还是动物等类别,并用矩形画出检测区域

分割:识别矩形部分的对象,并理解分割对象。



1f4f147aeae82838a274d8f1f732bca0.png

普通分割:将图像中不同类型不同物体的像素区域分开,例如前景后景分割

常用方法:普通分割在平时的图像处理应用中还是会用到一些,常用方法有,阈值处理分割、k-means聚类、基于直方图、边缘检测、GrabCut算法

语义分割:在普通分割基础上,分类出每一块区域的语义,即在图像中标注每个区域是什么物体


175d48860f57491ea9516f1f474c805e.png


实例分割:在语义分割基础上,由于图像中可能存在多个一种类型的物体,比如一个图像有三只狗,实例分割,对画面中的狗进行编号1,2,3。

e43cfcf99c95a92b0353e0b547d07df6.png


  • 从上面的分割的介绍看实例分割是功能最全的分割方法,因此只枚举对实例分割的常用算法。

常用算法:FCN、DeepLab、Pyramid Scene Parsing Network、Mask R-CNN、U-Net


图像生成与转换


深度学习的另一个主要应用是生成模型(Generative Model),所谓生成模型,就是给定一组随机数,根据随机数来生成服从训练数据分布的数据,在计算机视觉中的一个重要应用就是给定一组图像,构造出一个模型,在这组图像上进行训练,这个模型能够生成类似于给定训练图像中实例的图像。



图像转换,图像到图像的转换被定义为将一个场景的可能表示转换成另一个场景的问题,例如图像结构图映射到RGB图像,或者反过来。该问题与风格迁移有关。


常用算法:变分自编码器(Variational AutoEncoder,VAE)和生成对抗网络(Generative Adversarial Network,GAN)二种。


0363ec6174a6c1c71100e4e80498ba61.png

图像重构(图像修复)


图像重构就是对图像中缺少的像素进行填补,并基于背景的像素信息进行重建的技术。有点像外面店里做老照片修复。

e41d17e405ce15a04c4892788d7b3dce.png


常用算法如下图所示:

8d1927db6d78e949c214bd0a3c2b1ff3.png

目标检测


目标检测也叫做目标提取,基于目标几何和统计特征的图像分割,大白话说,就是基于图像,可以识别出图像中存在的物体和人,并告诉我们这个识别出的是啥子。


传统目标检测技术可以分为三个步骤:首先选择图像中的候选区域,之后提取Haar、HOG等视觉特征,最后基于支持向量机模型、RF模型等常用分类器进行分类。


下图是一张目标检测领域算法发展

4321d3849510c6ef06235735b5f587f2.jpg

随着深度学习技术发展,可以自动学习图像特征

14bdc518431f03a0606cc566313bbe22.png

基于区域提取两阶段:之所以叫两阶段,是因为这几种算法的检测处理过程为两个过程。

1.基于图片提出若干可能包含物体的区域

2.提出这些区域运行时表现好点分类网络,得出每个区域的物体类别

常用算法:R-CNN、SPP-Net、FAST R-CNN、FASTER R-CNN

基于回归单阶段:表示没有中间区域检测的过程,直接从图片进行预测分类。

常用算法:YOLO系列、SSD


目标跟踪


目标跟踪实现分为生成式基于相关滤波的传统opencv实现与判别式深度学习实现二种


生成式:在当前帧对目标区域建模,下一帧寻找与模型最相似的区域就是预测位置,比较著名的有卡尔曼滤波,粒子滤波,mean-shift等。

f15c04e13ae30db4f61ff86200ec615e.png

这里详细介绍一下帧差分法,备注:帧差分法是检测物体是否发生运动行为的方法。


  1. 提取二帧连续图像
  2. 灰度化
  3. 高斯滤波(可选)
  4. cv2.absdiff求二帧图像差异部分
  5. 阈值处理
  6. 腐蚀膨胀
  7. 找出边框cv2.findContours
  8. 获取边框坐标,画出矩阵


判别式:当前帧以目标区域为正样本,背景区域为负样本,机器学习训练分类器,下一帧用训练好的分类器找最优区域。


2018年的VOT,基于全卷积孪生网络(SiamNet)的方法大崛起,凭借超越DCF方法的准确度和端到端训练的优势,成为目标追踪新的研究方向。


下图是GitHub上发布的2018VOT系统分支结构,包含了所有的目标跟踪算法。

风格迁移


它主要是通过神经网络,将一幅艺术风格画(style image)和一张普通的照片(content image)巧妙地融合,形成一张非常有意思的图片。


大白话说,图像往往由风格与内容组成,比如我们常常说画家的画风是怎么样的,毕加索的画风、动漫的画风。

风格迁移就是保留一张图片的内容(物体,人物),用另一张图片的色彩画图风格去填充


54ecae8ea5b8449f5746a2ca736b6b6d.png


风格迁移原理:

首先我们需要获取一张内容图片和一张风格图片;然后定义二个度量,一个度量值为内容度量值,另一个度量为风格度量值,其中内容度量值衡量二个图片之间的内容差异程度,风格度量衡量图片之间风格差异程度,最后建立神经网络模型,对内容图片中的内容和风格图片的风格进行提取,以内容图片为基准将其输入建立的模型中,不断调整内容度量值和风格度量值,让它们趋近于最小,最后输出的图片就是内容和风格融合的图片。


风格迁移大致可以分成四个步骤(图片的内容与风格提取是基于CNN算法,一般认为图像在CNN网络中,卷积层较低的层描述了图像的具体视觉特征(即纹理和颜色等),较高层特征是较为抽象的图像内容描述):


内容损失

内容损失选择通常是CNN卷积层高层的特征,比较两幅图像的内容相似性。

风格损失

风格损失选择通常是CNN卷积层低层的特征,比较两幅图的风格相似性

总损失

内容+风格的相似度评价

训练

计算总损失的模型,可以选择VGG系列模型


超分辨率


超分辨率是从给定的低分辨率(LR)图像恢复高分辨率(HR)图像的过程。

常用算法:SRCNN


人体姿态估计


体姿态骨架以图形格式表示人的活动。

本质上,它是一组坐标,将坐标组合起来就可以描述人的姿态。骨架中的每个坐标都称为关键点(或关节)。两个关键点之间的有效连接称为肢体。请注意,并非所有关键点组合起来都会产生有效的配对(肢体)。

690fed99760a865a2d86f0a6b4071d36.png

单人姿态估计


无须深度学习,可以使用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)


代码也可以做图像姿态估计,只需要修改获取视频图像的那段代码即可

多人姿态估计

自上而下的方法

自顶向下的算法先从图像中检测出所有人,随后利用单人姿态估计的方法对所有人进行姿态估计。自顶向下算法的缺点是算法运行效率随着人数增加而降低,且部分被遮挡的人无法被检测,精度不高。

如下图中的上半示意图所示。

自下而上的方法:。

自底向上的算法,先检测出所有人的骨点,再将骨点进行连接形成图,最后通过图优化的方法剔除错误的连接,实现多人姿态估计。自底向上算法的优点是运行时间不随人数增加而线性增加,更有利于实时多人姿态估计。

如下图中的下半示意图所示。





相关文章
|
1天前
|
机器学习/深度学习 算法 C语言
【C言专栏】递归算法在 C 语言中的应用
【4月更文挑战第30天】本文介绍了递归算法在C语言中的应用,包括基本概念(通过调用自身解决子问题)、特点(调用自身、终止条件、栈空间)和实现步骤(定义递归函数、分解问题、设置终止条件、组合解)。文中通过阶乘计算和斐波那契数列两个案例展示了递归的使用,强调了递归可能导致的栈溢出问题及优化需求。学习递归有助于理解和应用“分而治之”策略。
|
2天前
|
机器学习/深度学习 数据可视化 算法
【Python机器学习专栏】t-SNE算法在数据可视化中的应用
【4月更文挑战第30天】t-SNE算法是用于高维数据可视化的非线性降维技术,通过最小化Kullback-Leibler散度在低维空间保持数据点间关系。其特点包括:高维到二维/三维映射、保留局部结构、无需预定义簇数量,但计算成本高。Python中可使用`scikit-learn`的`TSNE`类实现,结合`matplotlib`进行可视化。尽管计算昂贵,t-SNE在揭示复杂数据集结构上极具价值。
|
2天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】层次聚类算法的原理与应用
【4月更文挑战第30天】层次聚类是数据挖掘中的聚类技术,无需预设簇数量,能生成数据的层次结构。分为凝聚(自下而上)和分裂(自上而下)两类,常用凝聚层次聚类有最短/最长距离、群集平均和Ward方法。优点是自动确定簇数、提供层次结构,适合小到中型数据集;缺点是计算成本高、过程不可逆且对异常值敏感。在Python中可使用`scipy.cluster.hierarchy`进行实现。尽管有局限,层次聚类仍是各领域强大的分析工具。
|
2天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习算法的原理与应用
【4月更文挑战第30天】集成学习通过组合多个基学习器提升预测准确性,广泛应用于分类、回归等问题。主要步骤包括生成基学习器、训练和结合预测结果。算法类型有Bagging(如随机森林)、Boosting(如AdaBoost)和Stacking。Python中可使用scikit-learn实现,如示例代码展示的随机森林分类。集成学习能降低模型方差,缓解过拟合,提高预测性能。
|
3天前
|
存储 算法 搜索推荐
算法的复杂性与应用
算法的复杂性与应用
7 0
|
3天前
|
存储 算法 Python
数据结构与算法基础及在计算机科学中的应用
数据结构与算法基础及在计算机科学中的应用
7 0
|
3天前
|
存储 机器学习/深度学习 算法
|
5天前
|
存储 安全 算法
【专栏】保护数据安全的重要性:安全加密算法在数据保护中的应用
【4月更文挑战第27天】在数字化时代,数据安全至关重要,关系到个人隐私、企业商业机密、国家安全及经济发展。安全加密算法(如对称加密、非对称加密和哈希算法)在保护数据方面发挥关键作用。它们应用于电子商务、金融、物联网、云存储和数字签名等领域,确保信息传输和存储的安全。面对日益复杂的挑战,我们需要持续研究和应用加密技术,提高数据安全意识,共同维护数字世界的繁荣与安全。
|
7天前
|
存储 算法 前端开发
探索数据结构与算法在前端开发中的应用
本文探讨了数据结构与算法在前端开发中的重要性和应用。通过分析常见的前端场景,结合数据结构与算法的原理,介绍了如何优化前端代码性能,提高用户体验。
|
15天前
|
算法 Linux
R语言随机波动率(SV)模型、MCMC的Metropolis-Hastings算法金融应用:预测标准普尔SP500指数
R语言随机波动率(SV)模型、MCMC的Metropolis-Hastings算法金融应用:预测标准普尔SP500指数
25 6