纯纯小白,3月导师叫我去搞个小程序的部署,算法才入门,前端后端毛也不懂的我勇敢冲冲!

其实我对模型部署的理解非常模糊,并不清楚它具体在干什么。然后通过一些网络学习,大概理一下思路: 先把模型训练好以后,通过优化转化模型、使用推理引擎两步对模型进行infer 。推理引擎:已知pytorch框架自带引擎pytorch-mobile,还有专用于移动端推理部署的引擎ncnn(不支持pytorch模型所以需要中间过渡转化)。

不过,在后续实践中上述引擎我 啥也没用 ...

反正最后呢,我最终花一周时间实现了将pytorch模型在主机跑通,然后通过python的Web应用框架 Flask 提供后端服务—— 在局域网下 ,接收小程序发来的图片与用户选择的参数,调用模型进行推理,得到处理后的图片,再反馈给小程序端。

1、域名注册、备案、绑定公网ip

嗯..由于我只需要做个花架子小程序,能试跑展示效果即可,不用面向大众开放,所以这一步我并没有干。

2、flask

python web开发框架,用于实现主功能,接收小程序请求,调用模型infer,返回输出结果。

具体实现方式:

将存放模型的主机在局域网下的IP地址+固定端口号5000(当然也可以是其他)作为访问入口,供其他IP访问通信,并定义路由规则,使得其他用户通过对“ http://IP地址:5000/model ”发送网络请求时,调用对应的model函数。

@app.route('/model', methods=['POST', 'GET'])
def model():
    if request.method == 'POST':
        edit_attr = request.form.get("attr")  # 从网络请求输入中获取参数
        print("input edit_attr:", edit_attr)
        # 从网络请求输入中获取base64编码后进行传输的图片
        team_image = base64.b64decode(request.form.get("image"))  
        # 将图片存在代码同目录下的static文件夹中,存为11111.jpg
        with open("static/111111.jpg", "wb") as f:
            f.write(team_image)
        # 调用我的数据对齐模型
        align_111111()
        # 调用我的图像处理模型
        run_infer()
        edit.main(editattr)
        img_local_path ='static/edit/222.jpg'
        # 将处理结束存在static中的222.jpg图片先base64编码再转为字符串
        with open(img_local_path, 'rb') as f:
            img_stream = f.read()
            img_stream = str(base64.b64encode(img_stream))
        # 将要返回小程序的数据存进列表中
        info = {'result' : 'successfully edited!', 'editimg' : img_stream}
    else:
    info = {'result' : 'failed!'}
    # 数据返回小程序
    return json.dumps(info, ensure_ascii=False)

1、小程序注册

微信公众平台

在这里可以按照网页指示一步步注册好个人的微笑小程序账号。

2、微信开发工具下载

稳定版 Stable Build 更新日志 | 微信开放文档

在这里可以下载工具软件,图标和界面如图所示:

 那个二维码就是用微信账户登陆一下开发者工具而已,不要扫哦(虽然应该没人这么无聊吧hh

微信学堂 | 微信开放社区

在这里可以找到小程序开发的网课,入门很简单。

一些基础注意点:

(1)注释方法/** **/或者ctrl+/

(2)文件名不要用中文

简要介绍一下根目录下的结构:

    ├── app.js     # 小程序的逻辑文件

    ├── app.json   # 小程序的配置文件

    ├── app.wxss   # 全局公共样式文件

    ├── pages      # 存放小程序的各个页面,可以有很多个类似index的文件夹

    │   ├── index  # index页面,一般新建小程序已经作为第一页而存在,也可以任意改名字

    │   │   ├── index.js     # 页面逻辑,执行一些动态的修改、数据的初始化

    │   │   ├── index.json

    │   │   ├── index.wxml   # 页面结构,设置页面内容

    │   │   └── index.wxss   # 页面样式表,对内容格式进行设置

    ├── project.config.json

    └── utils

    └── image    # 自建文件夹,可以存放一些页面所需要的图标、图片等

我主要在app.json、index.js、index.wxml、index.wxss文件中改代码——

app.json对主页面逻辑进行设计(比如首页显示什么、底部菜单栏...);

index的所有文件就是服务于index这么一个页面的:wxss文件仅仅用来修改格式(比如颜色、居中、间隔...),wxml文件用来放内容组件(比如文字、图片、按键..),js文件用来搞各种花样经(页面切换,按键后调用什么功能...)。

这些设计就取决于你对小程序的功能预期了,每个人搞得都不太一样,就不提了。

4、向url发起请求

小程序向之前说的http://IP地址:5000/model发送网络请求,传送用户上传的图片和用户选择的参数,是通过调用各种官方API完成的:

# 小程序从相机/相册读入图片
wx.chooseImage({
    count: 1,
    sizeType: ['original', 'compressed']
    sourceType: [that.data.sourceType[sourc]],
    success(res) {
        const tempFilePaths = res.tempFilePaths
        wx.setStorageSync('tempFilePaths', tempFilePaths)
        wx.showLoading({title: '处理中...',})
        var img_manager =wx.getFileSystemManager()
        # 将图片进行base64编码
        var img_base64 =img_manager.readFileSync(tempFilePaths[0], "base64")
        # 发送网络请求
        wx.request({
            url: 'http://IP地址:5000/model', 
            method: "POST",
            header: {'content-type': "application/x-www-form-urlencoded",},
            # 传入图片和之前选择好的参数
            data: {image: img_base64,
                   attr: that.data.attrsele},
            success: function (res) {
                console.log(res.data.result);
                # 对服务端base64编码、字符串化的图像数据进行处理
                var base64Data = res.data.editimg.split("'")
                let editimgurl ='data:image/jpg;base64,'+ base64Data[1]
                wx.hideLoading()
                # 得到结果图后,带着图像参数传入跳转页面至result页面
                wx.navigateTo({
               		url:'/pages/result/result?image='          +tempFilePaths[0]+'&editimgurl='+editimgurl
				
Threepio Threepio使在机器学习框架(例如PyTorch,Tensorflow.js和Tensorflow Python)之间转换命令变得非常简单。 它充当和的核心组件。 该库提供的一些改变生活的功能包括: :robot: 相同名称的命令之间的自动双向翻译add , abs等。 :brain: 自动翻译的命令之间的智能参数映射 :repeat_button: 库之间的单词级翻译 :wrench: 自定义命令翻译 :herb: 一对多命令翻译 :high_voltage: 张量方法的翻译(进行中) :magnifying_glass_tilted_left: 支持自动命令翻译中的模糊匹配(正在进行中) :card_index_dividers: 支持自动翻译中的框架版本控制(正在进行中) :male_sign:‍:male_sign: 支持自动参数类型转换(tensorflow张量-> pytorch张量) (正在进行中) Threepio由两个主要组件组成: :spider: -这将生成我们对Threepio的大部分自动翻译 :snake: -这
基于pyTorch的python接口训练的模型,一般会针对部署环境进行模型的转换。而深度学习模型的使用环境,一般会分成以python web服务的方式进行部署、以c++调用深度学习模型或针对移动式设备进行部署。 2 以python web服务的形式进行部署 在https://blog.csdn.net/cdknight_happy/article/details/100015592中,用docker + supervisor + nginx + gunicorn + flask的方式部署了深度学习
这篇文章演示如何将训练好的pytorch模型部署到安卓设备上。我也是刚开始学安卓,代码写的简单。环境:pytorch版本:1.10.0pytorch_android支持的模型是.pt模型,我们训练出来的模型是.pth。所以需要转化才可以用。先看官网上给的转化方式: 这个模型在安卓对应的包: 注:pytorch_android_lite版本和转化模型用的版本要一致,不一致就会报各种错误。目前用这种方法有点问题,我采用的另一种方法。转化代码如下: 对应的包: 定义模型文件和转化后的文件路径。load模型。这里要
最近在写Policy gradient算法,发现网上众多实现中都是都是基于tensoflow,突然出现了pytorch版本的,代码很是简短,不禁被之吸引,故准备安装一个试试。 问题:官网不能点击 这里的选项不能点击,F12查看发现,有一些js资源是来自twitter,也就是ajax以及js... Caffe+Ubunt14.04+Cuda7.0+Opencv3.0+MKL+Matlab2014a安装 https://blog.csdn.net/ice_moyan/article/details/47066757 虽然Caffe在视频识别领域是一个流行的深度学...
最近想要把训练好的Pytorch模型在Android端上部署,发现如果将直接训练好的模型直接运用到Android上会出现闪退的情况,所以需要将转模型进行转换。 查找了很多博客,都不能直接解决我的问题,所以经过一天的试错,终于把模型转换搞好了。 将Pytorch模型部署到Android端 pytorch官方教程 import torch import torchvision from torch.utils.mobile_optimizer import optimize_for_mobile
前言:在深度学习的时候,能够很好的绘制出整个网络的模型图,这是非常方便的,当前流行的tensorflow和pytorch都有很多种方法可以绘制模型结构图,特在此总结如下: tensorflow的模型结构可视化方法: (1)使用自带的tensorboard(不直观) (2)使用netron工具打开(.pd 或者是.meta文件) (3)第三方库CNNGraph(https://g...
开始沐神的《动手深度学习》pytorch 的学习 ,这边作为学习笔记的记录 当做自我监督 环境的搭建 这边就不记录了 实验室 以及自己的笔记本 配置的是GPU版本的 不过笔记本不用的还是CPU版本为主 1. 创建 import torch 同numpy创建Ndarray基本一致 x1 = torch.tensor([[3,3,3],[4,4,4]]) x2 = torch.rand(3,5) #0-1 随机 x3 = torch.zeros((3,3),dtype=tor
1. PyTorch的概念 PyTorch是一个机遇Python的库,用来提供一个具有灵活性的深度学习开发平台,其工作流程非常接近Python的科学计算库——numpy。 选择PyTorch的原因有以下几点: ① 易于使用的API:就像Python一样简单。 ② Python的支持:PyTorch可以顺利地与Python数据科学栈集成,它非常类似于numpy,甚至注意不到它们的差别。 要将PyTorch模型部署到Android设备上,可以使用以下步骤: 1. 将PyTorch模型转换为ONNX格式。可以使用PyTorch官方提供的torch.onnx模块将模型转换为ONNX格式。 2. 使用ONNX Runtime for Android将ONNX模型部署到Android设备上。可以使用ONNX Runtime for Android提供的Java API将模型加载到Android应用程序中。 3. 在Android应用程序中使用模型进行推理。可以使用Java API调用模型进行推理,并将结果返回给应用程序。 需要注意的是,在将模型部署到Android设备上之前,需要确保模型的大小和计算量适合在移动设备上运行。可以使用模型压缩和量化等技术来减小模型的大小和计算量。 ### 回答2: PyTorch是一个开源的Python机器学习库,它为深度学习提供了强大的支持。PyTorch模型可以在计算机上进行训练和调试,但当我们需要将模型部署到移动设备(如Android)上时,我们需要将PyTorch模型转换并集成到移动应用程序中,这需要一系列的步骤。 首先,我们需要将PyTorch模型转换为TorchScript格式,这是一种在移动设备上运行的地图。使用TorchScript脚本将PyTorch模型序列化为可运行的形式,它可以在没有Python运行时进行部署。我们可以使用以下代码将PyTorch模型转换为TorchScript格式: import torch import torchvision # load the PyTorch model model = torchvision.models.resnet18(pretrained=True) # set the model to evaluation mode model.eval() # trace the model to generate a TorchScript traced_model = torch.jit.trace(model, torch.randn(1, 3, 224, 224)) 上面的代码将一个预训练的ResNet模型转换为TorchScript格式,现在我们可以将其保存到文件中以备以后使用: traced_model.save('resnet18_model.pt') 接下来,我们需要将TorchScript模型集成到Android应用程序中。我们可以使用Android Studio提供的Android Neural Networks API(NNAPI)来加速我们的深度学习推理。NNAPI是一个Google开发的Android框架,它提供了一些API,可以加速计算机视觉和自然语言处理应用程序中的神经网络推理。我们可以在Gradle文件中添加以下代码,以添加NNAPI支持: dependencies { implementation 'org.pytorch:pytorch_android:1.7.0' implementation 'org.pytorch:pytorch_android_torchvision:1.7.0' 然后将TorchScript模型文件复制到Android项目中的`assets`文件夹中。 最后,我们需要编写代码将TorchScript模型加载到我们的应用程序中,并使用它来进行推理。下面是一个简单的Android应用程序,可以使用加载的TorchScript模型对图像进行分类: ```java import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.widget.ImageView; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import org.pytorch.IValue; import org.pytorch.Module; import org.pytorch.Tensor; public class MainActivity extends AppCompatActivity { private TextView mResultTextView; private ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mResultTextView = findViewById(R.id.result_text_view); mImageView = findViewById(R.id.image_view); // Load the TorchScript model from the assets folder Module module = Module.load(assetFilePath(this, "resnet18_model.pt")); // Load the image and convert it to a PyTorch Tensor Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.test_image); float[] mean = new float[]{0.485f, 0.456f, 0.406f}; float[] std = new float[]{0.229f, 0.224f, 0.225f}; Tensor inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap, mean, std); // Run the input through the model IValue outputTensor = module.forward(IValue.from(inputTensor)); // Get the predicted class index from the output Tensor float[] scores = outputTensor.toTensor().getDataAsFloatArray(); int predictedIndex = -1; float maxScore = 0.0f; for (int i = 0; i < scores.length; i++) { if (scores[i] > maxScore) { predictedIndex = i; maxScore = scores[i]; // Display the result String[] classNames = {"cat", "dog", "fish", "horse", "spider"}; mResultTextView.setText("Prediction: " + classNames[predictedIndex]); mImageView.setImageBitmap(bitmap); public static String assetFilePath(Context context, String assetName) { File file = new File(context.getFilesDir(), assetName); try (InputStream is = context.getAssets().open(assetName)) { try (OutputStream os = new FileOutputStream(file)) { byte[] buffer = new byte[4 * 1024]; int read; while ((read = is.read(buffer)) != -1) { os.write(buffer, 0, read); os.flush(); return file.getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); return null; 上面的代码将载入从`assets`文件夹中加载的TorchScript模型,为它准备好图像数据,并将其运行给模型模型返回一个输出张量,我们得到预测的类别。 总之,将PyTorch模型部署到Android可以通过转换为TorchScript格式,集成到Android应用程序中,以及编写可以使用它进行推理的代码来实现。厂商和第三方可用工具也可以帮助简化部署过程。 ### 回答3: 在让PyTorch模型部署到Android设备之前,你需要确保你的模型可用且现在运行良好。这涉及到以下步骤: 1. 在PyTorch中定义并训练模型 首先在PyTorch中定义并训练模型。你需要训练一个模型,这个模型可以处理你希望在移动设备上使用的数据。你需要确保在训练模型时,使用了适当的数据预处理和清理过程。然后,导出模型以便在Android设备上使用。 2. 将PyTorch模型转换为TorchScript格式 将训练好的PyTorch模型转化成TorchScript格式,这是 PyTorch模型导出方面提供的一种功能强大的框架。你可以使用 torch.jit.load() 函数来加载 TorchScript 模型,并在移动设备上使用它。你可以使用torchscript_builder.py 脚本来转换 PyTorch 模型,这个脚本也可以根据你的需要在运行时执行转换。 3. 集成模型到Android应用中: Android应用可以使用自己的Java代码,但也可以使用C++接口以及原生代码。所以,集成模型到 Android 应用可以使用两种方式: Java 接口和 C++ 接口。 3.1 Java 接口 Java 接口可以用于创建用 Java 编写的 Android 应用程序。以下是使用 Java 接口加载 TorchScript 模型的步骤: - 创建一个 Android 应用程序项目。 - 在 Android Studio 中安装 PyTorch 的 Gradle 插件。 - 将 torch-android 库和 pytorch_android 库添加到项目中的 build.gradle 文件中。 - 在代码中使用 TorchScript 加载模型,并使用该程序的 Android 功能来运行。 3.2 C++ 接口 使用 C++ 接口可以创建用 C++ 编写的 Android 应用程序。以下是使用 C++ 接口加载 TorchScript 模型的步骤: - 创建一个 Android 应用程序项目。 - 编写 C++ 代码来加载 TorchScript 模型。 - 在 Android Studio 中创建一个 Android.mk 文件和 Application.mk 文件。 - 将 C++ 代码编译成共享库,然后将共享库打包到 Android 应用程序 APK 文件中。 - 在代码中使用 TorchScript 加载模型,并调用 C++ 程序的 Android 功能来运行。 以上是部署 PyTorch 模型到 Android 设备的步骤和过程。在集成模型到 Android 应用中时,需要注意处理异常和各种错误,确保模型可以在 Android 设备上成功加载。