一、配置環境
VS2013+顯卡GtX1080ti+CUDA7.5+Opencv3.1.0+pthread
pthread:ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip
YOLO:http://pjreddie.com/darknet/yolo
Darknet:https://github.com/pjreddie/darknet
二、配置步驟
1、新建vs工程:刪除新建后的自帶的kernel.cu
2、為了方便調試,將工程設置為Release x64模式
3、在工程下添加三個文件夾,分別命名為c,h,cu。這里需要注意:需要添加的文件位置在 darknet的src以及examps中,具體添加文件根據darknet中的Makefile里面所顯示的來添加文件。因為YOLO會隨時更新,別人的文件可能和你不一致。
下面是我的Makefile文件中需要添加的文件:
添加的.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 box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_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
EXECOBJA=captcha.o lsd.o super.o voxel.o art.o tag.o cifar.o go.o rnn.o rnn_vid.o compare.o segmenter.o regressor.o classifier.o coco.o dice.o yolo.o detector.o writing.o nightmare.o swag.o darknet.o
添加的.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 network_kernels.o avgpool_layer_kernels.o
4、接下來是添加包含目錄、依賴庫等:CUDA7.5,opencv3.1.0,pthread
5、上面都配置完之后進行編譯,會出現很多錯誤,這里對遇到的錯誤進行總結下:
a、將出現#include<src/time.h>處都改成#include<time.h>
b、刪除#include<unisd.h>,這是linux下的頭文件
c、在用到inline的文件中,都在前面添加#define inline _inline
d、“error C2079: “tval_before”使用未定義的 struct“timeval””:在出現類似結構體錯誤的文件頭添加
“
#ifdef WIN32
# include <windows.h>
#else
# include <sys/time.h>
#endif
”
e、“error C2275: “image”: 將此類型用作表達式非法”:在出現類似錯誤時,只需將該類型定義的變量語句放在函數頭即可
如下:
對於定義指針時,類型用作表達式非法,只需要在函數頭初始化指針為NULL即可,例如:image *p=NULL
d、在utils.c文件中,出現錯誤:“error C2036: “void *”: 未知的大小”:只需要在void*類型的變量前,添加相應的類型即可
e、會出現snprintf,popen,pclose,sleep無法解析的問題,這里只要將snprintf改成_snprintf或者在預編譯處加入
#if _MSC_VER
#define snprintf _snprintf
#endif
即可,然后把popen,pclose,sleep改成_popen,_pclose,_sleep。問題就可以解決
f、出現“error LNK2001: 無法解析的外部符號"gettimeofday"&"timersub"”:解決方法是在文件頭部添加gettimeofday和timersub函數的聲明。具體聲明如下:
1 #ifdef WIN32 2 int gettimeofday(struct timeval *tp, void *tzp) 3 { 4 time_t clock; 5 struct tm tm; 6 SYSTEMTIME wtm; 7 GetLocalTime(&wtm); 8 tm.tm_year = wtm.wYear - 1900; 9 tm.tm_mon = wtm.wMonth - 1; 10 tm.tm_mday = wtm.wDay; 11 tm.tm_hour = wtm.wHour; 12 tm.tm_min = wtm.wMinute; 13 tm.tm_sec = wtm.wSecond; 14 tm.tm_isdst = -1; 15 clock = mktime(&tm); 16 tp->tv_sec = clock; 17 tp->tv_usec = wtm.wMilliseconds * 1000; 18 return (0); 19 } 20 21 void timersub(struct timeval *a, struct timeval *b, struct timeval *res) 22 { 23 res = a - b; 24 } 25 #endif
g、出現“錯誤 1095 error LNK2019: 無法解析的外部符號 curandSetPseudoRandomGeneratorSeed”:解決方法是在包含的頭文件中添加:
#pragma comment(lib, "cudart.lib")
#pragma comment(lib, "curand.lib")
即可。
h、出現“error C2065: “CLOCK_REALTIME”: 未聲明的標識符”:直接將那句話注釋掉即可
i、注意前面添加文件時,一定要按照Makefile里面顯示的添加,否則會出錯!
6、編譯成功后,就可以進行測試了,添加命令路徑:
detect D:/gaokun/YOLO/darknet/cfg/yolo.cfg D:/gaokun/YOLO/darknet/yolo.weights
此時,還需要對darknet.c文件中的部分內容進行修改:
還需要對detector.c中的路徑進行修改:
對image.c的內容進行修改:
注意:修改完上述文件后,需重新編譯yolo-windows-master。然后再加入命令行調試參數,進行調試。
調試時,取消對包含“CLOCK_REALTIME”的語句的注釋(錯誤h)。
7、以下是部分測試結果:
參考博客:http://blog.csdn.net/xiaoye5606/article/details/62439298
后續會更新用YOLO來訓練自己的數據等內容。