Linux C++ OpenVINO 物体检测 Demo

这篇具有很好参考价值的文章主要介绍了Linux C++ OpenVINO 物体检测 Demo。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

目录

代码

CMakeLists.txt

编译 

测试运行

 效果

下载 


目录

Linux C++ OpenVINO 物体检测 Demo,OpenVino,AI,linux,opencv,人工智能,计算机视觉,openvino

代码

std::vector<cv::Scalar> colors = { cv::Scalar(0, 0, 255) , cv::Scalar(0, 255, 0) , cv::Scalar(255, 0, 0) ,cv::Scalar(255, 100, 50) , cv::Scalar(50, 100, 255) , cv::Scalar(255, 50, 100) };
 
const std::vector<std::string> class_names = {
    "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light",
    "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow",
    "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
    "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
    "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
    "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
    "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",
    "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
    "hair drier", "toothbrush" };

#include <iostream>
#include <string>
#include <vector>
#include <openvino/openvino.hpp> 
#include <opencv2/opencv.hpp>    
#include <dirent.h>  
#include <stdio.h> 
#include <time.h>
#include <unistd.h>
 
std::vector<cv::Scalar> colors = { cv::Scalar(0, 0, 255) , cv::Scalar(0, 255, 0) , cv::Scalar(255, 0, 0) ,
								   cv::Scalar(255, 100, 50) , cv::Scalar(50, 100, 255) , cv::Scalar(255, 50, 100) };
 
const std::vector<std::string> class_names = {
	"person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light",
	"fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow",
	"elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
	"skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
	"tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
	"sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
	"potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",
	"microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
	"hair drier", "toothbrush" };
 
using namespace cv;
using namespace dnn;
 
Mat letterbox(const cv::Mat& source)
{
	int col = source.cols;
	int row = source.rows;
	int _max = MAX(col, row);
	Mat result = Mat::zeros(_max, _max, CV_8UC3);
	source.copyTo(result(Rect(0, 0, col, row)));
	return result;
}
 
int main()
{
	clock_t start, end;
	std::cout << "共8步" << std::endl;
 
	char   buffer[100];
	getcwd(buffer, 100);
	std::cout << "当前路径:" << buffer << std::endl;
 
	// -------- Step 1. Initialize OpenVINO Runtime Core --------
	std::cout << "1. Initialize OpenVINO Runtime Core" << std::endl;
	ov::Core core;
 
	// -------- Step 2. Compile the Model --------
	std::cout << "2. Compile the Model" << std::endl;
	String model_path = String(buffer) + "/yolov8s.xml";
	std::cout << "model_path:\t" << model_path << std::endl;
	ov::CompiledModel compiled_model;
	try {
		compiled_model = core.compile_model(model_path, "CPU");
	}
	catch (std::exception& e) {
		std::cout << "Compile the Model 异常:" << e.what() << std::endl;
		return 0;
	}
	
	// -------- Step 3. Create an Inference Request --------
	std::cout << "3. Create an Inference Request" << std::endl;
	ov::InferRequest infer_request = compiled_model.create_infer_request();
 
	// -------- Step 4.Read a picture file and do the preprocess --------
	std::cout << "4.Read a picture file and do the preprocess" << std::endl;
	String img_path = String(buffer) + "/test2.jpg";
	std::cout << "img_path:\t" << img_path << std::endl;
	Mat img = cv::imread(img_path);
 
	// Preprocess the image
	Mat letterbox_img = letterbox(img);
	float scale = letterbox_img.size[0] / 640.0;
	Mat blob = blobFromImage(letterbox_img, 1.0 / 255.0, Size(640, 640), Scalar(), true);
 
	// -------- Step 5. Feed the blob into the input node of the Model -------
	std::cout << "5. Feed the blob into the input node of the Model" << std::endl;
	// Get input port for model with one input
	auto input_port = compiled_model.input();
	// Create tensor from external memory
	ov::Tensor input_tensor(input_port.get_element_type(), input_port.get_shape(), blob.ptr(0));
	// Set input tensor for model with one input
	infer_request.set_input_tensor(input_tensor);
 
	start = clock();
	// -------- Step 6. Start inference --------
	std::cout << "6. Start inference" << std::endl;
	infer_request.infer();
	end = clock();
	std::cout << "inference time = " << double(end - start) << "us" << std::endl;
 
	// -------- Step 7. Get the inference result --------
	std::cout << "7. Get the inference result" << std::endl;
	auto output = infer_request.get_output_tensor(0);
	auto output_shape = output.get_shape();
	std::cout << "The shape of output tensor:\t" << output_shape << std::endl;
	int rows = output_shape[2];        //8400
	int dimensions = output_shape[1];  //84: box[cx, cy, w, h]+80 classes scores
 
	std::cout << "8. Postprocess the result " << std::endl;
	// -------- Step 8. Postprocess the result --------
	float* data = output.data<float>();
	Mat output_buffer(output_shape[1], output_shape[2], CV_32F, data);
	transpose(output_buffer, output_buffer); //[8400,84]
	float score_threshold = 0.25;
	float nms_threshold = 0.5;
	std::vector<int> class_ids;
	std::vector<float> class_scores;
	std::vector<Rect> boxes;
 
	// Figure out the bbox, class_id and class_score
	for (int i = 0; i < output_buffer.rows; i++) {
		Mat classes_scores = output_buffer.row(i).colRange(4, 84);
		Point class_id;
		double maxClassScore;
		minMaxLoc(classes_scores, 0, &maxClassScore, 0, &class_id);
 
		if (maxClassScore > score_threshold) {
			class_scores.push_back(maxClassScore);
			class_ids.push_back(class_id.x);
			float cx = output_buffer.at<float>(i, 0);
			float cy = output_buffer.at<float>(i, 1);
			float w = output_buffer.at<float>(i, 2);
			float h = output_buffer.at<float>(i, 3);
 
			int left = int((cx - 0.5 * w) * scale);
			int top = int((cy - 0.5 * h) * scale);
			int width = int(w * scale);
			int height = int(h * scale);
 
			boxes.push_back(Rect(left, top, width, height));
		}
	}
	//NMS
	std::vector<int> indices;
	NMSBoxes(boxes, class_scores, score_threshold, nms_threshold, indices);
 
	// -------- Visualize the detection results -----------
	for (size_t i = 0; i < indices.size(); i++) {
		int index = indices[i];
		int class_id = class_ids[index];
		rectangle(img, boxes[index], colors[class_id % 6], 2, 8);
		std::string label = class_names[class_id] + ":" + std::to_string(class_scores[index]).substr(0, 4);
		Size textSize = cv::getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, 0);
		Rect textBox(boxes[index].tl().x, boxes[index].tl().y - 15, textSize.width, textSize.height + 5);
		cv::rectangle(img, textBox, colors[class_id % 6], FILLED);
		putText(img, label, Point(boxes[index].tl().x, boxes[index].tl().y - 5), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255));
	}
 
	cv::imwrite("detection.png", img);
	std::cout << "detect success" << std::endl;

    cv::imshow("window",img);
    cv::waitKey(0);
 
	return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(openvino_test )

find_package(OpenCV REQUIRED )

find_package(OpenVINO REQUIRED )

file(COPY test.jpg DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY test2.jpg DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY yolov8s.xml DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY yolov8s.bin DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

add_executable(openvino_test main.cpp )

target_link_libraries(openvino_test ${OpenCV_LIBS} openvino)

cmake_minimum_required(VERSION 3.0)

project(openvino_test )

find_package(OpenCV REQUIRED )

find_package(OpenVINO REQUIRED )

file(COPY test.jpg DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY test2.jpg DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY yolov8s.xml DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY yolov8s.bin DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

add_executable(openvino_test main.cpp )

target_link_libraries(openvino_test ${OpenCV_LIBS} openvino)

编译 

ll

Linux C++ OpenVINO 物体检测 Demo,OpenVino,AI,linux,opencv,人工智能,计算机视觉,openvino

mkdir build
cd build
cmake ..

Linux C++ OpenVINO 物体检测 Demo,OpenVino,AI,linux,opencv,人工智能,计算机视觉,openvino

make

 Linux C++ OpenVINO 物体检测 Demo,OpenVino,AI,linux,opencv,人工智能,计算机视觉,openvino

ll

 Linux C++ OpenVINO 物体检测 Demo,OpenVino,AI,linux,opencv,人工智能,计算机视觉,openvino

测试运行

./openvino_test

 效果

Linux C++ OpenVINO 物体检测 Demo,OpenVino,AI,linux,opencv,人工智能,计算机视觉,openvino

下载 

Demo下载文章来源地址https://www.toymoban.com/news/detail-708459.html

到了这里,关于Linux C++ OpenVINO 物体检测 Demo的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [C#]winform部署openvino官方提供的人脸检测模型

    【官方框架地址】 https://github.com/sdcb/OpenVINO.NET 【框架介绍】 OpenVINO(Open Visual Inference Neural Network Optimization)是一个由Intel推出的,针对计算机视觉和机器学习任务的开源工具套件。通过优化神经网络,加速深度学习推理,OpenVINO可以帮助开发者更高效地在Intel硬件上部署机器

    2024年01月21日
    浏览(47)
  • openvino部署yolov8 检测、分割、分类及姿态模型实例详解

    本文重点参考:https://github.com/openvino-book/yolov8_openvino_cpp/tree/main 文中代码为简便版本,如果要使用请自行修改并封装 openvnio部署模型比较方便和简单,而且不易出错,就是速度慢了点! 下边分别给出 部署源码

    2024年02月16日
    浏览(49)
  • 快速下载OpenVINO Notebooks中的AI大模型

    作者: 英特尔边缘计算创新大使  杨雪锋 OpenVINO Notebooks是Jupyter Notebook形式的OpenVINO范例程序大集合,方便开发者快速学习并掌握OpenVINO推理程序,并通过CopyPaste方式将范例中的关键程序应用到自己的AI软件中去。 GitHub: https://github.com/openvinotoolkit/openvino_notebooks OpenVINO Notebooks提供

    2024年02月03日
    浏览(32)
  • 在Windows中基于Visual Studio配置OpenVINO C++开发环境

    作者:王一凡  英特尔物联网行业创新大使 目录 1.1 下载并安装Visual Studio Community版 1.2 下载并解压OpenVINO Runtime 1.3 下载并解压OpenCV 1 .4 在Visual Studio中配置项目属性 1.5 运行OpenVINO C++范例程序,测试开发环境 1.6 总结 本文主要介绍在Windows中基于Visual Studio配置OpenVINO C++开发环境

    2024年02月06日
    浏览(72)
  • AI作画升级,OpenVINO™ 和英特尔独立显卡助你快速生成视频

    在《 AI作画,OpenVINO™助你在英特尔GPU上随心创作》中,我们介绍了OpenVINO Notebook运行环境搭建,并利用OpenVINO™优化和加速Stable Diffusion模型的推理,在英特尔®独立显卡上能够根据我们输入的指令(prompt),快速生成我们喜爱的AI画作。 今天,我们对这一应用场景再次升级,

    2024年02月03日
    浏览(91)
  • 以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC

    近期,ChatGPT的爆火,引起了大众对于AIGC(AI Generate Content AI生成内容)的广泛关注。作为技术领域的又一热点话题——AIGC距离大众使用似乎还存在一定距离? 等风来不如追风去。随着第113个“三·八”国际妇女节于春日中悄然来临,OpenVINO™ 特推出“以AI作画,祝她节日快乐

    2024年02月08日
    浏览(40)
  • 当英特尔 OpenVINO 遇上微软 Azure,AI在边云协同的新方案

    作者 | 宋慧 出品 | CSDN云计算 数字化浪潮下,越来越多的终端 IoT 设备接入网络,边缘的数据量与分析需求也随之增加。根据 Eclipse 对边缘负载的分析显示,人工智能是边缘计算中占比最高的负载之一,高于控制逻辑、数据分析等负载所占比例。 凭借企业级至强系列处理器,

    2024年02月07日
    浏览(56)
  • 【模型部署 01】C++实现GoogLeNet在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署

    深度学习领域常用的基于CPU/GPU的推理方式有OpenCV DNN、ONNXRuntime、TensorRT以及OpenVINO。这几种方式的推理过程可以统一用下图来概述。整体可分为模型初始化部分和推理部分,后者包括步骤2-5。 以GoogLeNet模型为例,测得几种推理方式在推理部分的耗时如下: 结论: GPU加速首选

    2024年02月06日
    浏览(57)
  • 在英特尔AI开发板上用OpenVINO NNCF优化YOLOv7,2.15倍性能提升

    作者:康瑶明 英特尔边缘计算创新大使 YOLO代表“You Only Look Once”,它是一种流行的实时物体检测算法系列。最初的YOLO物体检测器于2016年首次发布。从那时起,YOLO的不同版本和变体被提出,每个版本和变体都显着提高了性能和效率。YOLO算法作为one-stage目标检测算法最典型的

    2024年01月24日
    浏览(72)
  • 【模型部署 01】C++实现分类模型(以GoogLeNet为例)在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署

    深度学习领域常用的基于CPU/GPU的推理方式有OpenCV DNN、ONNXRuntime、TensorRT以及OpenVINO。这几种方式的推理过程可以统一用下图来概述。整体可分为模型初始化部分和推理部分,后者包括步骤2-5。 以GoogLeNet模型为例,测得几种推理方式在推理部分的耗时如下: 结论: GPU加速首选

    2024年02月06日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包