最近做毕设使用到yolov5,该模型为ultralytics公司的一个开源产品,由Glenn大佬实现,有很多合作的开发者参与了该项目,开发迭代速度非常快,三天两头就有更新。为了实现一个完整的毕业设计流程,就需要实现YOLOv5模型的训练、验证到最终的落地,也就是部署。
训练相对简单,只需要跟着官方教程即可,根据特定数据集进行预处理并训练链接
官方的转化代码的转化方式为PyTorch > ONNX > CoreML > TFLite,最后从原始训练得到的pt模型文件转化为mlmodel、onnx和torchscript.pt
不过要想从这三种模型进行二次转化为**.tflite**可不容易,博主尝试过很多种方法,但最终无果,也不是走投无路,就是转累了。。。
那时我开始思考,官方明明白白地写了是PyTorch > ONNX > CoreML > TFLite,为什么最后没有.tflite模型文件呢,难不成上当了?其实没有,大佬zldrobit已经写出了转化代码,其pull request链接,该仓库的代码根据YOLOv5的发展也在改进,唯一不同的是增加了tflite转化的代码
博主在colab平台进行如下操作,具体使用方法如下:
!git clone https://github.com/zldrobit/yolov5.git
%cd yolov5
!git checkout tf-android # 或者tf-only-export
!pip install -r requirements.txt
!pip install tensorflow==2.4.0
!python models/tf.py --weights weights/yolov5s.pt --cfg models/yolov5s.yaml --img 320
这样就能得到fp16的.tflite模型,若需要Int8的,则用如下命令
!python models/tf.py --weight weights/yolov5s.pt --cfg models/yolov5s.yaml --img 320 --tfl-int8 --source 你的数据集路径 --ncalib 图像数量
转化为int8的需要数据集来进行验证,所以需要添加自己数据集的路径,图像数量为你所用的用于验证的图像数。
转化完成后有如下结果:
从转化的方式可以看出,其实不仅仅是转化了,还进行了量化,fp16和int8都是量化的结果。其实就是将模型文件中存储的权重参数从Float32转化为fp16或Int8类型,减少计算压力;.pt文件格式转化为.tflite格式,以便Android应用调用。
量化公式贴一贴:
不过大家没有太多精力也不用去细究,用就对了~
从模型转化到部署大体流程如下:
其实最开始这个tflite转化的代码是有bug的,导致部署后识别失败,大家感受一下。。。
识别一堆乱七八糟的,剩我独自风中凌乱。。当时为了找到问题,苦苦思索和debug,最终找到了问题。不过不久后原作者就把bug修复了。
打开后Android Studio会自动下载需要的依赖,如果想用虚拟机仿真一下,自己选择虚拟机机型
最后部署检测的效果如下
若需要使用其他的模型如MobileNet进行识别,可以参考博主的一个仓库,当然也只是换汤不换药而已,只要有数据集,想识别什么都可以