VS2013+openCV331实现对象检测,YOLO检测调试

标签: YOLO对象检测 C openCV331
27人阅读 评论(0) 收藏 举报
分类:
     首先,感谢zhigang师兄提供的机器学习结果,他的GitHub地址:https://github.com/gloomyfish1998/opencv_tutorial点击打开链接 总共是完成了20种对象的机器学习,与之配套的文章在这里http://mp.weixin.qq.com/s/95hftpJfSDIMlMVOC7iq4g,点击打开链接,是的,微信公众号上的文章。对应的英文文献 You Only Look Once:Unified, Real-Time Object Detection,也就是千年圈内大热的YOLO检测。

   资源地址:https://download.csdn.net/download/qq_15522447/10351828 点击打开链接

   开始调试之前,要在VS2013配置openCV331环境,配置环境这种东西还是要实际的操作多次,才能算的上是掌握,如果非要加一个次数期限,就是5次。网上充斥着环境配置的各种文章,请自行百度吧。
   话不多说,先上对象检测运行效果

   环境配置完成后,就简单建一个控制台应用程序吧。
   1. 导入头文件
#include <vector>
#include <string>
#include <opencv.hpp>
#include <opencv2\dnn.hpp>
#include <opencv2\objdetect.hpp>
#include <opencv2\world.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;
using namespace dnn;
  2. 主函数
string	modelConfiguration ="F:/opencv_tutorial-master/data/models/yolov2-tiny-voc/yolov2-tiny-voc.cfg";
string		modelBinary ="F:/opencv_tutorial-master/data/models/yolov2-tiny-voc/yolov2-tiny-voc.weights";
	
Net net = readNetFromDarknet(modelConfiguration, modelBinary);
if(net.empty())
{
  printf("Could not load net...\n");
  return 0;
}

vector<string>	classNamesVec;
ifstream classNamesFile("F:/opencv_tutorial-master/data/models/yolov2-tiny-voc/voc.names");
if(classNamesFile.is_open())
{
   string	className =	"";
   while(getline(classNamesFile, className))
   classNamesVec.push_back(className);
}
	// 加载图像

Mat frame = imread("F:/opencv_tutorial-master/race.jpg");
frame = objectDetection(frame, net, classNamesVec);

imshow("检测结果", frame);

waitKey();

return 0;
3. 相关函数及实现
Mat objectDetection(Mat frame, Net net, vector<string>	classNamesVec);
Mat objectDetection(Mat frame, Net net, vector<string>	classNamesVec)
{
	Mat	inputBlob = blobFromImage(frame, 1 / 255.F, Size(416, 416), Scalar(), true, false);
	net.setInput(inputBlob, "data");
	// 检测
	Mat	detectionMat = net.forward("detection_out");
	ostringstream ss;
	// 输出结果
	for (int i = 0; i < detectionMat.rows; i++)
	{
		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)
		{
			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, 0, 255), 2, 8);

			if (objectClass < classNamesVec.size())
			{
				ss.str("");
				ss << confidence;

				String	conf(ss.str());

				String	label = String(classNamesVec[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), CV_FILLED);
				putText(frame, label, Point(xLeftBottom, yLeftBottom + labelSize.height), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
			}
		}
	}
	return frame;
}
4.  置信度阈值
float confidenceThreshold = 0.25;
 原图与对象检测结果
 
 检测结果图中 ,红色方框为对象结果对象的定位,左上角标签文字为检测结果,结果后的数值表示置信度。显然,机器学习将图中的那个逗比看成了飞机,不过还是蛮厉害的,确实如同是一架飞机,机器学习做了抽象推理,哈哈!这个对象检测方法有很多可以优化的地方,连续运行时速度较慢,会造成画面卡顿,fighting!!!







查看评论

YOLO初体验--实时目标检测

见个人博客: https://ziyubiti.github.io/2016/12/18/yolo/
  • ziyubiti
  • ziyubiti
  • 2016-12-21 16:01:43
  • 2733

YOLO检测算法小结

1.准备数据 1.1按照VOC的数据格式存放好数据,然后使用darknet上的py脚本voc_label.py生成相应的train,val,test相关的图片路径txt以及yolo需要读取的label...
  • a130098300
  • a130098300
  • 2017-03-14 10:49:53
  • 1273

yolo5类检测成功

用yolo检测动物,分5类:老虎,兔子,鱼,鹿,猫。训练的图片只有189张,迭代3000次的效果:...
  • wuzuyu365
  • wuzuyu365
  • 2016-09-01 18:50:35
  • 2601

深度学习之物体检测——YOLO(二)_用作者提供的YOLO实现进行检测

使用训练好的YOLO进行检测 首先安装Darknet git clone https://github.com/pjreddie/darknet cd darknet make 下载预训练得到的权重文...
  • VictoriaW
  • VictoriaW
  • 2017-05-16 12:04:24
  • 1550

基于深度学习的视频检测(四) yolo-v2和darkflow

yolo-v1核心思想:从R-CNN到Fast R-CNN一直采用的思路是proposal+分类 (proposal 提供位置信息, 分类提供类别信息)精度已经很高,但是速度还不行。 YOLO提供了另...
  • qq_23225317
  • qq_23225317
  • 2017-12-15 12:50:00
  • 653

深度学习物体检测(九)——对象检测YOLO系列总结

YOLO ->SSD -> YOLO2路线是基于回归检测进化路线, 一句话来描述 来描述进化过程: YOLO:RCNN系列对象检测太慢了,能快点吗? SSD :YOLO速度是上来了,可是mAP太低了...
  • zchang81
  • zchang81
  • 2017-04-13 11:44:38
  • 2100

对目标检测方法yolo的理解 (二)

本文转载自: http://blog.csdn.net/u011534057/article/details/51244354 Reference link: http://...
  • hx921123
  • hx921123
  • 2017-02-19 10:39:06
  • 6478

对象检测C++代码调试

  • 2018年04月16日 11:11
  • 10.98MB
  • 下载

学习笔记:yolo识别图片

版权声明:本文为博主原创文章,未经博主允许不得转载。作用说明,我是菜鸟,这学习笔记,主要用于自我记录。YOLO,官方https://pjreddie.com/darknet/yolo/最新版本是YOL...
  • zr940326
  • zr940326
  • 2017-11-25 18:21:04
  • 582

使用YOLOv2训练行人检测模型

关于训练YOLO v2模型过程中的经验总结。 数据集: 考虑到自己收集图片并标注,工作量较大,当前主要将包含行人的图片从已有的数据集PASCAL VOC中抽取出来,按照\VOCdevkit\VOC...
  • yudiemiaomiao
  • yudiemiaomiao
  • 2017-05-11 15:44:08
  • 4193
    个人资料
    等级:
    访问量: 172
    积分: 41
    排名: 182万+
    文章存档