从零到一:YOLOv3 Darknet环境搭建与自定义数据集训练全流程实战
1. 环境准备从零搭建Darknet开发环境第一次接触YOLOv3和Darknet时我被各种依赖项搞得焦头烂额。后来发现只要按步骤操作其实环境搭建就像组装乐高积木一样简单。我们先从最基础的Linux系统开始推荐使用Ubuntu 18.04或20.04版本这两个版本对CUDA的支持最稳定。1.1 安装基础依赖打开终端先来一波全家桶安装sudo apt update sudo apt install -y build-essential git make cmake libopencv-dev python3-dev python3-pip这些包包含了编译器、Git版本控制、OpenCV库等基础组件。我遇到过因为漏装python3-dev导致后续编译失败的情况所以建议一次性装全。1.2 GPU环境配置可选但推荐如果你有NVIDIA显卡千万别浪费它的算力。先安装驱动和CUDAsudo apt install -y nvidia-driver-470 sudo apt install -y cuda-11-3安装完成后用nvidia-smi命令检查是否识别到显卡。记得把CUDA路径加入环境变量echo export PATH/usr/local/cuda/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc2. Darknet框架编译与测试2.1 获取Darknet源码直接从官方仓库克隆最新代码git clone https://github.com/pjreddie/darknet.git cd darknet这里有个小技巧如果网络不稳定可以在GitHub上打包下载后解压效果一样。2.2 编译配置调整打开Makefile进行关键配置GPU1 # 启用GPU加速 CUDNN1 # 启用cuDNN加速 OPENCV1 # 启用OpenCV支持如果你的显卡支持Tensor Core还可以加上CUDNN_HALF1来启用半精度计算。保存后执行编译make -j$(nproc)编译成功的标志是生成darknet可执行文件。我第一次编译时因为CUDA路径没配好卡了半小时所以前面环境配置一定要仔细。2.3 验证安装下载预训练权重做个快速测试wget https://pjreddie.com/media/files/yolov3.weights ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg看到终端输出检测结果并且生成predictions.jpg就说明成功了。如果使用OpenCV编译可以直接弹出结果窗口。3. 自定义数据集全流程实战3.1 数据标注技巧推荐使用labelImg进行标注pip install labelImg labelImg标注时要注意保持标签命名一致建议全小写无空格边界框要完全包裹目标但不要留太多空隙遮挡目标根据可见部分标注我标注过一个工业零件数据集发现标注质量直接影响最终mAP建议多人标注后交叉检查。3.2 数据格式转换Darknet需要YOLO格式的txt标注文件每个文件对应一张图片格式为class_id x_center y_center width height可以使用这个Python脚本批量转换VOC格式import xml.etree.ElementTree as ET import os def convert(size, box): dw 1./size[0] dh 1./size[1] x (box[0] box[1])/2.0 y (box[2] box[3])/2.0 w box[1] - box[0] h box[3] - box[2] x x*dw w w*dw y y*dh h h*dh return (x,y,w,h)3.3 配置文件调整主要修改三个文件cfg/yolov3.cfg调整网络参数[net] batch64 subdivisions16 width608 height608 ... [yolo] classes10 # 你的类别数 filters45 # 3*(classes5)data/obj.names写入你的类别名称data/obj.data配置数据路径classes 10 train train.txt valid test.txt names data/obj.names backup backup/4. 模型训练与调优4.1 启动训练命令使用迁移学习可以大幅缩短训练时间./darknet detector train data/obj.data cfg/yolov3.cfg darknet53.conv.74训练过程中会实时显示损失曲线我通常观察以下指标Avg IOU建议保持在0.6以上Class分类准确率Obj目标检测率4.2 训练技巧分享学习率调整初始0.001后期可降到0.0001数据增强适当增加角度、曝光度变化早停策略当验证集mAP连续3个epoch不提升时停止遇到显存不足时可以减小batch_size或增大subdivisions。我曾经在GTX 1080上成功训练过batch_size32的模型。4.3 模型评估使用官方脚本计算mAP./darknet detector map data/obj.data cfg/yolov3.cfg backup/yolov3_final.weights对于工业场景还需要关注误检率False Positive漏检率False Negative不同尺寸目标的检测效果5. 模型部署与应用训练完成后可以这样使用模型# 单张图片检测 ./darknet detector test data/obj.data cfg/yolov3.cfg backup/yolov3_final.weights test.jpg # 视频流检测 ./darknet detector demo data/obj.data cfg/yolov3.cfg backup/yolov3_final.weights -c 0对于嵌入式设备部署建议转换为TensorRT格式提升推理速度。我在Jetson Xavier上实现了30FPS的实时检测。6. 常见问题解决Q训练出现NaN损失怎么办A尝试降低学习率检查数据标注是否有错误Q检测时置信度很低A可能训练不足增加训练轮数或调整cfg文件中的obj_thresholdQ如何提升小目标检测效果A减小输入分辨率或使用更高分辨率的特征图记得定期保存权重文件我曾经因为服务器宕机损失过8小时的训练进度。现在习惯每1000次迭代保存一次中间结果。