按照 https://github.com/AlexeyAB/darknet#how-to-use 介绍,下载代码。
我目前安装了 OpenCV4.0和 CUDA v10.1 ,是不符合要求的。不过,我强制修改了一些配置,解决了编译问题。
![a19dc24205509736bb4b452d47814941.png](https://img-blog.csdnimg.cn/img_convert/a19dc24205509736bb4b452d47814941.png)
将 CUDA v10.0改成 10.1
然后一路编译,得到
![3fe815eef8ae24e6b8eea24fabff3a75.png](https://img-blog.csdnimg.cn/img_convert/3fe815eef8ae24e6b8eea24fabff3a75.png)
得到链接库
主要的库:
include
darknet.h
yolo_v2_class.hpp
lib
yolo_cpp_dll.lib
yolo_cpp_dll_no_gpu.lib
bin
yolo_cpp_dll.dll
yolo_cpp_dll_no_gpu.dll
现在可以测试代码了:
![059708e79d679dfda21ae37408afff61.png](https://img-blog.csdnimg.cn/img_convert/059708e79d679dfda21ae37408afff61.png)
调用Detetor
![0757c49211eae891556018bb48fbd795.png](https://img-blog.csdnimg.cn/img_convert/0757c49211eae891556018bb48fbd795.png)
测试结果
写一个封装接口,避免 头文件污染。
![c98d201bfed0cce62bfa6ad00dd88f03.png](https://img-blog.csdnimg.cn/img_convert/c98d201bfed0cce62bfa6ad00dd88f03.png)
封装成新代码
主要实现代码:
struct DarknetDetectorImpl {DarknetDetectorImpl(DarknetDetector* _p) :p(_p) {gpuId = 0;isChanged = false;}DarknetDetector* p;string configFile;string weightFile;string labelFile;int gpuId;std::shared_ptr dtor;std::map labelMap;bool isChanged;};DarknetDetector::DarknetDetector(){pImpl = new DarknetDetectorImpl(this);}DarknetDetector::~DarknetDetector(){delete pImpl;}void DarknetDetector::setConfigFile(const string& fName){if (pImpl->configFile != fName){pImpl->configFile = fName;pImpl->isChanged = true;}}void DarknetDetector::setWeightFile(const string& fName){if (pImpl->weightFile != fName){pImpl->weightFile = fName;pImpl->isChanged = true;}}void DarknetDetector::setLabelFile(const string& fName){if (pImpl->labelFile != fName){pImpl->labelFile = fName;std::ifstream file(fName);std::string line;for(unsigned int i = 0; std::getline(file, line); ++i)pImpl->labelMap[i] = line;}}string DarknetDetector::getName(unsigned int obj_id) const{auto it = pImpl->labelMap.find(obj_id);if (it == pImpl->labelMap.end())return string();return it->second;}void DarknetDetector::setGpuId(int gpuId){if (pImpl->gpuId != gpuId){pImpl->gpuId = gpuId;pImpl->isChanged = true;}}bool DarknetDetector::initialize(){if(!pImpl->dtor || pImpl->isChanged)pImpl->dtor.reset(new Detector(pImpl->configFile, pImpl->weightFile, pImpl->gpuId));pImpl->isChanged = false;return true;}vector DarknetDetector::detect(const cv::Mat& img, float thresh /*= 0.2*/, bool use_mean /*= false*/){vector res;if (img.empty())return res;auto& dtor = pImpl->dtor;auto boxes = dtor->detect(img, thresh, use_mean);for (auto& box : boxes){DarknetBox dbox;dbox.x = box.x;dbox.y = box.y;dbox.w = box.w;dbox.h = box.h;dbox.prob = box.prob;dbox.obj_id = box.obj_id;dbox.track_id = box.track_id;dbox.frames_counter = box.frames_counter;res.push_back(dbox);}return res;}vector DarknetDetector::detect(const string& imgFile, float thresh /*= 0.2*/, bool use_mean /*= false*/){return detect(cv::imread(imgFile, cv::IMREAD_COLOR), thresh, use_mean);}
写一个界面,测试:
![79440117782cb0a05ee5da9fb6347fb2.png](https://img-blog.csdnimg.cn/img_convert/79440117782cb0a05ee5da9fb6347fb2.png)
测试界面
便于测试,日志检测出了 2只羊2只马,只花了 23ms
[20190401 23:42:49] detect [4] object, use time 23.7652(ms)---index[0]x,y,w,h=[615,156,12,14]prob=[0.621524] obj_id=[18] label=[sheep]track_id=[0] frames_counter=[0]---index[1]x,y,w,h=[452,164,26,11]prob=[0.606778] obj_id=[18] label=[sheep]track_id=[0] frames_counter=[0]---index[2]x,y,w,h=[158,156,67,45]prob=[0.931439] obj_id=[17] label=[horse]track_id=[0] frames_counter=[0]---index[3]x,y,w,h=[316,129,69,85]prob=[0.991121] obj_id=[17] label=[horse]track_id=[0] frames_counter=[0]
![611b50e6b3a4f066b120d08561f5cdba.png](https://img-blog.csdnimg.cn/img_convert/611b50e6b3a4f066b120d08561f5cdba.png)
测试2
[20190401 23:46:21] detect [7] object, use time 32.9672(ms)---index[0]x,y,w,h=[355,185,62,225]prob=[0.998801] obj_id=[0] label=[person]track_id=[0] frames_counter=[10029]---index[1]x,y,w,h=[101,294,127,155]prob=[0.991353] obj_id=[0] label=[person]track_id=[0] frames_counter=[10029]---index[2]x,y,w,h=[316,216,50,164]prob=[0.98607] obj_id=[0] label=[person]track_id=[0] frames_counter=[10029]---index[3]x,y,w,h=[220,213,55,152]prob=[0.981358] obj_id=[0] label=[person]track_id=[0] frames_counter=[10029]---index[4]x,y,w,h=[106,175,26,80]prob=[0.96872] obj_id=[0] label=[person]track_id=[0] frames_counter=[10029]---index[5]x,y,w,h=[237,165,17,53]prob=[0.838328] obj_id=[0] label=[person]track_id=[0] frames_counter=[10029]---index[6]x,y,w,h=[87,176,23,78]prob=[0.712558] obj_id=[0] label=[person]track_id=[0] frames_counter=[10029]
经过测试,darknet 版本的 yolov3模型速度比较快,基本上 30ms左右解决一般图片的目标检测。
有使用疑问的,或者需要vs15x64 的编译代码的,或者 Qt版本测试软件的,可以联系我分享一下。