YOLOv4转tflite代码:https://github.com/hunglc007/tensorflow-yolov4-tflite/

一、模型转换

  • 先用命令pip install -r requirement.txt安装相关的依赖项。

  • 再利用以下命令进行tflite的转换和测试。转换分为两部分:1、将weight文件保存为checkpoint;2、将checkpoint文件转化为tflite。 ```python Convert to tflite

    Save tf model for tflite converting

    python save_model.py —weights ./data/yolov4.weights —output ./checkpoints/yolov4-416 —input_size 416 —model yolov4 —framework tflite

yolov4

python convert_tflite.py —weights ./checkpoints/yolov4-416 —output ./checkpoints/yolov4-416.tflite

yolov4 quantize float16

python convert_tflite.py —weights ./checkpoints/yolov4-416 —output ./checkpoints/yolov4-416-fp16.tflite —quantize_mode float16

yolov4 quantize int8

python convert_tflite.py —weights ./checkpoints/yolov4-416 —output ./checkpoints/yolov4-416-int8.tflite —quantize_mode int8 —dataset ./coco_dataset/coco/val207.txt

Run demo tflite model

python detect.py —weights ./checkpoints/yolov4-416.tflite —size 416 —model yolov4 —image ./data/kite.jpg —framework tflite

  1. save_model文件而言,`--weights`参数用于指定你下载好的模型权重文件;`--output`参数用于指定你当前转换的输出路径;`--input_size`模型训练时图像输入大小;`--model`哪个模型;`--framework`预期输出类型。此外,在保存模型的时候还可以用参数`--score_thres`来指定置信度阈值。
  2. convert_tflite文件而言,`--weights`参数是指定上一步保存好的checkpoint文件路径;`--quantize_mode`指定预期输出的tflite的数据类型;`--output`参数用于指定你当前转换的输出路径。
  3. 我的float36模型大小为:245Mint8模型为62M。<br />当输入图像大小为512时,在麒麟980float36模型速度为2451msint8模型速度为1974ms,不过这个模型转换的时候未提供具有代表性的数据集,所以还未验证是否有什么影响。
  4. <a name="eLIwC"></a>
  5. ## 二、部署到手机
  6. 该代码在master文件下的Android目录中提供了一个[Android工程](https://github.com/hunglc007/tensorflow-yolov4-tflite/tree/master/android),将你转化好的tflite和对应的labelmap文件放到[android/app/src/main/assets](https://github.com/hunglc007/tensorflow-yolov4-tflite/tree/master/android/app/src/main/assets)路径下。然后需要修改以下三个文件,并保证它们的一致性:
  7. 1. android\app\src\main\java\org\tensorflow\lite\examples\detection路径下的**MainActivity.java**文件。
  8. 需要修改的内容在文件的第71行至79行,包含图像大小,tflite模型是否被量化,模型位置以及对应的标签位置。具体如下:
  9. ```python
  10. public static final int TF_OD_API_INPUT_SIZE = 416;
  11. private static final boolean TF_OD_API_IS_QUANTIZED = false;
  12. private static final String TF_OD_API_MODEL_FILE = "yolov4-416-fp32.tflite";
  13. private static final String TF_OD_API_LABELS_FILE = "file:///android_asset/coco.txt";
  1. android\app\src\main\java\org\tensorflow\lite\examples\detection路径下的DetectorActivity.java文件。

需要修改的内容在文件的第55行至59行【没有写错/写重!!!】,包含图像大小,tflite模型是否被量化,模型位置以及对应的标签位置。具体如下:

  1. private static final int TF_OD_API_INPUT_SIZE = 416;
  2. private static final boolean TF_OD_API_IS_QUANTIZED = false;
  3. private static final String TF_OD_API_MODEL_FILE = "yolov4-416-fp32.tflite";
  4. private static final String TF_OD_API_LABELS_FILE = "file:///android_asset/coco.txt";
  1. android-yolov4-3\app\src\main\java\org\tensorflow\lite\examples\detection\tflite路径下的YoloV4Classifier.java文件。

需要修改的内容有多处,首先是第164行的图像大小。

  1. private static final int INPUT_SIZE = 416;

然后是178至181行的是否使用GPU进行预测,以及是否使用tiny模型的配置文件。

  1. private static boolean isGPU = true;
  2. // tiny or not
  3. private static boolean isTiny = false;

最后根据你在部署YOLOv4模型(isTiny = false)是是否报错,根据报错信息确定是否需要将185行的输出大小从{10647, 10647}改为{16128, 16128}。

  1. // private static final int[] OUTPUT_WIDTH_FULL = new int[]{10647, 10647};
  2. private static final int[] OUTPUT_WIDTH_FULL = new int[]{16128, 16128};

建议:先用该代码和官方提供的weight文件进行YOLOv4到tflite的转换和部署,如果出现问题查看这三个文件中上面的参数是否和预期一致,确认无误后应该可以部署成功。最后就可以尝试自定义模型的转换部署了,祝成功呀~

三、常见问题

1、训练自定义数据集后模型转换数据shape不匹配
报错:ValueError: cannot reshape array of size 4559937 into shape (1024,512,3,3)
相关问题链接

问题定位:

  • 模型选择,模型输入大小是否正确
  • 模型类别文件是否修改(因为模型输出shape和类别有关)。这里需要在config文件中的第14行进行修改__C.YOLO.CLASSES="./data/classes/coco.names"。将coco.names改为自定义模型训练时用到的类别文件。

2、YOLOv4-int8量化失败
相关问题链接:

问题定位:

  • 提供的数据不存在或格式有误。我把convert_tflite文件的第43行(representative_data_gen)注释掉之后代码也可以正常运行。不过具体不清楚是否会产生不良影响。

3、【代码提交记录】关于yolov4-tflite与YOLOv4-tiny不同的参数配置参考。
https://github.com/hunglc007/tensorflow-yolov4-tflite/commit/087052f323212a405c4a90dd555c81de04923c11

其他值得参考学习的问题链接:

  1. run yolov4 tflite-int8。https://github.com/hunglc007/tensorflow-yolov4-tflite/issues/214
  2. Fixed int8 quantization and added experimental mixed int8/int16 quantization。https://github.com/hunglc007/tensorflow-yolov4-tflite/pull/228