一、引言
在计算机视觉领域,目的检测不停是一个告急且具有挑战性的任务。传统的目的检测方法通常依赖于手工设计的特征和复杂的机器学习算法,不但计算量大,而且正确率和速度每每难以满足实际应用的需求。近年来,随着深度学习技术的飞速发展,出现了许多良好的目的检测算法,此中 YOLO(You Only Look Once)系列算法以其高效、快速和正确的特点,受到了广泛的关注和应用。本文将详细先容 YOLO 网络的原理及发展史。
二、YOLO 网络的原理
(一)整体架构
YOLO 网络是一种基于深度学习的端到端目的检测算法,它将目的检测问题转化为一个回归问题,直接在图像上推测目的的位置和类别。YOLO 网络的整体架构主要由卷积层、全毗连层和输出层组成。
- 卷积层:YOLO 网络的卷积层主要用于提取图像的特征。这些卷积层通常利用小尺寸的卷积核(如 3x3 或 1x1),并采用批量归一化(Batch Normalization)和激活函数(如 Leaky ReLU)来提高网络的性能和稳固性。
- 全毗连层:YOLO 网络的全毗连层主要用于将提取的特征映射到目的的位置和类别。这些全毗连层通常具有较高的维度,以适应不同大小和形状的目的。
- 输出层:YOLO 网络的输出层主要用于输出目的的位置和类别。输出层通常由多个通道组成,每个通道对应一个不同的目的类别或位置参数。
(二)目的检测过程
YOLO 网络的目的检测过程主要分为以下几个步骤:
- 图像划分:将输入图像划分成 SxS 个网格单位。每个网格单位负责推测中心点落在该网格单位内的目的。
- 目的推测:对于每个网格单位,YOLO 网络推测 B 个边界框(bounding box)以及这些边界框的置信度(confidence score)。每个边界框由四个参数组成,分别是边界框的中心坐标(x, y)、宽度(w)和高度(h)。置信度表现边界框包罗目的的可能性以及边界框推测的正确性。
- 类别推测:对于每个边界框,YOLO 网络推测 C 个类别概率,表现该边界框属于不同类别的可能性。
- 非极大值克制(Non-Maximum Suppression,NMS):在得到所有边界框的推测结果后,利用非极大值克制算法去除冗余的边界框,只生存最有可能包罗目的的边界框。
(三)损失函数
YOLO 网络的损失函数主要由三个部门组成:坐标误差、置信度误差和类别误差。
- 坐标误差:坐标误差用于衡量边界框推测的正确性。坐标误差由边界框的中心坐标误差和宽度、高度误差组成。中心坐标误差利用均方误差(Mean Squared Error,MSE)计算,宽度、高度误差利用平方根均方误差(Root Mean Squared Error,RMSE)计算。
- 置信度误差:置信度误差用于衡量边界框包罗目的的可能性以及边界框推测的正确性。置信度误差由包罗目的的边界框的置信度误差和不包罗目的的边界框的置信度误差组成。包罗目的的边界框的置信度误差利用二元交叉熵(Binary Cross Entropy,BCE)计算,不包罗目的的边界框的置信度误差利用均方误差计算。
- 类别误差:类别误差用于衡量边界框属于不同类别的可能性。类别误差利用交叉熵(Cross Entropy,CE)计算。
三、YOLO 网络的发展史
(一)YOLO v1
- 提出时间:2015 年,由 Joseph Redmon 等人提出。
- 主要特点:
- 速度快:YOLO v1 可以在实时速度下举行目的检测,每秒可以处置惩罚 45 帧图像。
- 端到端训练:YOLO v1 是一种端到端的目的检测算法,可以直接在图像上举行训练和推测,不必要复杂的预处置惩罚和后处置惩罚步骤。
- 正确率较低:由于 YOLO v1 将目的检测问题转化为一个回归问题,直接在图像上推测目的的位置和类别,因此正确率相对较低。
- 网络结构:YOLO v1 的网络结构主要由 24 个卷积层和 2 个全毗连层组成。输入图像的大小为 448x448,经过卷积层和全毗连层的处置惩罚后,输出一个 7x7x30 的张量,表现 7x7 个网格单位中每个网格单位推测的 2 个边界框以及这些边界框的置信度和类别概率。
(二)YOLO v2
- 提出时间:2016 年,由 Joseph Redmon 等人提出。
- 主要特点:
- 正确率提高:YOLO v2 在 YOLO v1 的底子上举行了改进,提高了目的检测的正确率。YOLO v2 采用了一系列的技术,如批归一化(Batch Normalization)、高分辨率分类器(High Resolution Classifier)、卷积层与池化层的融合(Convolutional With Anchor Boxes)等,使得网络的性能得到了显著的提升。
- 速度更快:YOLO v2 在保持较高正确率的同时,进一步提高了目的检测的速度。YOLO v2 可以在实时速度下举行目的检测,每秒可以处置惩罚 67 帧图像。
- 支持多尺度输入:YOLO v2 支持多尺度输入,可以处置惩罚不同大小的图像。这使得 YOLO v2 可以在不同的装备上举行部署,具有更好的通用性。
- 网络结构:YOLO v2 的网络结构主要由 19 个卷积层和 5 个最大池化层组成。输入图像的大小为 416x416,经过卷积层和最大池化层的处置惩罚后,输出一个 13x13x125 的张量,表现 13x13 个网格单位中每个网格单位推测的 5 个边界框以及这些边界框的置信度和类别概率。
(三)YOLO v3
- 提出时间:2018 年,由 Joseph Redmon 等人提出。
- 主要特点:
- 正确率更高:YOLO v3 在 YOLO v2 的底子上举行了改进,进一步提高了目的检测的正确率。YOLO v3 采用了更深的网络结构、多尺度推测、特征融合等技术,使得网络的性能得到了显著的提升。
- 速度较快:YOLO v3 在保持较高正确率的同时,仍旧具有较快的目的检测速度。YOLO v3 可以在实时速度下举行目的检测,每秒可以处置惩罚 45 帧图像。
- 支持多类别检测:YOLO v3 支持多类别检测,可以同时检测多个不同类别的目的。这使得 YOLO v3 在实际应用中具有更广泛的适用性。
- 网络结构:YOLO v3 的网络结构主要由 53 个卷积层和一些残差块(Residual Block)组成。输入图像的大小为 416x416,经过卷积层和残差块的处置惩罚后,输出三个不同尺度的特征图,分别用于推测不同大小的目的。每个特征图上的每个网格单位推测 3 个边界框以及这些边界框的置信度和类别概率。
(四)YOLO v4
- 提出时间:2020 年,由 Alexey Bochkovskiy 等人提出。
- 主要特点:
- 正确率极高:YOLO v4 在 YOLO v3 的底子上举行了改进,采用了一系列的技术,如 CSPDarknet53 骨干网络、Mish 激活函数、SPP 模块、PANet 路径聚合网络等,使得网络的性能得到了极大的提升。YOLO v4 在各种数据集上的正确率都达到了非常高的程度。
- 速度快:YOLO v4 在保持极高正确率的同时,仍旧具有较快的目的检测速度。YOLO v4 可以在实时速度下举行目的检测,每秒可以处置惩罚 65 帧图像。
- 易于训练:YOLO v4 采用了一些技术,使得网络的训练更加轻易和稳固。例如,YOLO v4 采用了 CutMix 和 Mosaic 数据增强技术、DropBlock 正则化技术等,提高了网络的泛化本事和鲁棒性。
- 网络结构:YOLO v4 的网络结构主要由 CSPDarknet53 骨干网络、SPP 模块、PANet 路径聚合网络和 YOLO 检测头组成。输入图像的大小为 416x416,经过 CSPDarknet53 骨干网络、SPP 模块和 PANet 路径聚合网络的处置惩罚后,输出三个不同尺度的特征图,分别用于推测不同大小的目的。每个特征图上的每个网格单位推测 3 个边界框以及这些边界框的置信度和类别概率。
(五)YOLO v5
- 提出时间:2020 年,由 Ultralytics 公司提出。
- 主要特点:
- 速度极快:YOLO v5 在保持较高正确率的同时,具有极快的目的检测速度。YOLO v5 可以在实时速度下举行目的检测,每秒可以处置惩罚 140 帧图像以上。
- 易于部署:YOLO v5 采用了 PyTorch 框架,具有良好的可扩展性和可移植性。YOLO v5 可以轻松地部署在各种装备上,包罗 CPU、GPU 和移动装备等。
- 机动的设置:YOLO v5 提供了多种不同的模型设置,可以根据不同的需求举行选择。例如,YOLO v5 提供了 YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x 等不同大小的模型,用户可以根据自己的计算资源和应用场景选择合适的模型。
- 网络结构:YOLO v5 的网络结构主要由骨干网络、颈部网络和头部网络组成。骨干网络采用了 CSPDarknet 结构,颈部网络采用了 FPN+PAN 结构,头部网络采用了 YOLO 检测头。输入图像的大小为 640x640,经过骨干网络、颈部网络和头部网络的处置惩罚后,输出三个不同尺度的特征图,分别用于推测不同大小的目的。每个特征图上的每个网格单位推测 3 个边界框以及这些边界框的置信度和类别概率。
四、总结
YOLO 网络是一种基于深度学习的端到端目的检测算法,它将目的检测问题转化为一个回归问题,直接在图像上推测目的的位置和类别。YOLO 网络具有速度快、正确率高、易于部署等长处,在计算机视觉领域得到了广泛的应用。随着深度学习技术的不绝发展,YOLO 网络也在不绝地改进和完善。从 YOLO v1 到 YOLO v5,YOLO 网络的正确率和速度都得到了极大的提升,同时也变得更加易于训练和部署。相信在将来,YOLO 网络将继续发挥告急的作用,为计算机视觉领域的发展做出更大的贡献。
以下是一个利用 YOLOv5 的 C++ 示例代码,必要安装 OpenCV 和设置好 YOLOv5 的环境。
留意:这个示例代码假设你已经有了训练好的 YOLOv5 模型权重文件(例如 best.pt),而且将其放在了正确的路径下。
- #include <iostream>
- #include <opencv2/opencv.hpp>
- #include <opencv2/dnn.hpp>
- const std::string modelPath = "best.pt";
- int main() {
- // 加载 YOLOv5 模型
- cv::dnn::Net net = cv::dnn::readNetFromONNX(modelPath);
- // 打开摄像头
- cv::VideoCapture cap(0);
- if (!cap.isOpened()) {
- std::cerr << "无法打开摄像头。" << std::endl;
- return -1;
- }
- cv::Mat frame;
- while (true) {
- cap >> frame;
- if (frame.empty()) {
- std::cerr << "无法获取帧。" << std::endl;
- break;
- }
- // 图像预处理
- cv::Mat blob;
- cv::dnn::blobFromImage(frame, blob, 1.0 / 255.0, cv::Size(640, 640), cv::Scalar(), true, false);
- // 设置输入
- net.setInput(blob);
- // 前向传播进行检测
- std::vector<cv::Mat> outputs;
- net.forward(outputs, net.getUnconnectedOutLayersNames());
- // 解析输出结果
- std::vector<int> classIds;
- std::vector<float> confidences;
- std::vector<cv::Rect> boxes;
- for (size_t i = 0; i < outputs.size(); ++i) {
- float* data = (float*)outputs[i].data;
- for (int j = 0; j < outputs[i].rows; ++j, data += outputs[i].cols) {
- cv::Mat scores = outputs[i].row(j).colRange(5, outputs[i].cols);
- cv::Point classIdPoint;
- double confidence;
- // 获取最大置信度的类别和置信度值
- cv::minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);
- if (confidence > 0.5) {
- int centerX = (int)(data[0] * frame.cols);
- int centerY = (int)(data[1] * frame.rows);
- int width = (int)(data[2] * frame.cols);
- int height = (int)(data[3] * frame.rows);
- int left = centerX - width / 2;
- int top = centerY - height / 2;
- classIds.push_back(classIdPoint.x);
- confidences.push_back((float)confidence);
- boxes.push_back(cv::Rect(left, top, width, height));
- }
- }
- }
- // 非极大值抑制去除重叠框
- std::vector<int> indices;
- cv::dnn::NMSBoxes(boxes, confidences, 0.5, 0.4, indices);
- for (size_t i = 0; i < indices.size(); ++i) {
- int idx = indices[i];
- cv::Rect box = boxes[idx];
- cv::rectangle(frame, box, cv::Scalar(0, 255, 0), 2);
- }
- // 显示结果
- cv::imshow("YOLOv5 Detection", frame);
- if (cv::waitKey(1) == 27) {
- break;
- }
- }
- cap.release();
- cv::destroyAllWindows();
- return 0;
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |