YOLO学习总结
这两天学习了一下YOLO,也就是You Only Look Once。学习这个模型的原因是GitHub上有一个激光打蚊子的项目,有不少的Star数目,就是用的这个模型。这个项目已经好多年没有更新了,使用的还是 YOLO v4 模型。
这个模型是快速的视频实时目标识别的模型,发展至今已经历了很多代。YOLOv4模型使用的是CNN框架,也就是卷积神经网络,基于一个叫做Darknet的神经网络实现。这个版本的模型还有比较多问题,第一,它是有锚框的,也就是Anchor-based,主要是增加了很多运算量,然后无法实时处理特别长或者扁的物体,另外就是只能进行目标识别,不能做其他的工作。第二是建立了NMS非极大值抑制的后处理方式,不要在一个物体上圈好多个框。
在后面的版本 V8 11,26这些版本中都增加了更多的功能,并且从C++转向了PyTorch,维护者也变成了ultralytics。首先就是取消了锚框,变成了无锚框的方式,其次除了目标识别,还增加了图片分类/实例分割(就是把目标抠图出来而不是只画个框)。其次还有多目标检测/姿态检测等。
YOLO26这是一个轻量化的版本,还取消了NMS,进一步降低运算量,使其可以在嵌入式设备上或者说是运算能力比较差的设备上运行。
YOLO模型有不同的规模,从小到大有nano/small/medium/large/extra large。 其中nano只有几兆大,extra large也不到300M,经过FP16或者INT8量化还能进一步降低体积和运算量。
YOLO模型的原始格式是.pt(pytorch),可以导出为不同的格式,最重要的是onnx,这个格式支持openCV中的dnn(深度神经网络)来调取,也支持在浏览器中/ios/android/react native/flutter中调取。最重要的一个项目是微软的https://github.com/microsoft/onnxruntime 跨平台项目,对多端调用提供了可能。
还支持tflite格式,是谷歌tensorflow的一种格式,官方维护了 https://github.com/tensorflow/tfjs 这个js库,支持node和浏览器等环境调用。在安卓手机上由特别的性能优化。
其他巨头也有自己的格式,如英伟达GPU上有TensorRT (.engine 或 .trt)格式,苹果手机上有CoreML (.mlpackage 或 .mlmodel) 格式,Intel有OpenVINO (_openvino_model/),国产的瑞芯微也有rknn格式。
介绍下原始训练的模型格式,最重要的是pytorch保存的pt模型,以及pytorch延伸框架(如 PyTorch Lightning)的ckpt(checkpoint)模型。 这两种模型除了权重数据还打包了python代码,所以被认为是不安全的,后来huggingface等社区就推出了只有权重数据的safesensor模型,并且做了内存映射,加载更快。