Ubuntu利用C代码调用YOLO检测详解

2023年 8月 9日 43.6k 0

  • 本文目录导读:
  • 1、前言
  • 2、准备工作
  • 3、代码实现
  • 4、运行程序
  • 5、小结
  • 6、为您分享

前言

在机器学习领域,YOLO(You Only Look Once)是一种非常流行的目标检测算法。它的优点在于快速、准确、易于实现等。本文将介绍如何在Ubuntu系统上使用C代码调用YOLO进行目标检测。

准备工作

在开始之前,需要先安装一些必要的软件和库:

1. 安装OpenCV库

```

sudo apt-get install libopencv-dev

2. 安装CUDA和cuDNN

如果你的机器上有NVIDIA显卡,可以通过以下命令安装CUDA和cuDNN:

sudo apt-get install nvidia-cuda-toolkit

3. 下载YOLOv3模型

我们需要下载YOLOv3的预训练模型,可以从官方网站上下载:

wget

代码实现

我们将使用C语言编写一个程序,调用OpenCV库和YOLO模型进行目标检测。下面是代码实现的主要步骤:

1. 加载模型

我们首先需要加载预训练的YOLOv3模型。可以使用OpenCV提供的dnn模块来加载模型:

```c

cv::dnn::Net net = cv::dnn::readNetFromDarknet("yolov3.cfg", "yolov3.weights");

2. 加载图片

我们需要加载待检测的图片,并将其转换成一个4维张量,以便于输入到模型中:

cv::Mat image = cv::imread("test.jpg");

cv::Mat blob = cv::dnn::blobFromImage(image, 1/255.0, cv::Size(416, 416), cv::Scalar(0,0,0), true, false);

3. 输入模型

将张量输入到模型中,并获取模型的输出结果:

net.setInput(blob);

std::vector outs;

net.forward(outs, net.getUnconnectedOutLayersNames());

4. 解析输出

我们需要解析模型的输出结果,得到检测到的目标信息:

std::vector classIds;

std::vector confidences;

std::vector boxes;

for (int i = 0; i

{

float* data = (float*)outs[i].data;

for (int j = 0; j

{

cv::Mat scores = outs[i].row(j).colRange(5, outs[i].cols);

cv::Point classIdPoint;

double confidence;

cv::minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);

if (confidence > 0.5)

{

int centerX = (int)(data[0] * image.cols);

int centerY = (int)(data[1] * image.rows);

int width = (int)(data[2] * image.cols);

int height = (int)(data[3] * image.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));

}

}

}

5. 绘制结果

最后,我们可以将检测到的目标信息绘制到原图上:

std::vector classNames = {"person", "car", "truck", "bus", "motorbike", "bicycle"};

for (size_t i = 0; i

cv::Rect box = boxes[i];

cv::rectangle(image, box, cv::Scalar(0, 0, 255), 2);

std::ostringstream ss;

ss

cv::String conf(ss.str());

cv::String label = classNames[classIds[i]] + ": " + conf;

int baseLine;

cv::Size labelSize = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);

cv::rectangle(image, cv::Point(box.x, box.y - labelSize.height),

cv::Point(box.x + labelSize.width, box.y + baseLine),

cv::Scalar(255, 255, 255), cv::FILLED);

cv::putText(image, label, cv::Point(box.x, box.y),

cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0,0,0));

cv::imshow("result", image);

cv::waitKey(0);

运行程序

我们将上述代码保存为一个C++文件,编译运行即可:

g++ -std=c++11 detect.cpp `pkg-config opencv --cflags --libs` -o detect

./detect

小结

本文介绍了如何在Ubuntu系统上使用C代码调用YOLO进行目标检测。需要注意的是,在使用YOLO进行目标检测时,需要有一定的GPU计算能力,否则速度会非常慢。

为您分享

在Ubuntu系统上,可以使用Ctrl+Alt+T快捷键打开终端。

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论