OpenCV之YOLOv2-tiny目标检测

K210嵌入式AI实战:YOLOv2-tiny物体检测全流程 嵌入式AI推理正在从云端向MCU端下沉,其核心原理是通过专用神经网络处理器(KPU)实现INT8量化模型的硬件加速。这种技术方案的价值在于以极低功耗和成本完成实时物体检测,典型应用包括智能门禁、工业质检和农业计数等边缘场景。K210芯片内置KPU,支持卷积网络加速,结合YOLOv2-tiny轻量模型和NNCase量化转换工具,可在1W功耗内实现端侧实时推理。本文记录了从数据标注、模型训练、量化校准到板端部署的完整实操流程,并分享了锚框聚类、帧率优化和内存管理等避坑经验。 阅读详情
  • 💂 个人主页:风间琉璃
  • 🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

目录

前言

一、YOLOv2-tiny介绍

二、预处理

三、模型加载与推理

四、解析输出


前言

YOLO(You Only Look Once)是一种基于深度神经网络的目标对象识别和定位算法,其特点是运行速度快、实时性高。这里我们将使用Tiny YOLOv2版本的YOLO算法。

YOLO算法创造性地将R-CNN目标检测中的选择候选区和识别候选区对象两个阶段合二为一,这也是YOLO名字的来由(只需看一眼就知道图片的哪些位置有什么对象)。

一、YOLOv2-tiny介绍

YOLOv2-tiny,轻量版的YOLOv2,即使用Tiny YOLOv2来实现目标检测。Tiny YOLOv2包含9个卷积层和6个最大池化层,如图所示。

Tiny YOLOv2目标检测算法具有预处理、网络推导和后处理三个步骤:

(1)预处理:对输入的任意分辨率的RGB图像,将各通道像素点的像素值归一化到[0, 1]区间,并按原图的长宽比例,将图像的尺寸缩放至416×416(以0.5填充);

(2)网络推导:将归一化后的416×416×3图像输入到Tiny YOLOv2网络进行前向推导,得到
13×13×5×25的输出张量;

(3)后处理:根据输出张量的格式,得到每个边框的中心点坐标以及长和宽,并根据各边框的覆盖度和置信度等信息,对所有13×13×5个边框进行NMS处理,得到最可能包含目标对象的候选框。最后根据1)中的缩放比率,将得到的候选边框放大并在原图中显示,即可得到目标对象的位置和类别信息。

yolov2-tiny网络模型每个Cell需要检测5个BOX,对每个BOX来说,包含如下数据:

  • 4个位置信息x、y、w、h

  • 1个置信分数

  • 基于VOC数据集的20个目标类别

  所以对每个BOX来说,每个BOX有5+20=25个参数,5个BOX共有 5x25=125个参数。所以,tiny-YOLO网络模型最后一层卷积层深度是125。 

yolov2参考:目标检测之YOLOv1-v3_风间琉璃•的博客-CSDN博客

资源下载:

yolov2-tiny-voc.weights:https://pjreddie.com/media/files/yolov2-tiny-voc.weights

yolov2-tiny-voc.cfg:https://github.com/pjreddie/darknet/blob/master/cfg/yolov2-voc.cfg

voc.names:https://github.com/pjreddie/darknet/blob/master/data/voc.names

更多版本下载:YOLO: Real-Time Object Detection

二、预处理

数据集采用的voc数据集,需要将voc.names包含训练模型的所有类名称加载到内存中。

String classespath = "F:/data/CQU/VS/yolov2-tiny/voc.names";

//得到网络对应的标签
vector<string> getclasses(string classespath)
{
	ifstream ifs(classespath);
	//分类名
	vector<string> classes;
	if (ifs.is_open())
	{
		string line;
		while (getline(ifs, line))
		{
			classes.push_back(line);
		}
	}
	return classes;
}

神经网络的输入图像需要采用称为blob的特定格式。从输入图像或视频流中读取帧后,将通过blobFromImage函数将其转换为神经网络的输入blob。

在此过程中,它使用比例因子1/255将图像像素值缩放到0到1的目标范围。它还将图像的大小调整为给定大小(416,416)而不进行裁剪。

//图像预处理
Mat blob = blobFromImage(frame, 1 / 255.0, Size(416, 416), Scalar(), true, false);

三、模型加载与推理

加载网络直接使用readNetFromDarknet。

String config = "F:/data/CQU/VS/yolov2-tiny/yolov2-tiny-voc.cfg";
String weights = "F:/data/CQU/VS/yolov2-tiny/yolov2-tiny-voc.weights";

	//加载网络模型
	Net net = readNetFromDarknet(config, weights);
	if (net.empty())
	{
		printf("Could not load net...\n");
		return;
	}


#if 1
	//cpu推理
	net.setPreferableBackend(DNN_BACKEND_OPENCV);
	net.setPreferableTarget(DNN_TARGET_CPU);

#elif 0
	//使用cuda加速
	net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
	net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA_FP16);

#endif

这里可以根据个人情况是否使用CUDA加速。

预处理和网络模型都加载完成后可以进行图像的预测。

//设置输入
net.setInput(blob,"data");

//推理预测
Mat detectionMat = net.forward("detection_out");

预测的结果保存在detectionMat的Mat类型矩阵中。接下来就需要对这个预测结果进行后处理。  

四、解析输出

yolov2的输出包含:4个位置信息x、y、w、h,1个置信分数以及基于VOC数据集的20个目标类别。注意这里的x,y是边框中心的坐标,所以要将目标边框绘制出来,需要根据这个四个参数推算出左顶点的坐标和高,宽。

for (int i = 0; i < detectionMat.rows;i++)
{
	Mat scores = detectionMat.row(i).colRange(5, detectionMat.cols);
	Point classIdPoint;
	double confidence;

	minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);
	int classid = classIdPoint.x;
	if (confidence > 0)
	{
		printf("confide:%.2f\n", confidence);
	}
	
	if (confidence > confidenceThreshold)
	{
		printf("confide2:%.2f\n", confidence);
	   //x,y,w,h:中心坐标,边框w,h
		float x = detectionMat.at<float>(i, 0) * image.cols;
		float y = detectionMat.at<float>(i, 1) * image.rows;
		float width = detectionMat.at<float>(i, 2) * image.cols;
		float height = detectionMat.at<float>(i, 3) * image.rows;

		//左上角坐标
		int xLeftBottom = static_cast<int>((x - width / 2));
		int yLeftBottom = static_cast<int>((y - height / 2));

		//获取矩形框x,y,w,h
		Rect object(xLeftBottom, yLeftBottom, static_cast<int>(width), static_cast<int>(height));
		//绘制矩形框
		rectangle(image, object, Scalar(0, 255, 0), 2);
		if (classid < classNames.size())
		{
			//获取类别名称及其置信度
			string conf = format("%.2f", confidence);
			String label = String(classNames[classid]) + ": " + conf;
			int baseLine = 0;
			//在图像上添加标签
			Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
			rectangle(image, Rect(Point(xLeftBottom, yLeftBottom), Size(labelSize.width, labelSize.height + baseLine)), Scalar(255, 255, 255), FILLED);
			putText(image, label, Point(xLeftBottom, yLeftBottom + labelSize.height), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
		}
	}
}

运行结果:

图片:

视频:

OpenCV yolov2-tiny

源码:资源下载:https://download.csdn.net/download/qq_53144843/88354502

// yolov2-tiny.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstdlib>

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>


using namespace std;
using namespace cv;
using namespace cv::dnn;


//置信度阈值
float confidenceThreshold = 0.25;
 

//得到网络对应的标签
vector<string> getclasses(string classespath)
{
	ifstream ifs(classespath);
	//分类名
	vector<string> classes;
	if (ifs.is_open())
	{
		string line;
		while (getline(ifs, line))
		{
			classes.push_back(line);
		}
	}
	return classes;
}


void detection(string config, string weights, string classespath, string video_path)
{
	//加载网络模型
	Net net = readNetFromDarknet(config, weights);
	if (net.empty())
	{
		printf("Could not load net...\n");
		return;
	}


#if 0
	//cpu推理
	net.setPreferableBackend(DNN_BACKEND_OPENCV);
	net.setPreferableTarget(DNN_TARGET_CPU);

#elif 1
	//使用cuda加速
	net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
	net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA_FP16);

#endif


	//获得分类名
	vector<string> classNames = getclasses(classespath);

	//打开视频流
	VideoCapture capture;
	capture.open(video_path); //传入0:读取摄像头
	if (!capture.isOpened())
	{
		printf("could not open the video...\n");
		return;
	}

	//读取视频流
	Mat frame;
	while (capture.read(frame))
	{
		if (frame.channels() == 4)
		{
			cvtColor(frame, frame, COLOR_BGRA2BGR);
		}
			
		//图像预处理
		Mat blob = blobFromImage(frame, 1 / 255.0, Size(416, 416), Scalar(), true, false);
		//设置输入
		net.setInput(blob,"data");

		//获得当前系统的计时间周期数,求FPS
		double t = (double)getTickCount();

		//推理预测
		Mat detectionMat = net.forward("detection_out");


		for (int i = 0; i < detectionMat.rows; i++)
		{
			//获取每一行从第5列起的分类类别的概率
			const int probability_index = 5;
			//概率的总列数
			const int probability_size = detectionMat.cols - probability_index;
			//用于查找最大概率的类别
			float* prob_array_ptr = &detectionMat.at<float>(i, probability_index);
			//查找概率数组中的最大值,并返回最大值的索引
			size_t objectClass = max_element(prob_array_ptr, prob_array_ptr + probability_size) - prob_array_ptr;
			//获取置信度值
			float confidence = detectionMat.at<float>(i, (int)objectClass + probability_index);
			
			if (confidence > confidenceThreshold)
			{
				printf("confide:%.2f\n", confidence);
				float x = detectionMat.at<float>(i, 0);
				float y = detectionMat.at<float>(i, 1);
				float width = detectionMat.at<float>(i, 2);
				float height = detectionMat.at<float>(i, 3);
				int xLeftBottom = static_cast<int>((x - width / 2) * frame.cols);
				int yLeftBottom = static_cast<int>((y - height / 2) * frame.rows);
				int xRightTop = static_cast<int>((x + width / 2) * frame.cols);
				int yRightTop = static_cast<int>((y + height / 2) * frame.rows);
				Rect object(xLeftBottom, yLeftBottom,xRightTop - xLeftBottom,yRightTop - yLeftBottom);
				rectangle(frame, object, Scalar(0, 255, 0),2);
				if (objectClass < classNames.size())
				{
					//获取类别名称及其置信度
					string conf = format("%.2f", confidence);
					String label = String(classNames[objectClass]) + ": " + conf;
					int baseLine = 0;
					Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
					rectangle(frame, Rect(Point(xLeftBottom, yLeftBottom),Size(labelSize.width, labelSize.height + baseLine)),Scalar(255, 255, 255), FILLED);
					putText(frame, label, Point(xLeftBottom, yLeftBottom + labelSize.height), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
				}
			}
		}
		//FPS计算
		t = ((double)getTickCount() - t) / getTickFrequency();//求输入帧后经过的周期数/每秒系统计的周期数=一帧用时多少秒
		double fps = 1.0 / t;//求倒数得到每秒经过多少帧,即帧率
		string text = format("FPS:%.2f", fps);
		cv::putText(frame, text, Point(10, 50), FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0), 2, 8, 0);//FPS计算

		imshow("YOLOv2", frame);
		int c = cv::waitKey(1);
		if (c == 27)
		{
			break;
		}
	}
}


void image_detection(string config, string weights, string classespath, string image_path)
{
	//读取图片
	Mat image = imread(image_path);
	if (image.channels() == 4)
	{
		cvtColor(image, image, COLOR_BGRA2BGR);
	}
	//预处理
	Mat blob = blobFromImage(image, 1 / 255.0, Size(416, 416), Scalar());
	//加载网络
	Net net = readNetFromDarknet(config, weights);
	if (net.empty())
	{
		printf("Could not load net...\n");
		return;
	}

#if 0
	//cpu推理
	net.setPreferableBackend(DNN_BACKEND_OPENCV);
	net.setPreferableTarget(DNN_TARGET_CPU);

#elif 1
	//使用cuda加速
	net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
	net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA_FP16);

#endif

	//获得分类名
	vector<string> classNames = getclasses(classespath);

	net.setInput(blob, "data");
	Mat detectionMat = net.forward("detection_out");

	//推理时间
	vector<double> layersTimings;
	double freq = getTickFrequency() / 1000;
	double time = net.getPerfProfile(layersTimings) / freq;
	ostringstream ss;
	ss << "FPS: " << 1000 / time << " ; time: " << time << " ms";
	putText(image, ss.str(), Point(10, 30), 0, 0.5, Scalar(0, 0, 255));


	for (int i = 0; i < detectionMat.rows;i++)
	{
		Mat scores = detectionMat.row(i).colRange(5, detectionMat.cols);
		Point classIdPoint;
		double confidence;

		minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);
		int classid = classIdPoint.x;
		if (confidence > 0)
		{
			printf("confide:%.2f\n", confidence);
		}
		
		if (confidence > confidenceThreshold)
		{
			printf("confide2:%.2f\n", confidence);
		   //x,y,w,h:中心坐标,边框w,h
			float x = detectionMat.at<float>(i, 0) * image.cols;
			float y = detectionMat.at<float>(i, 1) * image.rows;
			float width = detectionMat.at<float>(i, 2) * image.cols;
			float height = detectionMat.at<float>(i, 3) * image.rows;

			//左上角坐标
			int xLeftBottom = static_cast<int>((x - width / 2));
			int yLeftBottom = static_cast<int>((y - height / 2));

			//获取矩形框x,y,w,h
			Rect object(xLeftBottom, yLeftBottom, static_cast<int>(width), static_cast<int>(height));
			//绘制矩形框
			rectangle(image, object, Scalar(0, 255, 0), 2);
			if (classid < classNames.size())
			{
				//获取类别名称及其置信度
				string conf = format("%.2f", confidence);
				String label = String(classNames[classid]) + ": " + conf;
				int baseLine = 0;
				//在图像上添加标签
				Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
				rectangle(image, Rect(Point(xLeftBottom, yLeftBottom), Size(labelSize.width, labelSize.height + baseLine)), Scalar(255, 255, 255), FILLED);
				putText(image, label, Point(xLeftBottom, yLeftBottom + labelSize.height), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
			}
		}
	}

	imshow("YOLOv2", image);
	cv::waitKey(0);
}

int main()
{
	String config = "F:/data/CQU/VS/yolov2-tiny/yolov2-tiny-voc.cfg";
	String weights = "F:/data/CQU/VS/yolov2-tiny/yolov2-tiny-voc.weights";
	String classespath = "F:/data/CQU/VS/yolov2-tiny/voc.names";
	String video_path = "F:/data/CQU/VS/yolov2-tiny/1.mp4";
	String image_path = "F:/data/CQU/VS/yolov2-tiny/dog_cat.jpg";
	//image_detection(config, weights, classespath, image_path);
	detection(config, weights, classespath, video_path);


}

结束语
感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,博主要一下你们的三连呀(点赞、评论、收藏),不要钱的还是可以搞一搞的嘛~

不知道评论啥的,即使扣个666也是对博主的鼓舞吖 💞 感谢 💐

yolov2 - tiny模型训练识别 兴趣尝试,训练一下自己的数据集做图像识别。 darknet网络下载 下载地址:https://pjreddie.com/darknet/yolov2/ 直接按照步骤,里面有不同yolo版本的基本配置文件,区别是使用什么样的预训练模型就用什么样的weight文件,下载好后直接放在darknet目录下。 尝试运行: cd darknet ./darknet detector test cfg/voc.data cfg/yolov2-tiny-voc.cfg yolov2-tiny-voc.weights da 阅读详情

相关推荐

yolov3-tiny原理解析及代码分析

从去年十一月份开始学习yolo神经网络用于目标识别的硬件实现,到现在已经六个月了。一个硬件工程师,C/C++基础都差劲的很,对照着darknet作者的源码和网上东拼西凑的原理讲解,一点一点地摸索。刚开始进度很慢,每天都感觉学习不了几行代码,到后来慢慢的入了门,每周都有不菲的收获和重大的进展。总结一下自己这大半年的学习,记录一下心路历程,也为躬耕于此的有缘人提供哪怕一点点的帮助吧。

点赞的都能无bug通过! 5398

kitti数据集_在KITTI数据集上训练YOLOv2-tiny(只识别car)

下面所有的所需工具都在我的github上下载https://github.com/zssjh/KITTI-yolov2-tiny​github.com一:训练集准备训练集下载地址:http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=2d​www.cvlibs.net需要下载12G的训练集图片和5m的标签文件在这里我只...

weixin_39640090的博客 498

012 基于YOLOv4-Tiny的目标检测系统

常用包括车辆、行人、飞机、轮船、猫、狗、马、鸟、羊、自行车、瓶、椅子、火车、沙发、餐桌、电视机、盆栽植物等几十个类别进行检测和识别。)加载摄像头进行检测:可以选择摄像头进行目标检测,系统将检测和识别后的结果标注在图像流上并在界面上自动展示。)加载图像进行检测:可以选择图像进行目标检测,系统将检测和识别后的结果标注在图像上并在界面上自动展示。)加载视频进行检测:可以选择视频进行目标检测,系统将检测和识别后的结果标注在视频上并在界面上自动展示。界面的背景、按钮等,界面的操作和相关的代码都有详细的注释。

2201_75291175的博客 836

深度学习(三)——tiny YOLO算法实现实时目标检测(tensorflow实现)

一、背景介绍 YOLO算法全称You Only Look Once,是Joseph Redmon等人于15年3月发表的一篇文章。本实验目标为实现YOLO算法,借鉴了一部分材料,最终实现了轻量级的简化版YOLO——tiny YOLO,其优势在于实现简单,目标检测迅速。 [1]文章链接:https://arxiv.org/abs/1506.02640 [2]YOLO官网链接:https://pj...

QQ704630835的博客 3万+

YOLOv3+OpenCV dnn实战:RTSP流目标检测与分类归档

目标检测是计算机视觉的核心任务,YOLO作为单阶段检测算法,以速度快、精度均衡著称。OpenCV dnn模块支持直接加载DarkNet模型,无需编译DarkNet即可实现推理。结合RTSP协议拉取实时流,可对视频帧进行逐帧分析,并将检测到的目标按类别和日期自动归档存储。这种技术方案在安防监控、工地计数、零售客流统计等场景中具有重要应用价值。本文基于yolo-python-rtsp项目,详细讲解从RTSP流接入、YOLOv3推理到分类落盘的完整实现,并分享权重加载、延迟优化、路径处理等避坑经验。

weixin_32678995的博客 271

tiny_yolov2_onnx_cam:带有NVIDIA TensorRT的微型YOLO v2推理应用程序

tiny_yolov2_onnx_cam 带有NVIDIA TensorRT的微型YOLO v2推理应用程序 在日本阅读本 目录 该应用程序有什么作用? 该应用程序从下载微型YOLO v2模型,并将其转换为NVIDIA TensorRT计划,然后开始对摄像机捕获的图像进行对象检测。 先决条件 NVIDIA Jetson Nano开发人员套件 USB网络摄像头或Raspberry Pi摄像头V2 NVIDIA JetPack 4.2.1或更高版本 安装 安装依赖库。 $ sudo apt update $ sudo apt install python3-pip protobuf-compiler libprotoc-dev libjpeg-dev cmake 您可能需要先安装Cython ,然后再安装其他python模块。 否则,在numpy安装中可能会发生“ RuntimeErr

win10系统下将yolo v2-tiny模型部署于Maix dock开发板进行目标检测

(1)制作目标检测数据集 使用labelimg软件进行图片的标注如图所示 点击open,导入等待标注的图片,进行目标的标注后生成标注从config文件,数据分为train_img文件夹与train_ano文件,图片与标注的信息文件。一般每一个class至少要有40张以上图片数据。 (2)建立训练模型 模型的选择有很多种,本文中使用yolo v2tiny,事实上使用MobiNet的更多一些,本文也...

千与编程 4602

正弦波产生电路_文氏桥振荡

本文以文氏桥振荡为基础产生正弦波,介绍了原理、计算、应用时需要注意的一些点,并给出了实测可用的电路模板

白鹤忘机的博客 3万+

【玩转Jetson TX2 NX】(七)TX2 NX YoLoV4环境搭建+板载摄像头实时目标检测(详细教程+错误解决)

TX2 NX YoLoV4环境搭建+板载摄像头实时目标检测(详细教程+错误解决)

鲁棒最小二乘支持向量机 3927

微信小程序导航栏滑动一定距离后固定到顶部

接上一篇文章的内容,通常在一个页面中部会有一个导航栏查看不同的内容,这篇文章旨在实现在页面下滑的过程中导航栏自动固定到顶部以便我们阅读过程中的切换。 下滑一段距离后自动固定到顶部 首先,思考这个功能应该是怎么实现的: 在页面下滑的过程中,我们希望系统应当能识别下滑了多少距离,当原本的导航栏逐渐被遮住以后(遮住意味着下滑了特定距离),触发这个功能,执行另一种样式,将导航栏固定在页面顶端,同时如果我们将页面往上滑,系统能识别到原来的导航栏能露出来了(即距离顶端的高度小于一个特定的值),这时候又执行最初的样式

Oblivision_Geek的博客 4019

具身智能与空天具身智能:从理论到实践的AIBOX技术革命

本文深入探讨了具身智能从理论到实践的发展,重点介绍了AIBOX技术如何作为边缘智能计算模块,为无人机、机器人等无人系统提供可进化的“大脑”。文章通过空天具身智能等应用场景,阐述了AIBOX在实现感知、决策、行动一体化闭环中的核心作用,并展望了其在协同智能与规模化部署中的未来挑战与机遇。

lll78的博客 757

jetson tx2 jetpack4 (cuda10.0 + opencv 4.1.1) 运行 yolov3-tiny

jetson tx2 jetpack4 [cuda10.0 + opencv 4.1.1]运行 yolov3-tiny之前准备opencv版本选择安装darknet+解决No package 'opencv' found +opencv版本问题darknet下载修改Makefile文件opencv版本问题解决No package 'opencv' found测试ubuntu打开摄像头 之前准备 看到有链接说arm下matplotlib不好装,果然我在pip install matplotlib的时候,下载w

yo跟着新宇走 1805

STM32 (基于HAL库) 硬件IIC任意地址读写任意字节----AT24CXX芯片

转了一圈,发现有关STM32的iic的硬件是使用比较少,基于HAL库的就更少,传统的,大家都是采用软件模拟的。有iic的协议相对复杂,同时灵活,尤其是不同的设备的I2C通信组合变化也不同,使用灵活的软件模拟也是可以理解的,在加上I2C的设备读写速度都比较低,硬件读写的优势就更无法体现,哪怕硬件I2C可以开启DMA,甚至在随机的读取少量字节的情况下。开启DMA反而效果更差。自然而然的硬件I2C就无人问津了。

qq_32273059的博客 1573

opencv dnn模块 示例(18) 目标检测 object_detection 之 pp-yolo、pp-yolov2和pp-yolo tiny

PP-YOLO没有像yolo4那样死抠现有的SOTA网络结构,而是着眼于合理的tricks堆叠。通过有效的计算,很好的平衡了准确率以及推理时间,而其中的实验部分也非常适合学习炼丹的小伙伴。

热爱生活,忠于自己 1581

obdumper和obloader迁移OceanBase业务库(一):实施手册

⭐️ 要求导出一致性数据时,建议在导出数据前,手动触发一次合并,在合并成功后再重新导出数据。:统计业务数据库下的所有业务对象清单(表/索引/分区/包/存储过程/同义词/序列/…:检查业务数据库下的所有业务对象清单(表/索引/分区/包/存储过程/同义词/序列/…:统计单个模式下所有业务对象清单(表/索引/分区/包/存储过程/同义词/序列/…如果单张表的数据量太大,会导出为多个文件,文件命名会加上数字后缀。该过程会导出所有表的定义、以及定义在表上的索引定义。如果有多种数据库对象,会导出到不同的子路径下。

Sebastien23的博客 1015

YOLOv11改进 | 细节涨点篇 | DySample一种最新的轻量化动态上采样算子(效果完爆CARAFE)

本文给大家带来的最新改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具有更少的参数、浮点运算次数、GPU内存和延迟。此外,DySample在包括语义分割、目标检测、实例分割、全景分割和单目深度估计在内的五个预测任务中,性能均优于其他上采样器(截至目前最有效的上采样算子),

Snu77的博客 4179

深度学习实战教程(1)--手机跑目标检测(YOLO,从DarkNet到Caffe再到NCNN完整打通)

https://github.com/lwplw 这篇打算就直入主题了,YOLO是什么、DarkNet是什么、Caffe是什么、NCNN又是什么…等等这一系列的基础科普这里就完全不说了,牵扯实在太多,通过其他帖子有一定的积累后,看这篇就相对容易了。 本文核心:把一个目标检测模型跑到手机上 下面开工: 1、训练得到一个目标检测模型 目前可以做目标检测的模型有很多,比如R-CNN、Fast R-CN...

对角巷 4万+

Spring Boot入门(13):Mybatis-Plus之条件构造器使用手册:精通让你快速提高查询效率的技巧!

化繁为简,MP 中条件构造器的使用,极其详细.

**My Coding Family** 3万+

基于darknet部署yolov3-tiny ros结合yolov3-tiny目标检测 Ubuntu下使用yolov3-tiny

在Ubuntu下使用darknet(yolov3-tiny)实现目标检测,包括图片、视频、摄像头检测。

Yangxiaoaijiejie的博客 1458

Odoo17商城微信支付模块,快速一个实现可在线支付的商城

通过集成微信支付APIv3,Odoo 系统实现了高效、安全的支付流程。Native扫码支付和Jsapi微信浏览器内直接拉起支付为用户提供了更加便捷的支付方式。同时,通过发送下单及支付消息给管理员,商家可以实时了解订单状态并进行相应处理。通过集成微信支付 结合 Odoo 系统内置的商城模块,可以为商家快速实现功能完善、高效的电商解决方案。

AaronZZH 的博客 2262

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

imx6ull移植opencv+yolo+nccn

本文详细介绍了在Windows环境下通过Ubuntu虚拟机交叉编译YOLOv3-tiny模型并移植到imx6ull开发板的过程。主要内容包括:1) 环境准备(虚拟机安装、CMake配置);2) OpenCV 4.2的交叉编译与安装;3) 获取YOLO预训练权重和配置文件;4) ncnn框架的交叉编译;5) 使用darknet2ncnn工具转换模型;6) 编写并编译YOLO推理demo程序;7) 最终移植测试,在开发板上成功运行目标检测并生成结果图片。整个过程涵盖了从环境搭建到模型转换、程序开发的全流程,为嵌

qq_63306931的博客 265

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Windows下 YOLOv3配置教程

Summary: YOLOv3—Windows配置 Author: Amusi Date: 2018-04-05 YOLOv3翻译 yolo官网 目录 硬件环境 安装教程 下载darknet 修改darknet.vcxproj 修改darknet.sln 打开darknet.sln 准备 测试 ...

我不是码农的博客~~~ 1491

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

释放Jetson Xavier NX的GPU潜力:实测对比带CUDA与不带CUDA的OpenCV性能差异

本文深入探讨了Jetson Xavier NX上OpenCV的CUDA加速性能差异,通过实测对比展示了CUDA加速在图像处理、目标检测等任务中的显著优势。从环境配置到性能优化,为开发者提供了全面的技术指南,帮助充分释放边缘计算设备的GPU潜力。

weixin_30617737的博客 601

【yolov4目标检测】(4) opencv+yolov4-tiny 实现选择性目标检测,附python完整代码

各位同学好,今天和大家分享一下如何使用 opencv 调用 yolov4-tiny 目标检测方法,并对指定类别进行检测。用b站的视频做测试。 点击按钮 'all',按钮变红色,对所有的类别检测 点击按钮 'person',按钮变红色,只对'person'类别检测 1.文件配置 首先,我们需要导入 yolov4-tiny 网络模型结构 cfg 文件,网络权重 weights 文件,以及 COCO 数据集的分类名称的 txt 文件。这里我已经给大家提供好了各种配置文件及代码,有需要的自取

博观而约取,厚积而薄发 6728

TX2上运行YOLOv3-tiny(usb摄像头测试成功)

TX2上运行YOLOv3-tiny TX2刷机、测试、环境搭建可以参考以下链接 TX2刷机、测试、更新源 1.yolo源码下载 $ git clone https://github.com/pjreddie/darknet.git $ cd darknet 2.配置编译预选项 $ gedit Makefile GPU=1 #是否需要用GPU CUDNN=1 #是否需要用CUDNN,这是NV...

housz77的博客 4768

imx6ull移植opencv+yolo+ncnn:TaoToken统一Key打通端侧AI推理链路

imx6ull移植OpenCV+ncnn跑YOLO,交叉编译工具链与CMake参数逐条拆解,附板端报错排查。调试阶段用TaoToken统一Key管理云端辅助接口,一个API通道切换模型,避免多平台切号。官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end

weixin_35756373的博客 7
上一篇: OpenCV之YOLOv3目标检测
下一篇: OpenCV之YOLOv4 目标检测
Super.Bear
Super.Bear 新星创作者: 人工智能技术领域 新星创作者: 人工智能技术领域
博客等级 码龄6年 2万+粉丝 429原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值