opencv图像处理机器学习真实项目教程(python实现)1计算机视觉简介

1 计算机视觉简介

欢迎来到计算机视觉的世界。 本书将带您踏上令人兴奋且快速发展的计算机视觉和图像处理世界的旅程。本书首先介绍计算机视觉和OpenCV库。 然后,我们将继续介绍本课程的基本库和所需的环境设置。

主要内容:

  • 计算机视觉简介
  • 计算机视觉的应用
  • Python
  • OpenCV
    • OpenCV简史
    • OpenCV 4.7
  • 支持库
  • 环境设置
    • 安装Python
    • 包管理器
    • 安装支持库
    • 安装 OpenCV
    • 验证我们的安装
    • 集成开发环境
  • 文档

1.1 计算机视觉简介

计算机视觉旨在为机器提供像人类一样识别和分析图像或视频的能力。 通过开发教计算机视觉的算法,计算机视觉有可能颠覆医疗保健和汽车等广泛行业。

随着相机质量的提高和获得优质相机的便利性的提高,世界上的视觉数据量正在爆炸式增长,计算机视觉帮助我们理解这些数据并更好地利用它们。

今天的工程师已经能够开发出能够产生类似眼睛的图像的相机。 随着计算机学会了观察的能力,我们的工作就是利用该信息并用它来理解和分析该数据。

你可知道? 典型的相机传感器可以捕获1680万种不同的颜色,因为它的位深度为每个颜色通道8位。 然而,人眼只能感知大约1000万种颜色,因此人眼无法区分所有这些颜色。相机和计算机视觉系统能够捕获和处理比人眼能看到的更多的颜色。

计算机视觉是人工智能的一个子集,其核心是视觉信息。该领域的重点是使计算机能够处理、分析和解释图像数据,并从中生成有意义的见解。

随着技术的进步,计算能力和相机随着时间的推移而变得越来越好,该领域已成为当今最有前途的职业之一。 我们能够捕捉高质量的图像并以一定的速度处理大量数据,这在几年前是不可能的。

计算机视觉在各个领域都有广泛的应用。无论是医疗保健、国防、交通,甚至娱乐,计算机视觉在所有这些领域都展现出了巨大的前景。该领域的创新为这些领域做出了重大贡献。

1.2 计算机视觉的应用

我们的日常生活中充斥着计算机视觉,从智能手机相机中的自动面部检测到Instagram帖子或Snapchat滤镜中图像质量的改进。 计算机视觉给我们的日常生活留下了深刻的印象。

计算机视觉彻底改变了医疗保健领域。 它极大地提高了诊断速度,帮助医生提供更精确的诊断。 通过分析相关区域的图像,可以分析皮肤畸形,帮助诊断皮炎、黑色素瘤等疾病。 使用医学成像,计算机视觉可以通过分析X射线或MRI扫描来帮助我们了解内脏器官的缺陷,从而更快地进行诊断或让医生发现骨折或肿瘤等问题。 无论是使用胸部X光检查来检测结核病等疾病,还是分析心脏图像来检测心脏病,计算机视觉已经证明了医疗领域可以从中受益匪浅。

计算机视觉最有前途的应用之一是帮助视障人士。计算机视觉帮助视障人士驾驭周围环境,从而提高他们的独立性。 计算机视觉技术可以分析环境并向用户提供音频或触觉反馈。导航辅助、物体检测以及面部或文本识别等应用使视障人士受益匪浅。此外,随着时间的推移,这些技术预计将进一步改进。

微软的PeopleLens技术可帮助视障儿童和青少年更轻松地与同龄人互动。 它是一种头戴式设备,可以通过空间音频大声朗读已知个体的名字,使学习者能够了解同伴的相对位置和距离。 该技术目前正针对5至11岁的学习者进行多阶段研究。

您有没有想过Snapchat的滤镜如何如此快速、准确地将效果应用到您的脸上? 答案在于计算机视觉,这项技术席卷了社交媒体。 从改变背景到增强图像,计算机视觉是一个重要的工具如今社交媒体的重要组成部分。 这些算法会检测您的面部特征,并准确地知道如何以及在何处应用特定效果。 iPhone上的动话表情是计算机视觉如何帮助图像变得栩栩如生的绝佳示例。

社交媒体公司不仅将计算机视觉用于有趣的用例,还用于各种其他目的。 例如,图像可以被压缩,同时保持其质量,从而更容易通过互联网发送它们。社交媒体公司使用计算机视觉来调节内容。算法用于自动过滤掉不当内容,例如裸体或暴力,无需人工干预。

计算机视觉不仅被用于商业项目,而且还证明了它在更无私的努力中的有用性,为地球生命各个方面的进步做出了贡献。 例如计算机视觉已用于野生动物保护,这有助于保护各种濒临灭绝的物种。 监控应用有助于解决偷猎问题,并有助于维持森林健康的生态系统。 与野生动物类似,计算机视觉也有助于植物生命对话。 自然资源保护主义者已经能够使用计算机视觉来帮助他们完成植物病害检测、物种识别和栖息地监测等各种用例。

除此之外,计算机视觉领域还有无限的可能性。 已有视频监控、人脸识别、自动驾驶汽车、机器人、农业、零售、游戏和体育等用例。计算机视觉提供的应用程序数量无穷无尽,并且该列表在未来几年将继续增长。

世界以如此快的速度发展。 计算机视觉为崭露头角的工程师提供了无尽的令人兴奋的机会,以前所未有的方式帮助解决现实生活中的问题。

1.3 Python

为了深入研究计算机视觉的世界,我们首先需要了解我们将要使用的包和库。

Python 由于其易用性和多功能性而成为计算机视觉任务的流行语言,这使其成为一种具有广泛用途的流行语言。 大量专为图像处理而设计的库和工具使其成为计算机视觉应用程序的非凡语言。 此外,庞大的社区支持和跨平台兼容性使其成为任何踏入计算机视觉世界的人的首选。

Python 3是已发布的最新版本的Python。 它包含Unicode支持,这意味着世界各地的开发人员可以使用多种语言的Python。 Python 3以改进的方式处理异常,这使得开发人员可以轻松处理错误。 此外,更好的垃圾收集和内存管理使 Python 3 比其前身快得多。

Python 3包含丰富的图像处理库,并提供许多有利于计算机视觉应用的功能。 因此,它是在该领域使用的优秀语言。

1.4 OpenCV

开源计算机视觉库 (OpenCV Open-Source Computer Vision Library) 是我们将用于图像处理应用程序的核心库。 OpenCV 最初是用 C++ 语言编写的,尽管它使用Python绑定与Python兼容。 OpenCV与Python提供了强大的组合,可用于创建强大的计算机视觉应用程序,并经常用于研究和部署。

OpenCV最初于2000年发布,是一个开源库,现已成为使用最全面的计算机视觉库之一。 它提供了广泛的图像处理功能,并用于安全、自动化和医疗保健等各种应用。

OpenCV的另一个主要优势是它与Python、Java 和 MATLAB等多种编程语言的兼容性。 该库也是跨平台的,可以在多种系统上运行,包括 Linux、Windows、Mac、Android 和 iOS。 此外,OpenCV 与各种计算机视觉和深度学习框架兼容,即 TensorFlow 和 PyTorch(我们将在继续阅读后续章节时详细讨论这些框架)。

OpenCV包含大量预构建函数,可用于多种开发任务。 图像平滑、直方图、边缘和轮廓检测等功能本质上内置于OpenCV库中,这使得您可以在计算机视觉任务中轻松实现这些功能。 这些函数可用于广泛的操作,包括特征检测、图像分割、对象检测等等。 此外,OpenCV还具有自动内存管理功能,可自动分配和释放内存图像和矩阵运算中的理论,简化了这些函数的使用并增强了它们的优化。

此外,OpenCV不仅限于图像处理,它还为视频分析和视频处理提供了极好的接口。 它提供使用来自各种来源(例如网络摄像头和摄像机或远程 IP 摄像机)的视频流的功能。 视频功能允许开发许多可以实时处理视频的用例。

实时处理视频的能力开启了广泛的可能用例,例如视频监控和自动驾驶汽车。 利用对象检测和跟踪功能,OpenCV改进了视频监控,并提供了增强的安全解决方案,在许多场景中其表现优于人眼。 计算机视觉催生了另一个新领域,那就是自动驾驶汽车。 通过使用 OpenCV 实时处理视频的能力以及对象检测和图像分割等功能,自动驾驶汽车如今已成为现实。

特斯拉的Autopilot系统已在公共道路上行驶了超过 50 亿英里(截至 2021 年 9 月)。 美国国家公路交通安全管理局指出,特斯拉的自动驾驶功能使车祸率降低了高达40%。 特斯拉的汽车不断收集人类驾驶员的驾驶模式和行为数据,然后利用这些数据逐步增强自动驾驶系统的性能。

1.4.1 OpenCV 简史

随着时间的推移,OpenCV 经历了各种发展,该库已经发布了四个主要版本。

OpenCV 1.x是2000年发布的OpenCV库的初始版本。它提供了图像处理的基本计算机视觉算法,例如边缘和角点检测、特征检测和图像过滤。

OpenCV 2.x于2009年发布。它添加了先进的计算机视觉功能,例如对象检测和对象跟踪。 该版本引入了“Mat”数据结构,并添加了用于实时分析的GPU加速。 它增加了对多个平台的支持,包括 Windows、Linux 和 Mac,这使得开发人员能够在他们选择的平台上探索 OpenCV。

OpenCV 3.x 于 2015 年发布。该版本主要引入了新的深度学习模块,其中包括 TensorFlow 和 Caffe 等流行的深度学习框架,允许用户使用神经网络执行各种任务,例如对象分类、对象检测、 等等。 通过添加对多线程和 SIMD 操作的支持,这比 OpenCV 的早期版本更快、更高效。 该版本具有模块化结构,用户可以仅安装必要的模块,从而减少了库的整体大小。 它对现有算法(例如人脸检测)进行了改进,还包括多种用于计算机视觉的新算法(例如 SIFT 和 SURF 特征检测器)。

OpenCV 4.x 是 OpenCV 的最新版本,于 2018 年发布。它包括对 Vulkan 图形的支持,可以在支持硬件上进行更高效的计算。 它还添加了更多框架,例如 PyTorch 和 ONNX,以改进深度学习支持。 添加了一些新的计算机视觉算法和功能,以实现更好的图像处理以及各种性能更新,使该库更快、更高效。 OpenCV 4.x 还为 CUDA 提供了更好的支持,CUDA 代表计算机统一设备架构,是 NVidia 为提高性能而开发的并行处理单元。 OpenCV 4.x 通过添加对深度相机的支持来实现 3D 图像的使用。

1.4.2 OpenCV

OpenCV 的 4.7于 2022 年 12 月 28 日发布,包含许多功能,例如:

  • dnn 模块的改进:新的网络架构、华为 CANN 后端、改进的 OpenVINO 支持以及性能优化。
  • 新的图像和视频编解码器:适用于多页图像格式的基于迭代器的 API、libspng、SIMD 加速、Android 上的 H264/H265 支持、Orbbec - - RGB-D 相机后端以及通过 GStreamer 后端 CUDA 12 和视频编解码器 SDK 改进的音频输入 支持。
  • 新算法:NanoStack 和 StackBlur。
  • 用于可扩展向量指令 (RISC-V RVV) 的新通用内在后端。

OpenCV 4.8 版本于 2023年7月2日发布,的主要更新内容如下

  • dnn 模块的改进:
    • 引入了 TFLite 模型支持
    • 引允许在没有 protobuf 依赖的情况下构建
    • 引重构 Vulcan 后端以获得更好的性能和稳健性
    • 引现代 OpenVINO 支持(也在gapi模块中)
  • 物体检测:
    • 引FaceDetectorYN 更新至 v2,具有更好的性能和地标支持
    • 引基于ArUco的新型二维码检测算法
    • 引条形码模块已从 opencv_contrib 移至 objdetect 模块
    • 引为模式生成器脚本添加了 Charuco 板支持
  • 图像和视频编解码器:
    • 引通过 libavif 添加了 AVIF 支持
    • 引支持 Orbbec Femto Mega 相机
    • 引修复 OBS 虚拟相机捕捉问题
  • 新函数 cv::hasNonZero 和 cv::reduce 的新 REDUCE_SUM2 模式
  • 更新了 RISC-V RVV 支持以与 LLVM 16 和 GCC 13 兼容
  • 生成的 Python 类型stub 文件允许工具和 IDE 获取函数和类型签名,从而实现自动完成和静态类型检查

参考资料

1.5 支持库

1.5.1 NumPy

NumPy是一个用于数值计算的 Python 库,可以使用大型多维数组。 它提供了大量可用于这些数组的数学函数。 它允许我们可以执行创建和操作数组等操作、加法和减法等算术运算以及对这些数组执行三角、统计或对数运算等各种数学函数。

NumPy使我们能够非常有效地执行数学运算。 它通过利用系统中的多核CPU和显卡来优化可用计算能力的使用,从而加快数值运算的计算速度。

广播是 NumPy 的一项强大功能,因为它允许将各种大小和形状的数组一起用于算术运算。 NumPy通过自动增加或广播较小数组的大小以匹配较大数组的大小来实现此目的。 这有助于我们轻松编写代码,因为它消除了使用循环或操作不同大小的数组可能需要的任何其他操作的需要。

NumPy通常与其他计算库结合使用,帮助用户无缝执行数据分析和可视化等各种应用。 SciPy是一个构建 NumPy之上的库,它为回归或数据建模等多种数据分析任务提供支持。 Matplotlib是另一个经常与NumPy一起使用的库。 Matplotlib是一个用于创建高质量数据可视化的库。 随着课程的进展,我们将广泛使用这些库。

1.5.2 Matplotlib

Matplotlib 是一个广泛使用的数据可视化和数据分析库。 它提供了一系列绘图功能,帮助用户创建各种类型的可视化。

可以使用 Matplotlib 创建的一些常见绘图类型包括线图、散点图、直方图和热图。 Matplotlib 还提供了广泛定制这些图的能力。 用户可以选择他们想要的任何颜色、图的标题、包括注释或根据他们的要求调整图中的轴。

Matplotlib还允许创建子图,这是在单个图形中创建多个图的一种方法。 它还提供许多用于保存绘图的输出格式,例如 JPEG、PNG、PDF 等。

Matplotlib通常与NumPy一起使用。 其易于使用的功能以及与其他库的互操作性使其成为数据科学家和研究人员进行数据可视化的热门选择。

1.5.3 SciPy

SciPy 是一个开源库,为数据分析和可视化提供了广泛的功能。 它由帮助用户进行科学和数学计算的模块组成,包括统计、线性代数、图像或信号处理等模块。

SciPy构建在NumPy库之上。 虽然 NumPy 提供了处理 n 维数组并对其应用一些数学运算的功能,但SciPy更进一步,为数据处理、优化等提供了更复杂和方便的函数。

SciPy与Python中的其他库无缝集成,例如 NumPy、Scikit-learn 和 Matplotlib。 这使得 SciPy 成为数据分析的强大工具,因为研究人员可以将它与其他库一起使用,为数据科学创建一个全面的环境。

1.5.4 Scikit-Learn

Scikit-Learn或sklearn是一个机器学习库,提供了广泛的机器学习算法,例如回归、分类等。 它还为用户提供了各种数据预处理和模型评估工具,使其成为数据科学家的完整软件包。

Scikit-learn 构建 NumPy、SciPy 和Matplotlib之上,可以轻松地与这些库集成,从而帮助用户执行各种应用程序。 它还可以与其他 Python 库集成,并可以与 TensorFlow 等框架一起使用。

虽然 Scikit-Learn 不是图像处理库,但它是用于机器学习任务的强大工具,我们将在本课程后面的部分中实现机器学习算法时使用它。

1.5.4 Scikit-Image

Scikit-Image是一个图像处理库,提供图像分割、过滤、特征提取等各种算法。

Scikit-Image 提供与 OpenCV 类似的功能。 然而,它被认为更容易学习、更用户友好,而 OpenCV 提供了更好的优化,因此具有更好的性能。

与Scikit-Learn 类似,该库构建在 numpy、scipy 和 matplotlib 之上。 如前所述,OpenCV 是基于 C++ 构建的,并具有 Python 绑定。

虽然我们将主要在计算机视觉之旅中使用OpenCV,但 Scikit-Image 有时在实现特定算法时会派上用场。

1.5.5 Mahotas

Mahotas 是另一个流行的图像处理库,其中包含用于计算机视觉任务的各种算法。 Mahotas基于NumPy库构建,并被证明对于许多图像处理任务来说是高效的。

我们的首要用于图像处理库是OpenCV。 然而,我们将在特定用例中使用Mahotas,并将用它来补充 OpenCV。

我们将利用每个图像处理库的优势。

1.5.6 TensorFlow

TensorFlow 是一个用于开发基于深度学习的人工智能应用程序的开源库。 开发人员可以使用TensorFlow为图像识别和自然语言处理等各种用例训练神经网络。

TensorFlow具有广泛的功能,这使其成为训练神经网络的最佳框架之一。 从为移动应用程序创建小型优化模型到大型行业规模模型,TensorFlow可用于训练任何规模的模型。 它还提供了多种可视化工具来帮助开发人员在训练时监控和评估他们的模型。 此外,TensorFlow 提供了适应性强的架构,这意味着用户可以在各种平台(例如 CPU 或 GPU)上训练模型。

ChatGPT模型是使用TensorFlow创建的。 使用TensorFlow的一个特定变体,即TensorFlow网格来训练该模型。 训练数据估计有数百GB或数TB。 模型参数的数量并未透露,但据传约为1.75 亿个。

谷歌开发了TPU,代表张量处理单元(Tensor Processing Units)。 这些是专门为机器学习任务设计的定制集成电路。 TPU专门为优化矩阵运算而设计,由于内存更大,可以并行处理更多数据,并且与其他芯片相比功耗更低。 该芯片设计为与 TensorFlow 配合使用,TensorFlow 现在包含利用 TPU 的特定函数。 通过将 TensorFlow 与该硬件结合使用,用户可以显着缩短神经网络训练时间和模型的推理速度。

您可以使用 Google Cloud(Google 提供的免费笔记本)在TPU上试验和训练神经网络模型。

1.5.7 Keras

Keras 是一个易于使用的库,可帮助用户快速创建和试验神经网络。 Keras是一种高级神经网络 API,这意味着用户不必从头开始编写复杂的神经网络代码,并且可以使用预编码的构建块(例如层和激活函数)进行模型开发。

Keras最初是作为神经网络的独立库开发的。 不过,Google 在2015年收购了 Keras,自此,Keras就被集成到了 TensorFlow 框架中。

我们主要关注图像处理和基于OpenCV 的方法,但有一个例子表明神经网络是该领域的重要组成部分,并且有一个专门的章节介绍神经网络,我们使用它来训练我们自己的神经网络 TensorFlow 和 Keras。

1.5.8 Dlib

Dlib 是一个 C++ 库,包含用于计算机视觉或自然语言处理任务的各种应用程序。 Dlib 提供了用于各种任务的功能,例如文本分类和支持向量机。 然而,就本书的范围而言,我们将其限制在图书馆的计算机视觉部分。

Dlib 广泛应用于计算机视觉应用中的面部识别任务。 Dlib 的人脸识别模型被认为是人脸检测和识别最可靠的模型之一。 Dlib 模型已经能够证明这些应用程序的高精度,甚至能够成功地从具有挑战性的视频流中识别和检测人脸。

Dlib 68 面部点检测器是一种流行的模型,用于在图像和视频中绘制面部标志点。 预训练的模型可以检测人脸上的鼻子、耳朵等68个关键点,用户可以将其用于人脸相关的计算机视觉项目。

1.6 环境设置(略)

在涵盖了计算机视觉所需的基础知识和基本库之后,我们可以继续设置我们自己的定制计算机视觉环境来执行我们的代码。

posted @ 2023-12-19 18:23  磁石空杯  阅读(186)  评论(0编辑  收藏  举报