OpenCV之YOLOv2-tiny目标检测

目录
前言
一、-tiny介绍
二、预处理
三、模型加载与推理
四、解析输出
前言
YOLO(You Only Look Once)是一种基于深度神经网络的目标对象识别和定位算法,其特点是运行速度快、实时性高 。这里我们将使用Tiny 版本的YOLO算法 。
YOLO算法创造性地将R-CNN目标检测中的选择候选区和识别候选区对象两个阶段合二为一,这也是YOLO名字的来由(只需看一眼就知道图片的哪些位置有什么对象) 。
一、-tiny介绍
-tiny,轻量版的,即使用Tiny 来实现目标检测 。Tiny 包含9个卷积层和6个最大池化层,如图所示 。
Tiny 目标检测算法具有预处理、网络推导和后处理三个步骤:
(1)预处理:对输入的任意分辨率的RGB图像,将各通道像素点的像素值归一化到[0, 1]区间,并按原图的长宽比例,将图像的尺寸缩放至416×416(以0.5填充);
(2)网络推导:将归一化后的416×416×3图像输入到Tiny 网络进行前向推导,得到
13×13×5×25的输出张量;
(3)后处理:根据输出张量的格式,得到每个边框的中心点坐标以及长和宽,并根据各边框的覆盖度和置信度等信息,对所有13×13×5个边框进行NMS处理,得到最可能包含目标对象的候选框 。最后根据1)中的缩放比率,将得到的候选边框放大并在原图中显示,即可得到目标对象的位置和类别信息 。
-tiny网络模型每个Cell需要检测5个BOX,对每个BOX来说,包含如下数据:

OpenCV之YOLOv2-tiny目标检测

文章插图
【OpenCV之YOLOv2-tiny目标检测】所以对每个BOX来说,每个BOX有5+20=25个参数,5个BOX共有 5x25=125个参数 。所以,tiny-YOLO网络模型最后一层卷积层深度是125 。
参考:目标检测之-v3_风间琉璃?的博客-CSDN博客
资源下载:
-tiny-voc.:
-tiny-voc.cfg:
voc.names:
更多版本下载:YOLO: Real-Time
二、预处理
数据集采用的voc数据集,需要将voc.names包含训练模型的所有类名称加载到内存中 。
String classespath = "F:/data/CQU/VS/yolov2-tiny/voc.names";//得到网络对应的标签vector getclasses(string classespath){ifstream ifs(classespath);//分类名vector classes;if (ifs.is_open()){string line;while (getline(ifs, line)){classes.push_back(line);}}return classes;}
神经网络的输入图像需要采用称为blob的特定格式 。从输入图像或视频流中读取帧后,将通过函数将其转换为神经网络的输入blob 。
在此过程中,它使用比例因子1/255将图像像素值缩放到0到1的目标范围 。它还将图像的大小调整为给定大小(416,416)而不进行裁剪 。
//图像预处理Mat blob = blobFromImage(frame, 1 / 255.0, Size(416, 416), Scalar(), true, false);
三、模型加载与推理
加载网络直接使用 。
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");