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
对save_model文件而言,`--weights`参数用于指定你下载好的模型权重文件;`--output`参数用于指定你当前转换的输出路径;`--input_size`模型训练时图像输入大小;`--model`哪个模型;`--framework`预期输出类型。此外,在保存模型的时候还可以用参数`--score_thres`来指定置信度阈值。
对convert_tflite文件而言,`--weights`参数是指定上一步保存好的checkpoint文件路径;`--quantize_mode`指定预期输出的tflite的数据类型;`--output`参数用于指定你当前转换的输出路径。
我的float36模型大小为:245M;int8模型为62M。<br />当输入图像大小为512时,在麒麟980上float36模型速度为2451ms;int8模型速度为1974ms,不过这个模型转换的时候未提供具有代表性的数据集,所以还未验证是否有什么影响。
<a name="eLIwC"></a>
## 二、部署到手机
该代码在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)路径下。然后需要修改以下三个文件,并保证它们的一致性:
1. android\app\src\main\java\org\tensorflow\lite\examples\detection路径下的**MainActivity.java**文件。
需要修改的内容在文件的第71行至79行,包含图像大小,tflite模型是否被量化,模型位置以及对应的标签位置。具体如下:
```python
public static final int TF_OD_API_INPUT_SIZE = 416;
private static final boolean TF_OD_API_IS_QUANTIZED = false;
private static final String TF_OD_API_MODEL_FILE = "yolov4-416-fp32.tflite";
private static final String TF_OD_API_LABELS_FILE = "file:///android_asset/coco.txt";
- android\app\src\main\java\org\tensorflow\lite\examples\detection路径下的DetectorActivity.java文件。
需要修改的内容在文件的第55行至59行【没有写错/写重!!!】,包含图像大小,tflite模型是否被量化,模型位置以及对应的标签位置。具体如下:
private static final int TF_OD_API_INPUT_SIZE = 416;
private static final boolean TF_OD_API_IS_QUANTIZED = false;
private static final String TF_OD_API_MODEL_FILE = "yolov4-416-fp32.tflite";
private static final String TF_OD_API_LABELS_FILE = "file:///android_asset/coco.txt";
- android-yolov4-3\app\src\main\java\org\tensorflow\lite\examples\detection\tflite路径下的YoloV4Classifier.java文件。
需要修改的内容有多处,首先是第164行的图像大小。
private static final int INPUT_SIZE = 416;
然后是178至181行的是否使用GPU进行预测,以及是否使用tiny模型的配置文件。
private static boolean isGPU = true;
// tiny or not
private static boolean isTiny = false;
最后根据你在部署YOLOv4模型(isTiny = false
)是是否报错,根据报错信息确定是否需要将185行的输出大小从{10647, 10647}改为{16128, 16128}。
// private static final int[] OUTPUT_WIDTH_FULL = new int[]{10647, 10647};
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)
相关问题链接:
- https://github.com/hunglc007/tensorflow-yolov4-tflite/issues/46
- https://github.com/hunglc007/tensorflow-yolov4-tflite/issues/126
问题定位:
- 模型选择,模型输入大小是否正确
- 模型类别文件是否修改(因为模型输出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
其他值得参考学习的问题链接:
- run yolov4 tflite-int8。https://github.com/hunglc007/tensorflow-yolov4-tflite/issues/214
- Fixed int8 quantization and added experimental mixed int8/int16 quantization。https://github.com/hunglc007/tensorflow-yolov4-tflite/pull/228