使用PyInstaller打包含Mediapipe的Python程序,如何缩减最终体积?
缩减图像特征提取应用打包体积的方案及Mediapipe替代库
一、缩减Mediapipe打包体积的方法
- 精准导入模块:别直接import整个mediapipe,只导入实际用到的组件,避免打包工具把Mediapipe里的手势、人脸检测等无关模块也打包进去。把代码里的导入语句改成:
from mediapipe.tasks import BaseOptions from mediapipe.tasks.vision import ImageEmbedder, ImageEmbedderOptions, VisionRunningMode from mediapipe import Image
优化PyInstaller打包参数:用PyInstaller打包时,添加这些参数压缩体积:
--exclude-module:手动排除Mediapipe里完全用不上的子模块,比如mediapipe.solutions.face_mesh、mediapipe.solutions.hands等--optimize=2:优化字节码,减少冗余代码- 若是GUI应用,加
--noconsole去掉控制台窗口,同时用--onefile生成单文件(注意单文件启动速度稍慢,但分发更方便)
手动裁剪Mediapipe依赖:找到Mediapipe的安装目录,删除里面的无关模型文件、未使用的跨平台二进制库,再打包。这个方法要谨慎,删之前务必测试功能是否正常。
二、Mediapipe的替代库
TFLite Runtime(最推荐)
直接用官方的tflite-runtime库,手动实现模型推理和余弦相似度计算,完全避开Mediapipe的冗余依赖,打包后体积能大幅降低。示例代码如下:
import tflite_runtime.interpreter as tflite import numpy as np from pathlib import Path from PIL import Image model_path = Path(r"assets\models\1.tflite") class Embedder(): def __init__(self, model_path=model_path): self.interpreter = tflite.Interpreter(model_path=str(model_path)) self.interpreter.allocate_tensors() self.input_details = self.interpreter.get_input_details() self.output_details = self.interpreter.get_output_details() def preprocess_image(self, numpy_image): # 根据你的tflite模型要求做预处理,比如resize、归一化,这里是示例 input_shape = self.input_details[0]['shape'] processed_img = np.array(Image.fromarray(numpy_image).resize((input_shape[1], input_shape[2]))).astype(np.float32) processed_img = processed_img / 255.0 # 模型若需归一化则保留,否则删除 return np.expand_dims(processed_img, axis=0) def create_embed_from_np(self, numpy_image): processed = self.preprocess_image(numpy_image) self.interpreter.set_tensor(self.input_details[0]['index'], processed) self.interpreter.invoke() return self.interpreter.get_tensor(self.output_details[0]['index']).flatten() def create_embed_from_path(self, image_path): img = Image.open(image_path).convert('RGB') numpy_image = np.array(img) return self.create_embed_from_np(numpy_image) def cosine_similarity(self, embed_1, embed_2): dot_product = np.dot(embed_1, embed_2) norm_1 = np.linalg.norm(embed_1) norm_2 = np.linalg.norm(embed_2) return dot_product / (norm_1 * norm_2)
只需安装tflite-runtime和Pillow,两个库的体积加起来不到20MB。
ONNX Runtime
如果能把你的tflite模型转换成ONNX格式,用onnxruntime加载推理,体积同样很小,性能表现优异,适合跨平台场景。
OpenCV DNN
如果项目已经依赖OpenCV,直接用它的DNN模块加载tflite模型,不需要额外增加太多体积,能省掉单独安装推理库的步骤。
内容的提问来源于stack exchange,提问作者Felipe Vegini
相关产品推荐
相关产品推荐

