You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:42:17