Darknet windows移植

代码地址: https://github.com/makefile/darknet

编译要求: VS2013 update5 及其之后的版本(低版本对C++标准支持较差)

配置opencv来显示图片结果,如果不配置OpenCV,则支持的图片类型较少,结果将直接保存到文件.

pthread库

下载windows版pthread库,将头文件与编译好的lib与dll文件挑出来供Darknet使用.在VS配置中添加pthreadVC2.lib.

时间函数

linux下的时间函数库#include <sys/time.h>需要被替换.可以用clock()来替换what_time_is_it_now(),或者如下代码来定义what_time_is_it_now:

#include "gettimeofday.h"
#define CLOCK_REALTIME 0
#pragma warning(disable: 4996) //disable deprecated warning as error
#define BILLION (1E9) static BOOL g_first_time = 1;
static LARGE_INTEGER g_counts_per_sec; int clock_gettime(int dummy, struct timespec *ct)
{
LARGE_INTEGER count; if (g_first_time)
{
g_first_time = 0; if (0 == QueryPerformanceFrequency(&g_counts_per_sec))
{
g_counts_per_sec.QuadPart = 0;
}
} if ((NULL == ct) || (g_counts_per_sec.QuadPart <= 0) ||
(0 == QueryPerformanceCounter(&count)))
{
return -1;
} ct->tv_sec = count.QuadPart / g_counts_per_sec.QuadPart;
ct->tv_nsec = ((count.QuadPart % g_counts_per_sec.QuadPart) * BILLION) / g_counts_per_sec.QuadPart; return 0;
} double what_time_is_it_now()
{
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
return now.tv_sec + now.tv_nsec*1e-9;
}

gettimeofday.h与gettimeofday.c实现在 这里 .

void *指针加法

访问地址时对void *arr进行加法:arr+偏移数字时VS编译不通过,强制类型转换为char*可通过且没有错误.

动态数组

static const int nind = 2;之后创建了大小了nind 的数组,VS的低版本可能不支持arr[变量]这样的数组定义.

替换成宏定义define nind 2,也可简单将数组定义为arr[2].

其它函数定义,修饰符,头文件

#if defined(_MSC_VER) && _MSC_VER < 1900
#define inline __inline
#define snprintf(buf,len, format,...) _snprintf_s(buf, len,len, format, __VA_ARGS__)
#endif #ifdef _WIN32
#define popen _popen
#define pclose _pclose
//#include <windows.h>
#define sleep(secs) Sleep(secs * 1000) //windows.h millsecs
#endif

getopt.h与unistd.h均为非标准C的linux API,windows版移植源码在 这里 .

OpenMP

Darknet的OpenMP加速在多个for循环中,代码在这,在windows上运行时有时出现访问冲突.按照(这里的代码)修改即可,使用一个for循环多次调用原各个gemm函数,在for前边加#pragma omp parallel for语句.

VS的其它小毛病

可能出现名字冲突等,需要改一些变量的名字.

导出动态链接库

将框架的初始化和模型的加载,网络预测等操作封装到了一个类中,使用__declspec(dllexport)修饰符来将函数导出到dll中.头文件与lib,dll文件可供其它Windows项目使用.

代码在这里:yolo_v2_class.hpp,yolo_v2_class.cpp,yolo_console_dll.cpp.

使用测试

运行命令:darknet.exe detector test data/coco.data yolo.cfg yolo.weights -i 0 -thresh 0.2

大小1176x510的图片,测试耗时4min,开启OpenMP加速后60s (i7,8线程).

其它加速方法:使用其它的库,如MKL等.参考https://groups.google.com/forum/#!topic/darknet/AZ-jp45bDpI.

Darknet windows移植(YOLO v2)的更多相关文章

  1. yolo v2使用总结

    以下都是基于yolo v2版本的,对于现在的v3版本,可以先clone下来,再git checkout回v2版本. 玩了三四个月的yolo后发现数值相当不稳定,yolo只能用来小打小闹了. v2训练的 ...

  2. 目标检测之YOLO V2 V3

    YOLO V2 YOLO V2是在YOLO的基础上,融合了其他一些网络结构的特性(比如:Faster R-CNN的Anchor,GooLeNet的\(1\times1\)卷积核等),进行的升级.其目的 ...

  3. YOLO v2 损失函数源码分析

    损失函数的定义是在region_layer.c文件中,关于region层使用的参数在cfg文件的最后一个section中定义. 首先来看一看region_layer 都定义了那些属性值: layer ...

  4. C/C++ Windows移植到Linux

    近期写了有关Socket的程序,需要从windows移植到linux.现把有用的东东收集整理记录下来. 1.头文件windows下winsock.h或winsock2.h:linux下netinet/ ...

  5. 目标检测论文解读7——YOLO v2

    背景 YOLO v1检测效果不好,且无法应用于检测密集物体. 方法 YOLO v2是在YOLO v1的基础上,做出如下改进. (1)引入很火的Batch Normalization,提高mAP和训练速 ...

  6. 【计算机视觉】【神经网络与深度学习】YOLO v2 detection训练自己的数据2

    1. 前言 关于用yolo训练自己VOC格式数据的博文真的不少,但是当我按照他们的方法一步一步走下去的时候发现出了其他作者没有提及的问题.这里就我自己的经验讲讲如何训练自己的数据集. 2.数据集 这里 ...

  7. DNN:windows使用 YOLO V1,V2

    本文有修改,如有疑问,请移步原文. 原文链接:  YOLO v1之总结篇(linux+windows) 此外:  YOLO-V2总结篇   Yolo9000的改进还是非常大的 由于原版的官方YOLOv ...

  8. YOLO V2论文理解

    概述 YOLO(You Only Look Once: Unified, Real-Time Object Detection)从v1版本进化到了v2版本,作者在darknet主页先行一步放出源代码, ...

  9. darknet(yolov2)移植到caffe框架

    yolov2到caffe的移植主要分两个步骤:一.cfg,weights转换为prototxt,caffemodel1.下载源码:git clone https://github.com/marvis ...

随机推荐

  1. 这些保护Spring Boot 应用的方法,你都用了吗?

    这些保护Spring Boot 应用的方法,你都用了吗? 生如夏花 SpringForAll社区 今天 Spring Boot大大简化了Spring应用程序的开发.它的自动配置和启动依赖大大减少了开始 ...

  2. nio 阻塞 非阻塞 同步 异步

    https://mp.weixin.qq.com/s/5SKgdkC0kaHN495psLd3Tg 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相 ...

  3. springboot 后台运行

    https://zhuanlan.zhihu.com/p/25102504?refer=dreawer 酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前,我们 ...

  4. c# WebApi之解决跨域问题:Cors

    什么是跨域问题 出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容.由于这个原因,我们不同站点之间的数据访问会被拒绝. Cors解决跨域问 ...

  5. 第二十一节,使用TensorFlow实现LSTM和GRU网络

    本节主要介绍在TensorFlow中实现LSTM以及GRU网络. 一 LSTM网络 Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息 ...

  6. template specifiers not specified in declaration of ‘template<class Key> class hash’

    尝试写显示特化样例的时候,写了如下代码 #include <iostream> #include <cstddef> using namespace std; #define ...

  7. HTML学习笔记Day4

    一.浮动属性 1.首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流: 无论多么复杂的布局,其基本出发点均是:“如何在一行显示多个div元素”: 显然标准流已经无法满足需求 ...

  8. 使用pip cmd安装包

    pip install matplotlib -i http://pypi.douban.com/simple --trusted-host pypi.douban.com,通过命令行安装的时候,指定 ...

  9. Go多组Raft库

    Go多组Raft库 https://github.com/lni/dragonboat/blob/master/README.CHS.md 使用用例 https://github.com/lni/dr ...

  10. 怎么正确的回滚git的代码?

    1. git reflog或者git log查看到节点的hash值 2. git reset滚回某个节点 1)如果想保留当前的代码用 git reset --mixed ${Hash} 2)如果想联通 ...