1. 从零开始搭建船舶检测环境第一次接触YOLOv3和TensorFlow/Keras时我花了两周时间才把环境搭好。现在回想起来其实只要掌握几个关键点半小时就能搞定。先说说我的硬件配置一台搭载RTX 2080 Ti的台式机32GB内存。不过别担心就算你用笔记本的GTX 1060也能跑起来只是训练速度会慢些。必备软件清单Python 3.6千万别用3.7会有各种兼容性问题CUDA 9.0 cuDNN 7.0这是TensorFlow 1.12.0的黄金搭档TensorFlow-gpu 1.12.0Keras-gpu 2.2.4安装时最容易踩坑的是CUDA版本。我有次装了CUDA 10.0结果训练时疯狂报错。后来发现TensorFlow 1.x对CUDA版本极其敏感必须严格匹配。建议用conda创建虚拟环境conda create -n ship_detection python3.6 conda install tensorflow-gpu1.12.0 keras-gpu2.2.4数据集方面SeaShips绝对是船舶检测的标杆数据集。它包含6类船舶货轮、邮轮等的3000张标注图片每张都有精确的bounding box。下载后建议按7:2:1的比例划分训练集、验证集和测试集。我试过其他划分方式发现这个比例在防止过拟合方面表现最好。2. 数据预处理实战技巧原始数据就像未经雕琢的玉石处理得当才能发挥最大价值。我的预处理流程分为四步第一步标注格式转换SeaShips默认是PASCAL VOC格式但YOLOv3需要特定的txt格式。每个txt文件对应一张图片内容格式为类别索引 x_center y_center width height这些坐标都是相对图片宽高的归一化值0-1之间。用这个Python脚本可以快速转换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)第二步数据增强策略船舶检测有个特点——目标通常只占画面的10%-30%。为此我设计了特殊的数据增强组合随机水平翻转概率0.5色彩抖动HSV空间调整幅度±30%随机裁剪保留至少60%的船舶区域这个组合使mAP提升了约7个百分点。注意不要用旋转增强船舶在真实场景中很少出现倒置情况。3. YOLOv3模型调优全记录拿到baseline模型后我进行了三轮优化第一轮锚框(anchor)优化默认的9个anchor是基于COCO数据集设计的对船舶检测并不友好。用k-means重新聚类后得到更适合船舶形状的新anchor10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326修改yolov3.cfg中的anchors参数后召回率从82%提升到89%。第二轮损失函数改进原版的YOLOv3使用简单的MSE损失我替换为Focal Loss来解决正负样本不平衡问题def focal_loss(y_true, y_pred): gamma 2.0 alpha 0.25 pt tf.where(tf.equal(y_true, 1), y_pred, 1 - y_pred) return -alpha * tf.pow(1. - pt, gamma) * tf.log(pt)第三轮训练策略调整采用分阶段训练法冻结darknet53层用1e-3学习率训练50轮解冻全部层用1e-4学习率微调100轮最后用1e-5学习率精调20轮配合ReduceLROnPlateau回调当验证loss停滞时自动降低学习率。最终在测试集上达到95.66%的mAP。4. 模型轻量化与部署实战在港口实际部署时发现原版YOLOv3的检测速度只有15FPS无法满足实时需求。于是进行了三步优化第一步通道剪枝通过分析卷积核的L1范数移除了30%的冗余通道。具体操作pruning_params { pruning_schedule: sparsity.PolynomialDecay( initial_sparsity0.30, final_sparsity0.70, begin_step2000, end_step8000) }第二步量化训练采用TensorFlow的量化感知训练(QAT)将模型从FP32转为INT8converter tf.lite.TFLiteConverter.from_keras_model(model) converter.optimizations [tf.lite.Optimize.DEFAULT] tflite_quant_model converter.convert()体积缩小4倍速度提升2.3倍。第三步TensorRT加速在Jetson Xavier上部署时使用TensorRT进一步优化trtexec --onnxyolov3.onnx --fp16 --batch8 --saveEngineyolov3.engine最终在1080p视频上达到45FPS的实时检测速度满足港口监控需求。