上周帮朋友看一个垃圾分类的小程序,他要在一张1080p的照片里认出塑料瓶和纸盒。我问他打算用什么模型,他说先搜一下图像识别算法有哪些。这个问题其实分三层:分类、检测、分割,选错层比选错模型更麻烦。

只判断整张图是什么:分类网络

1998年的LeNet-5认手写数字,2012年AlexNet把ImageNet错误率从26%拉到15.3%,之后VGG16用3x3小卷积堆到16层,ResNet-50用残差连接解决深层退化。现在落地优先看MobileNetV3和EfficientNet-B0,前者在骁龙865上单帧十几毫秒,适合手机端。

要框出位置:目标检测

  • YOLO系列:YOLOv8n权重只有6MB,COCO mAP在37左右,导出ONNX后纯CPU也能跑。
  • Faster R-CNN:两阶段结构,精度高但慢,适合离线批量标注。
  • SSD:多尺度特征图直接回归,轻量,小目标表现差。

要像素级轮廓:语义与实例分割

医学影像常用U-Net,靠跳跃连接把浅层纹理送回解码器;Mask R-CNN在Faster R-CNN上加了mask分支,能区分同类里的不同个体;DeepLabv3+用空洞卷积扩大感受野,适合街景。要实时就看YOLOv8-seg。

不深度学习也能做的事

样本只有几百张时,HOG加SVM做人形检测、SIFT做特征匹配,往往比硬训网络稳。拿到图先做灰度、直方图均衡、高斯去噪,再谈模型。传统方法可解释,调参也快。

2024年之后的变量

ViT把图切成16x16的patch当token,数据量够时效果超过CNN;CLIP这类图文对齐模型能零样本分类,输入一句中文描述就能分桶。代价是显存,ViT-B/16推理至少要2GB。

判断标准很简单:输出一个标签就选分类,需要坐标就选检测,需要轮廓才上分割。数据少于一千张先做增强和迁移学习,别一上来就训ViT。