前言
使用环境 win+mingw64+CPU,无GPU
1. 准备工作
安装mingw
安装CMAKE
下载源程序:git clone https://github.com/AlexeyAB/darknet
2. CMAKE生成makefile
选择源文件路径和目标路径
选择opencv路径,取消CUDA选项
configure generate
在目标路径打开终端,输入make,编译。
3. 编译问题处理
1. src/httplib.h报错 _gthread_time_t __ts' has incomplete type
根据错误,查找发现是std::this_thread::sleep_for(std::chrono::milliseconds(1));引起的。因为貌似并没有用到http部分,直接屏蔽该行。
2. :classifier.c:(.text+0x6d6a): undefined reference to `timersub'
在src/gettimeofday.h文件中timersub只在MSVC编译器下被编译。在ifdef外加上
#define timersub(a, b, result) \
do { \
(result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
(result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
if ((result)->tv_usec < 0) { \
--(result)->tv_sec; \
(result)->tv_usec += 1000000; \
} \
} while (0)
4. 开启优化
下载预训练模型yolov4.weight,输入
./darknet.exe detect ./cfg/yolov4.cfg yolov4.weights ./data/dog.jpg
结果得到一个36秒的超慢结果。。
./data/dog.jpg: Predicted in 36142.325000 milli-seconds.
bicycle: 92%
dog: 98%
truck: 92%
pottedplant: 33%
回到CMAKE中,打开AVX
在openmp后面加上-ffp-contract=fast -mavx -mavx2 -msse3 -msse4.1 -msse4.2 -msse4a
编译问题:
gemm.c报错未定义__cpuidex。
gemm.c修改为
void cpuid(int info[4], int InfoType) {
__cpuid(InfoType , info[0], info[1], info[2], info[3]);
}
// #ifdef _WIN32
// // Windows
// #define cpuid(info, x) __cpuidex(info, x, 0)
// #else
// // GCC Intrinsics
// void cpuid(int info[4], int InfoType) {
// __cpuid_count(InfoType, 0, info[0], info[1], info[2], info[3]);
// }
// #endif
若还有错误,则修改C:\mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\include\cpuid.h。
输入测试命令,跑了14秒。
./data/dog.jpg: Predicted in 14656.837000 milli-seconds.
bicycle: 92%
dog: 96%
truck: 92%
pottedplant: 33%
5 其他模型
yolov4-tiny.weights 0.6s
./data/dog.jpg: Predicted in 624.065000 milli-seconds.
bicycle: 60%
dog: 84%
truck: 79%
car: 45%
yolov3.weights 3s
./data/dog.jpg: Predicted in 3315.204000 milli-seconds.
bicycle: 99%
dog: 100%
truck: 93%
yolov3-tiny.weights 0.4s
./data/dog.jpg: Predicted in 476.301000 milli-seconds.
dog: 81%
bicycle: 38%
car: 71%
truck: 41%
truck: 62%
car: 40%
6. 继续优化
调整cfg中的参数,可以继续优化识别速度和准确率