在这篇文章中,将探讨如何将YOLOv5模型转换为TensorFlow Lite格式,并在Google Colab上进行测试。此外,还将讨论如何在边缘设备上优化模型性能。
首先,需要将模型转换为TensorFlow Lite格式。这可以通过使用一些尚未在官方Ultralytics仓库中公开的脚本来简化。将使用名为tf.py
的脚本,该脚本简化了从PyTorch到TFLite的转换过程。否则,需要遵循Ultralytics建议的方法,该方法涉及将PyTorch转换为ONNX,然后转换为TensorFlow,最后转换为TFLite。请注意,最后一步可能会失败,这非常令人沮丧。
要执行转换,请运行以下命令:
import tensorflow as tf
print(tf.__version__)
!PYTHONPATH=. python3 /content/yolov5/models/tf.py --weight /content/yolov5/runs/train/exp2/weights/best.pt --cfg models/yolov5s.yaml --img 416 --source /content/FaceMaskDataset/images/train
在传递权重文件路径(configuration.yaml
文件)时,需要指明模型接受的图像尺寸以及训练数据集的来源(最后一个参数是可选的)。脚本将使用TensorFlow 2.3.1将.pt权重转换为TensorFlow格式,输出将保存在/content/yolov5/runs/train/exp/weights
。
从角度来看,这一步有点繁琐,但有必要展示它是如何工作的。而不是运行之前的命令,运行以下行:
!pip install onnx>=1.7.0 # for ONNX export
!pip install coremltools==4.0 # for CoreML export
!python models/export.py --weights /content/yolov5/runs/train/exp2/weights/best.pt --img 416 --batch 1 # export at 640x640 with batch size 1
!pip install tensorflow-addons
!pip install onnx-tf
!pip install tensorflow==2.3.0
import tensorflow_addons as tfa
import onnx
from onnx_tf.backend import prepare
import tensorflow as tf
print(tf.__version__)
base_model = onnx.load('/content/yolov5/runs/train/exp2/weights/best.onnx')
to_tf = prepare(base_model)
to_tf.export_graph("/content/yolov5/runs/train/exp2/weights/customyolov5")
converter = tf.compat.v1.lite.TFLiteConverter.from_saved_model('/content/yolov5/runs/train/exp2/weights/customyolov5')
tflite_model = converter.convert() #just FYI: this step could go wrong and your notebook instance could crash.
现在是时候检查权重转换是否顺利了。在此之前,需要稍微修改detect.py
脚本并设置正确的类名。打开文件(/content/yolov5/detect.py
),在第157行找到names = [...]并将其更改为names = ['Face mask','No face mask']。保存并关闭文件。
如果一切顺利,应该能够加载并测试所获得的结果。运行以下行。它们将加载带有.tflite权重的YOLOv5模型,并在/test_images存储的图像上运行检测。
!python detect.py --weight /content/yolov5/runs/train/exp2/weights/best-fp16.tflite --img 416 --source ../test_images
YOLOv5的detect.py
脚本使用常规TensorFlow库来解释TensorFlow模型,包括TFLite格式的模型。在情况下,TensorFlow太重且资源需求过高,无法在小型设备上运行。如果想保持良好的检测性能,最好坚持使用TFLite及其解释器。基本上用它们的TFLite等效物替换了所有与TensorFlow相关的操作。此外,还进行了一些小的更改,使检测器能够在TPU/GPU上运行:复制了detect.py
文件,进行了修改,并将其保存为detect4pi.py
。可以在这里找到该文件。邀请比较这些文件,以完全理解所做的修改。
这一步是可选的,但建议进行。在这个简短的测试中,将向展示如何在最终部署到Pi之前,将计算机的网络摄像头输出输入到检测器。还将向展示如何在有和没有TFLite解释器的情况下测试模型。一旦获得了修改后的detect4pi.py
文件,请在本地计算机上创建一个名为Face Mask Detection的文件夹。
通过运行以下命令从任何CLI窗口获取最新的PyTorch版本及其依赖项:
pip3 install torch torchvision
从创建的目录启动Jupyter Notebook:打开CLI,导航到该文件夹,并发出jupyter notebook命令。一旦笔记本弹出,请运行以下单元格:
!pip install tensorflow==2.3.1
import torch
import tensorflow as tf
!git clone https://github.com/zldrobit/yolov5
%cd yolov5
!git checkout tf-android
print(tf.__version__)
!pip install -r requirements.txt
print('All set. Using PyTorch version %s with %s' % (torch.__version__, torch.cuda.get_device_properties(0) if torch.cuda.is_available() else 'CPU'))
在继续之前,请记住在detect.py文件的第157行修改names列表,并将所有下载的权重复制到YOLOv5文件夹内的/weights文件夹中。
要将YOLOv5模型与计算机的网络摄像头输入,运行以下命令在新的笔记本单元格中:
!python detect.py --weights weights/best.pt --img 416 --conf 0.4 --source 0 --classes 0 1
它将在单独的窗口中启动网络摄像头,识别脸部,并检测是否戴着口罩。这就是应该期待的:
如果想使用其TFLite权重测试模型,首先需要在机器上安装相应的解释器。如果使用的是linux x86_64:
pip3 install https://github.com/google-coral/pycoral/releases/download/release-frogfish/tflite_runtime-2.5.0-cp36-cp36m-linux_x86_64.whl
!python detect4pi.py --weights weights/best-fp16.tflite --img 416 --conf 0.45 --source 0 --classes 0 1