MAhaitao999 / mtcnn-align-facenet-deployment

本项目是利用mtcnn网络和facenet网络实现了一个简单的人脸识别功能。整体流程大致如下:首先利用mtcnn网络进行人脸检测和人脸关键点(5个)提取;接着利用人脸关键点进行人脸校正(仿射变换);然后将校正之后的人脸图片送入facenet网络进行人脸特征(128维)提取;最后将提取到的人脸特征与底库中的人脸特征进行相似度计算(特征比对),完成人脸识别功能。
30 stars 4 forks source link

关于keras2onnx和onnx2engine的一些问题 #1

Closed xavier-xiadia closed 3 years ago

xavier-xiadia commented 3 years ago

你好,非常感谢您所做的工作,在过程中遇到了一些问题,请教: 运行keras_onnx.py环境: tensorflow-gpu==1.13.1 keras==2.1.5 遇到问题 Traceback (most recent call last): File "keras_onnx.py", line 319, in rnet_onnx_model = keras2onnx.convert_keras(rnet, rnet.name) File "/usr/local/lib/python3.6/dist-packages/keras2onnx/main.py", line 95, in convert_keras return convert_topology(topology, name, doc_string, target_opset, channel_first_inputs) File "/usr/local/lib/python3.6/dist-packages/keras2onnx/topology.py", line 243, in convert_topology get_converter(operator.type)(scope, operator, container) File "/usr/local/lib/python3.6/dist-packages/keras2onnx/ke2onnx/main.py", line 96, in convert_keras_flatten if iop.data_format == 'channels_last' or shape_len < 3: AttributeError: 'Flatten' object has no attribute 'data_format' keras.layers.core.Flatten里面没有data_format,我就直接把判断是不是channels_last默认为channels_last,想先跑通

然后在onnx2engine中: 环境 tensorrt7 cuda 11 trtexec --explicitBatch --workspace=512 --onnx=pnet.onnx --minShapes=input_1:1x12x12x3 --optShapes=input_1:4x400x400x3 --maxShapes=input_1:8x1280x1280x3 --shapes=input_1:8x400x400x3 --saveEngine=pnet.engine 出现: 02/25/2021-07:12:18] [E] [TRT] conv1: image size is smaller than filter size

由于pnet里面没有flatten的问题,所以初步推测这个问题应该跟我改flatten无关,但是不知道作者是否遇到过这个问题,还望指教

MAhaitao999 commented 3 years ago

第一个问题:请确认一下你的版本是否和我的一致,我记得当时tensoflow2.0转换是有问题的。 第二个问题:pnet网络的输入w和h是动态的,但是请确保--minShapes的大小是合理的。第一个卷积是3x3的,因此长和宽至少不应该小于3,我猜测是否是你的onnx转出来通道顺序有问题,它把第一个通道的1当成了H了?你可以把你的pnet.onnx模型上传我看一下。

xavier-xiadia commented 3 years ago

嗯嗯,这边不是很清楚您的版本是什么,我的是tensorflow-gpu==1.13.1,keras==2.1.5。 pnet的onnx文件,我上传到链接: https://pan.baidu.com/s/1URHcITx13vIh7H4zrAq8dA 密码: muq1,辛苦了

MAhaitao999 commented 3 years ago

嗯嗯,这边不是很清楚您的版本是什么,我的是tensorflow-gpu==1.13.1,keras==2.1.5。 pnet的onnx文件,我上传到链接: https://pan.baidu.com/s/1URHcITx13vIh7H4zrAq8dA 密码: muq1,辛苦了

`>>> import tensorflow as tf

tf.version '1.14.0' import keras Using TensorFlow backend. keras.version '2.2.5' import onnx onnx.version '1.8.1' import keras2onnx keras2onnx.version '1.7.0' `

MAhaitao999 commented 3 years ago

嗯嗯,这边不是很清楚您的版本是什么,我的是tensorflow-gpu==1.13.1,keras==2.1.5。 pnet的onnx文件,我上传到链接: https://pan.baidu.com/s/1URHcITx13vIh7H4zrAq8dA 密码: muq1,辛苦了

1 2

图1是我转出的onnx模型,图2是你的onnx模型,比较一下prelu算子有点差别,你的每个prlu算子前后都需要Transpose操作。slope参数我的是4维的[1, 10, 1, 1],而你的是3维的[1, 1, 10]。我的onnx opset_version=12,你的是11,所以本质原因应该是onnx不同版本对op的实现有所差异。我的tensorrt选用的是官方20.12镜像,对应的应该是7.2.1版本。