YOLO模型作为单阶段目标检测方法的代表,其已经应用在多个领域。
模型缩减
但要想将其部署到单片机上,其模型的大小需要受到极大的限制,而采用剪枝的方式模型体积下降效果有限,因此我们直接修改网络结构,将其进行删减,如下:
# Parameters
nc: 2 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo12n-obb.yaml' will call yolo12-obb.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.25, 0.25, 256] # summary: 287 layers, 2,673,955 parameters, 2,673,939 gradients, 6.9 GFLOPs
# YOLO12n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 0
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 2, C3k2, [256, False, 0.25]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
# YOLO12n head
head:
- [-1, 1, Conv, [256, 3, 2]]
- [[4], 1, OBB, [nc, 1]] # Detect(P3, P4, P5)
这是原来的模型结果:
这是简化后的模型的结果:
尽管从精度角度来看,其检测效果下降了许多(大概30%),但其模型大小也由原本的32MB下降到了700KB,这等程度的模型体积下降幅度还是深得我心的,毕竟我的这个项目场景对精度的要求并没有很高。
格式转换为TFLite
我们将模型进行缩减后,得到了pt
文件,随后我们需要将其进行量化,同时转换为tflite
格式,这里需要注意的是,我们的模型要部署到STM32
单片机上,我在部署时,发现Flash
足够了,但RAM
却一直溢出,这是内存不足,即模型在运行推理时的产生了很多特征图,这超出了内存限制,这里采用将图像大小缩减的方式进行推理,由原本的640
转换为160
,随后再进行烧录,就OK了
from ultralytics import YOLO
# 加载一个模型,路径为 YOLO 模型的 .pt 文件
model = YOLO(r"best.pt")
# 导出模型,设置多种参数
model.export(
imgsz=160,
format="tflite",
int8=True,
batch=1,
)