TensorFlow JS下MobileNet V2目标检测推理提速及模型选型咨询
推理耗时优化方案
一、解决execute()调用报错问题,直接降低推理耗时
你调用execute()报错是因为导出的模型包含动态形状算子,TFJS的同步execute()方法仅支持静态计算图,按以下步骤调整即可解决:
- 重新导出训练好的模型:用TFOD API导出SavedModel时添加参数
--input_shape=1,300,300,3(匹配你实际的输入尺寸),同时开启--fixed_shape_output参数,设置max_total_detections=100固定输出检测框的最大数量,把NMS等容易产生动态形状的层也转为静态结构 - 转TFJS格式时开启量化:添加参数
--quantize_uint8 "['input_layer', 'detection_boxes', 'detection_scores', 'detection_classes']"做UINT8全量化,速度优先的场景下精度损失可忽略,推理速度可提升30%~50%,转换后的静态图模型可直接调用execute()运行 - 若不想重新导出模型,可给
executeAsync()添加预热逻辑:页面加载完成后先用符合输入尺寸的空白图跑3~5次推理,完成算子编译缓存后,后续实际调用的耗时可降到和execute()接近的水平,不会出现偶发延迟峰值 - 全局配置优化:强制指定WebGL后端,调用
tf.setBackend('webgl')后确认后端生效,同时开启tf.enableProdMode()禁用TFJS调试校验逻辑,减少额外运行开销
二、网页端实时目标检测推荐模型
- YOLO系列轻量化版本:优先选YOLOv8n、YOLOv5n,转TFJS或ONNX Runtime Web格式运行,相同输入尺寸下精度高于MobileNet V2 SSD,推理速度快20%左右,官方导出的轻量化版本默认就是静态结构,直接支持
execute()调用,无动态算子问题 - MediaPipe目标检测模型:Google端侧优化的官方模型,针对WebGL、WebAssembly都做了专属算子优化,推理耗时最低可到30ms以内,完全满足实时要求,仅自定义训练门槛略高于TFOD API
- MobileNet V3 Small SSD:比你当前用的V2版本推理速度快15%左右,精度基本持平,同样支持TFOD API训练,导出静态图后即可转TFJS运行
三、其他可尝试的优化方向
- 降低模型输入尺寸:比如从300x300降到224x224,只要检测目标不是极小尺寸,精度损失很小,推理耗时可直接降低40%左右,收益非常明显
- 替换推理框架:将模型转为ONNX格式,用ONNX Runtime Web的WebGL或WebNN后端运行,同硬件下比TFJS推理速度快20%~30%,静态图支持更好,无动态算子报错问题
- 预处理逻辑优化:图像Resize、归一化等预处理操作直接用TFJS的tensor方法在GPU侧完成,不要用canvas把像素读到CPU处理,减少CPU-GPU数据拷贝开销,这部分最多可节省20~30ms耗时
内容的提问来源于stack exchange,提问作者user15840394
相关产品推荐
相关产品推荐

