一,环境配置
VS2015+显卡RtX2080ti+CUDA10.1+Opencv2.4.13+pthread
pthread:ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip
Darknet:https://github.com/pjreddie/darknet
二,编译过程
1.从官网下载源码,并下载所需配置文件
2.建立新项目
3.文件加载
将源码中的src、include和example文件夹放到项目目录下,并按照源码Makefile文件中所涉及的文件进行加载,将其包含到项目中,加载include下的文件
加载src文件夹中对应的.c和.h文件
OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o l2norm_layer.o yolo_layer.o iseg_layer.o image_opencv.o
加载example文件夹中对应的.c文件
EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o instance-segmenter.o darknet.o
加载src文件夹中对应的.cu文件
OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o avgpool_layer_kernels.o
4.配置项目环境
附加包含目录,附加库目录
之后加载依赖项,有3部分组成,分别是OpenCV、Pthread和cuda中的lib文件
最后配置预处理器,使用OPENCV、GPU一定要加上,其中WIN32要加上才能使用线程,还有HAVE_STUCT_TIMESPEC要加上,不然编译时会出现timespec重复定义的错误。
5.编译并修改错误
(1)将出现#include<sys/time.h>处改为
#ifdef WIN32
#include<Windows.h>
#else
#include<sys/time.h>
#endif
(2) 删除#include<unisd.h>,这是linux下的头文件
(3)在utils.c文件中,出现错误:“error C2036: “void ”: 未知的大小”:只需要在void类型的变量前,添加相应的类型即可,我加的是(char*)arr
(4)出现snprintf,popen,pclose,sleep无法解析的问题时,在其文件头部添加
#if _MSC_VER
#define sleep _sleep
#define popen _popen
#define pclose _pclose
#endif
(5)出现无法解析的外部符号"gettimeofday"&“timersub””时在其文件头部加入下面代码即可
#include<Windows.h>
int gettimeofday(struct timeval *tp, void *tzp)
{
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year = wtm.wYear - 1900;
tm.tm_mon = wtm.wMonth - 1;
tm.tm_mday = wtm.wDay;
tm.tm_hour = wtm.wHour;
tm.tm_min = wtm.wMinute;
tm.tm_sec = wtm.wSecond;
tm.tm_isdst = -1;
clock = mktime(&tm);
tp->tv_sec = clock;
tp->tv_usec = wtm.wMilliseconds * 1000;
return (0);
}
void timersub(struct timeval *a, struct timeval *b, struct timeval *res)
{
res = a - b;
}
(6)出现nind需使用常量的问题时,只需在头部重新定义即可,
#define nind 10
(7)出现STDIN_FILENO未定义问题时,将相关代码注释即可,其是Linux下unisd.h中的模块,
(8)现在编译就可以成功了,如果出现文件类型和名称警告是可加入
#define _CRT_SECURE_NO_WARNINGS
忽略警告
6.测试
./darknet_zcl.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -i 0 -thresh 0.25 data/dog.jpg -ext_output
7.由于源码更新,所以在Windows下的版本已经过时,缺少了许多模块,所以需要重新编译,之后语义分割模块的训练会陆续更新。