在Windows 7上折腾YOLOv3?用Cygwin编译Darknet的保姆级避坑实录
在Windows 7上折腾YOLOv3用Cygwin编译Darknet的保姆级避坑实录十年前的老旧笔记本突然被征用要求跑一个目标检测demo——甲方坚持用Windows 7系统而项目依赖的YOLOv3需要Linux环境。当Cygwin遇上停止维护的Windows 7这场跨越时代的编译之旅注定充满戏剧性。本文将带你穿越回那个Python 2.7仍是主流的年代用最原始的编译方式在Win7上复活Darknet。1. 环境准备当现代工具链遇上老系统我的ThinkPad T430s在仓库吃灰五年后重见天日4GB内存搭配i5-3320M处理器系统还是当年装机时装的Windows 7 SP1 64位。打开任务管理器时那熟悉的Aero特效让人恍惚间回到2012年。1.1 Cygwin的考古式安装访问Cygwin官网时现代浏览器不断弹出安全警告——这个为Windows提供POSIX兼容层的工具其官网证书居然已经过期三年。建议直接使用存档镜像# 国内可用镜像源 http://mirrors.aliyun.com/cygwin/ http://mirrors.163.com/cygwin/安装时必须精确选择以下组件包版本号很关键组件包推荐版本备注gcc-core7.4.0-1新版会导致兼容性问题make4.2.1-1必须匹配GCC版本binutils2.30-1链接器核心组件libopenssl1.1.1-1HTTPS请求必备git2.20.0-1代码下载工具注意安装路径不要包含中文或空格建议直接使用C:\cygwin64。安装完成后务必检查/bin是否加入系统PATH否则后续编译会提示command not found。1.2 Darknet源码的时空穿越从Joseph Redmon的原始仓库克隆代码时发现必须指定历史提交点git clone --depth 1 --branch yolov3 https://github.com/pjreddie/darknet.git cd darknet git reset --hard 61c9d02 # 2018年的稳定提交这个版本的Darknet还在使用纯C编写没有后来的Python接口对老旧设备更友好。源码包里那些.c文件散发着原始C语言的味道——没有花哨的抽象全是直接的内存操作。2. 编译陷阱当POSIX遇到Win32 API在Cygwin终端输入make的那一刻各种报错如同机关枪般扫射过来。第一个拦路虎是go.o相关错误——这个源自Darknet对Golang的奇怪支持在Windows环境下根本就是死路一条。2.1 必须修改的关键文件Makefile外科手术 找到EXECOBJA变量所在行删除其中的go.oEXECOBJAcaptcha.o lsd.o super.o art.o tag.o cifar.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o darknet.o源代码打补丁 在examples/darknet.c中注释掉两行Go相关代码// extern void run_go(int argc, char **argv); // else if (0 strcmp(argv[1], go)) { run_go(argc, argv); }头文件急救包 在examples/go.c顶部添加#include sys/select.h在include/darknet.h中添加#include time.h2.2 Cygwin特有的路径战争Windows的反斜杠和Unix的正斜杠在Cygwin里上演了一场混战。当执行make时如果遇到No such file or directory错误试试这些命令# 转换路径分隔符 export CYGWINwinsymlinks:nativestrict # 重建符号链接 ln -sf /cygdrive/c/path/to/darknet ./darknet血泪教训不要在Cygwin中使用Windows风格的路径如C:\path必须转换为/cygdrive/c/path格式。编译时所有文件路径必须统一风格否则会出现诡异的文件存在但找不到现象。3. CPU版YOLOv3的调教艺术没有CUDA加速的Darknet就像没了涡轮增压的老爷车但通过以下技巧仍能让它在CPU上跑出可用性能3.1 Makefile的优化参数修改Makefile中的关键参数CCgcc CFLAGS-O3 -ffast-math -marchnative # 启用所有CPU指令集 LDFLAGS-lm -pthread对于多核CPU比如我的双核i5可以添加CFLAGS-fopenmp LDFLAGS-fopenmp3.2 内存限制破解术在src/detector.c中找到test_detector函数修改批处理大小int batches 1; // 原值为64改为1减轻内存压力在Windows 7的4GB内存限制下处理640x480的图片时批处理大小超过2就会导致内存溢出。这个改动会让检测速度下降但至少能跑起来。4. 实战测试当复古硬件遇见现代AI编译成功后那个300KB不到的darknet.exe就是我们的战利品。下载预训练的yolov3权重wget https://pjreddie.com/media/files/yolov3.weights测试命令需要特别处理./darknet.exe detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0.3在我的老i5上检测一张图片需要近20秒现代GPU只需0.1秒。几个提升体验的技巧使用-ext_output参数获取更详细的检测信息添加-dont_show跳过GUI显示直接保存结果对于视频处理先用FFmpeg拆分成帧图片序列性能对比表设备推理时间内存占用Win7i5-3320M18.7s1.2GBWin10RTX30600.09s3.8GB看着predictions.jpg里那只被正确框住的狗突然觉得这场耗时两天的考古行动值了——虽然慢得像在看幻灯片但至少证明了哪怕是最过时的硬件只要足够执着也能跑起现代AI模型。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2590560.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!