OpenCV与AI深度学习 | 使用YOLOv8做目标检测、实例分割和图像分类(包含实例操作代码)

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。

原文链接:使用YOLOv8做目标检测、实例分割和图像分类

0 导  读

        本文主要介绍YOLOv8及使用它做目标检测、实例分割和图像分类演示,仅供参考。

1 背景介绍

    YOLOv8是来自Ultralytics的最新的基于YOLO的对象检测模型系列,提供最先进的性能。

    利用以前的 YOLO 版本,YOLOv8模型更快、更准确,同时为训练模型提供统一框架,以执行:

  • 物体检测
  • 实例分割
  • 图像分类

    下面是使用YOLOv8做目标检测和实例分割的演示视频:

YOLOv8做目标检测和实例分割的演示视频

2 YOLOv8的新特性与可用模型

        Ultralytics为YOLO模型发布了一个全新的存储库。它被构建为 用于训练对象检测、实例分割和图像分类模型的统一框架。

        以下是有关新版本的一些主要功能:

  • 用户友好的 API(命令行 + Python)。
  • 更快更准确。
  • 支持:
    • 物体检测
    • 实例分割
    • 图像分类
  • 可扩展到所有以前的版本。
  • 新骨干网络。
  • 新的无锚头。
  • 新的损失函数。

        YOLOv8 还高效灵活地支持多种导出格式,并且该模型可以在 CPU 和 GPU 上运行。

        YOLOv8 模型的每个类别中有五个模型用于检测、分割和分类。YOLOv8 Nano 是最快和最小的,而 YOLOv8 Extra Large (YOLOv8x) 是其中最准确但最慢的。

        YOLOv8 捆绑了以下预训练模型:

  • 在图像分辨率为 640 的 COCO 检测数据集上训练的目标检测检查点。
  • 在图像分辨率为 640 的 COCO 分割数据集上训练的实例分割检查点。
  • 在图像分辨率为 224 的 ImageNet 数据集上预训练的图像分类模型。

如下是使用YOLOv8x做目标检测和实例分割模型的输出:


3 如何使用YOLOv8

    要充分发挥YOLOv8的潜力,需要从存储库和ultralytics包中安装要求。要安装要求,我们首先需要克隆存储库。

git clone https://github.com/ultralytics/ultralytics.git
pip install -r requirements.txt

在最新版本中,Ultralytics YOLOv8提供了完整的命令行界面 (CLI) API 和 Python SDK,用于执行训练、验证和推理。要使用yoloCLI,我们需要安装ultralytics包。

pip install ultralytics

【1】如何使用命令行界面 (CLI) 使用 YOLOv8?

        安装必要的包后,我们可以使用命令访问 YOLOv8 CLI yolo。以下是使用yoloCLI 运行对象检测推理的示例。

yolo task=detect \
mode=predict \
model=yolov8n.pt \
source="image.jpg"

        该task标志可以接受三个参数:detect、classify和segment。同样,模式可以是train、val或之一predict。我们也可以像export导出经过训练的模型时一样传递模式。

【2】如何通过Python API使用YOLOv8?

我们还可以创建一个简单的Python文件,导入YOLO模块并执行我们选择的任务。

from ultralytics import YOLO

model = YOLO("yolov8n.pt")  # load a pretrained YOLOv8n model

model.train(data="coco128.yaml")  # train the model
model.val()  # evaluate model performance on the validation set
model.predict(source="https://ultralytics.com/images/bus.jpg")  # predict on an image
model.export(format="onnx")  # export the model to ONNX format

例如,上述代码首先会在COCO128数据集上训练YOLOv8 Nano模型,在验证集上进行评估,并对样本图像进行预测。

让我们使用yoloCLI 并使用对象检测、实例分割和图像分类模型进行推理。

【3】目标检测的推理结果

以下命令使用YOLOv8 Nano模型对视频运行检测。

yolo task=detect mode=predict model=yolov8n.pt source='input/video_3.mp4' show=True

推理在笔记本电脑GTX1060 GPU上以接近105 FPS的速度运行。我们得到以下输出:

图片

YOLOv8 Nano 模型在几帧中将猫混淆为狗。让我们使用 YOLOv8 Extra Large 模型对同一视频运行检测并检查输出:

yolo task=detect mode=predict model=yolov8x.pt source='input/video_3.mp4' show=True

Extra Large模型在GTX1060 GPU上的平均运行速度为 17 FPS。

图片

【4】实例分割的推理结果

使用YOLOv8 实例分割模型运行推理同样简单。我们只需要更改上面命令中的task和model名称。

yolo task=segment mode=predict model=yolov8x-seg.pt source='input/video_3.mp4' show=True

因为实例分割与对象检测相结合,所以这次的平均 FPS 约为 13。

图片

分割图在输出中看起来非常干净。即使猫在最后几帧中躲在方块下,模型也能够检测并分割它。

【5】图像分类推理结果

最后,由于YOLOv8已经提供了预训练的分类模型,让我们使用该yolov8x-cls模型对同一视频进行分类推理。这是存储库提供的最大分类模型。

yolo task=classify mode=predict model=yolov8x-cls.pt source='input/video_3.mp4' show=True

图片

默认情况下,视频使用模型预测的前5个类进行注释。在没有任何后处理的情况下,注释直接匹配ImageNet类名。

THE END!

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

好的,以下是一个简单的使用OpenCV和ONNXRuntime在C++平台部署YOLOv7实时目标检测代码示例: ```c++ #include <iostream> #include <chrono> #include <opencv2/opencv.hpp> #include <onnxruntime_cxx_api.h> using namespace std; using namespace cv; using namespace std::chrono; using namespace Ort; int main() { // 加载模型 Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test"); Ort::SessionOptions session_options; OrtSession* session; Ort::AllocatorWithDefaultOptions allocator; const char* model_path = "yolov7.onnx"; session = new Ort::Session(env, model_path, session_options); // 加载图像 Mat frame = imread("test.jpg"); if (frame.empty()) { cout << "读取图像失败!" << endl; return -1; } // 预处理图像 Mat input_blob = blobFromImage(frame, 1 / 255.0, Size(416, 416), Scalar(0, 0, 0), true, false); Tensor input_tensor = Tensor( DataType::FLOAT, {1, 3, input_blob.rows, input_blob.cols}, input_blob.data ); // 运行模型 vector<const char*> input_names = {"input_1"}; vector<const char*> output_names = {"Identity_1", "Identity_2", "Identity_3"}; vector<Ort::Value> input_tensors = {input_tensor}; vector<Ort::Value> output_tensors = session->Run(Ort::RunOptions{}, input_names.data(), input_tensors.data(), input_names.size(), output_names.data(), output_names.size()); // 后处理输出结果 vector<Mat> detections; for (int i = 0; i < output_tensors.size(); i++) { float* output_data = output_tensors[i].GetTensorMutableData<float>(); vector<int64_t> output_shape = output_tensors[i].GetTensorTypeAndShapeInfo().GetShape(); Mat detection(output_shape[1], output_shape[0], CV_32F, output_data); detections.push_back(detection); } float confidence_threshold = 0.5; vector<int> class_ids; vector<float> confidences; vector<Rect> boxes; for (int i = 0; i < detections.size(); i++) { for (int j = 0; j < detections[i].rows; j++) { float* data = detections[i].ptr<float>(j); float confidence = data[4]; if (confidence > confidence_threshold) { int class_id = j; float left = data[0] * frame.cols; float top = data[1] * frame.rows; float right = data[2] * frame.cols; float bottom = data[3] * frame.rows; int width = right - left + 1; int height = bottom - top + 1; class_ids.push_back(class_id); confidences.push_back(confidence); boxes.push_back(Rect(left, top, width, height)); } } } for (int i = 0; i < boxes.size(); i++) { Scalar color(0, 255, 0); rectangle(frame, boxes[i], color, 2); string label = format("%.2f", confidences[i]); int baseline; Size label_size = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseline); rectangle(frame, Point(boxes[i].x, boxes[i].y - label_size.height - baseline), Point(boxes[i].x + label_size.width, boxes[i].y), color, FILLED); putText(frame, label, Point(boxes[i].x, boxes[i].y - baseline), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0)); } // 显示结果 namedWindow("YOLOv7", WINDOW_NORMAL); resizeWindow("YOLOv7", 800, 600); imshow("YOLOv7", frame); waitKey(0); // 释放资源 delete session; return 0; } ``` 这段代码首先使用ONNXRuntime加载YOLOv7模型,然后利用OpenCV读取图像并进行预处理,接着调用ONNXRuntime运行模型,最后根据模型输出结果进行后处理并显示检测结果。需要注意的是,这段代码只是一个简单的示例,实际部署时需要根据具体的场景进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值