水果识别系统作为计算机视觉领域的经典应用场景,近年来随着深度学习技术的普及,已经从实验室走向实际生产环境。我在本科毕业设计阶段选择这个课题,主要基于三点考量:首先,水果识别在智慧农业、自动分拣、零售结算等领域有明确的应用场景;其次,YOLO、ResNet等成熟模型的开源让算法实现门槛大幅降低;最重要的是,这个项目能完整覆盖数据采集、模型训练、部署优化的全流程,对理解深度学习项目生命周期极具教学价值。
传统的水果识别主要依赖颜色、形状等手工特征,准确率很难突破85%。而基于卷积神经网络(CNN)的方法,在测试集上轻松达到95%+的识别率。这个毕业设计最吸引我的地方在于,它完美展现了深度学习如何解决传统方法难以处理的复杂模式识别问题——比如区分不同品种的苹果,或是识别被部分遮挡的水果。
我对比了三种主流的深度学习架构:
最终选择YOLOv5s作为基础模型,主要考虑:
高质量数据集是项目成功的关键。我采用"自采+开源"的混合方案:
标注工具选用LabelImg,注意三个细节:
bash复制# 基于Python 3.8的环境
conda create -n fruit_det python=3.8
conda activate fruit_det
pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
注意:PyTorch版本必须与CUDA驱动匹配,否则会出现难以排查的显存错误
在yolov5s.yaml中调整以下参数:
yaml复制nc: 6 # 类别数
depth_multiple: 0.33 # 模型深度系数
width_multiple: 0.50 # 层宽度系数
anchors:
- [10,13, 16,30, 33,23] # 小目标anchor
- [30,61, 62,45, 59,119] # 中目标
- [116,90, 156,198, 373,326] # 大目标
训练命令示例:
bash复制python train.py --img 640 --batch 16 --epochs 100 --data fruit.yaml --cfg yolov5s.yaml --weights yolov5s.pt --cache
在data/hyps/hyp.fruit.yaml中配置:
yaml复制hsv_h: 0.015 # 色相增强幅度
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 明度增强
degrees: 15.0 # 旋转角度范围
translate: 0.1 # 平移比例
scale: 0.5 # 缩放比例
shear: 5.0 # 剪切幅度
特别针对水果的特性:
使用TorchPruner进行通道剪枝:
python复制from torchpruner import SparsePruner
pruner = SparsePruner(model, sparsity=0.3)
pruner.step()
pruned_model = pruner.prune()
实测可使模型体积减小40%,推理速度提升25%,而mAP仅下降2个百分点。
将模型转为TensorRT格式:
bash复制python export.py --weights runs/train/exp/weights/best.pt --include engine --device 0 --half
关键参数:
--half: FP16量化--dynamic: 支持动态输入尺寸--simplify: 应用ONNX简化器在Jetson Nano上测试,量化后推理速度从8FPS提升到22FPS。
当某些水果样本不足时(如草莓只有200张,而苹果有800张),可采用:
python复制class_loss_weight = torch.tensor([1.0, 0.8, 1.2, 1.5, 2.0, 0.9])
criterion = nn.CrossEntropyLoss(weight=class_loss_weight)
针对金属托盘反光造成的假阳性:
python复制def polarize_filter(img):
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
v_channel = hsv[:,:,2]
_, mask = cv2.threshold(v_channel, 240, 255, cv2.THRESH_BINARY)
return cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
在测试集上达到以下指标:
实际演示中发现两个典型错误案例:
后续优化思路:
这个项目让我深刻体会到,工业级AI应用不仅需要好的算法,更需要领域知识的深度融合。比如识别苹果时,果梗朝向其实可以作为品种判断的辅助特征——这是纯技术文档不会告诉你的实战经验。