最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微信小程序前端如何調(diào)用python后端的模型詳解

 更新時(shí)間:2022年04月21日 11:17:55   作者:慢慢來的小邵  
近期需要開發(fā)一個(gè)打分的微信小程序,涉及到與后臺(tái)服務(wù)器的數(shù)據(jù)交互,這篇文章主要給大家介紹了關(guān)于微信小程序前端如何調(diào)用python后端模型的相關(guān)資料,需要的朋友可以參考下

需求:

小程序端拍照調(diào)用python訓(xùn)練好的圖片分類模型。實(shí)現(xiàn)圖片分類識(shí)別的功能。

微信小程序端:

重點(diǎn)在chooseImage函數(shù)中,根據(jù)圖片路徑獲取到圖片傳遞給flask的url;

Page({
    data: {
        SHOW_TOP: true,
        canRecordStart: false,
    },
    data: {
        tempFilePaths:'',
        sourceType: ['camera', 'album']
      },
    isSpeaking: false,
    accessToken: "",
    onLoad: function (options) {
        
        console.log("onLoad!");
        this.setHeader();
        var that=this
        wx.showShareMenu({
            withShareTicket: true //要求小程序返回分享目標(biāo)信息
        });
        var isShowed = wx.getStorageSync("tip");
        if (isShowed != 1) {
            setTimeout(() => {
                this.setData({
                    SHOW_TOP: false
                })
                wx.setStorageSync("tip", 1)
            }, 3 * 1000)
        } else {
            this.setData({
                SHOW_TOP: false
            })
        };
    },
    },
    
 //頭像點(diǎn)擊處理事件,使用wx.showActionSheet()調(diào)用菜單欄
 buttonclick: function () {
    const that = this
    wx.showActionSheet({
      itemList: ['拍照', '相冊(cè)'],
      itemColor: '',
      //成功時(shí)回調(diào)
      success: function (res) {
        if (!res.cancel) {
          /*
           res.tapIndex返回用戶點(diǎn)擊的按鈕序號(hào),從上到下的順序,從0開始
           比如用戶點(diǎn)擊本例中的拍照就返回0,相冊(cè)就返回1
           我們r(jià)es.tapIndex的值傳給chooseImage()
          */
          that.chooseImage(res.tapIndex)
        }
      },
      
setHeader(){
    const tempFilePaths = wx.getStorageSync('tempFilePaths');
    if (tempFilePaths) {
      this.setData({
        tempFilePaths: tempFilePaths
      })
    } else {
      this.setData({
        tempFilePaths: '/images/camera.png'
      })
    }
  },

  chooseImage(tapIndex) {
    const checkeddata = true
    const that = this
    wx.chooseImage({
    //count表示一次可以選擇多少照片
      count: 1,
      //sizeType所選的圖片的尺寸,original原圖,compressed壓縮圖
      sizeType: ['original', 'compressed'],
      //如果sourceType為camera則調(diào)用攝像頭,為album時(shí)調(diào)用相冊(cè)
      sourceType: [that.data.sourceType[tapIndex]],
      success(res) {
        // tempFilePath可以作為img標(biāo)簽的src屬性顯示圖片
        console.log(res);
        const tempFilePaths = res.tempFilePaths
        //將選擇到的圖片緩存到本地storage中
        wx.setStorageSync('tempFilePaths', tempFilePaths)
        /*
		由于在我們選擇圖片后圖片只是保存到storage中,所以我們需要調(diào)用一次   	        setHeader()方法來使頁面上的頭像更新
		*/
        that.setHeader();
        // wx.showToast({
        //   title: '設(shè)置成功',
        //   icon: 'none',
        // //   duration: 2000
        // })
        wx.showLoading({
            title: '識(shí)別中...',
        })
        
        var team_image = wx.getFileSystemManager().readFileSync(res.tempFilePaths[0], "base64")
        wx.request({
          url: 'http://127.0.0.1:5000/upload', //API地址,upload是我給路由起的名字,參照下面的python代碼
                     method: "POST",
          header: {
                     'content-type': "application/x-www-form-urlencoded",
                    },
          data: {image: team_image},//將數(shù)據(jù)傳給后端
     
        success: function (res) {
            console.log(res.data);  //控制臺(tái)輸出返回?cái)?shù)據(jù)  
            wx.hideLoading()
            wx.showModal({

                title: '識(shí)別結(jié)果', 
                confirmText: "識(shí)別正確",
                cancelText:"識(shí)別錯(cuò)誤",
                content: res.data, 
                success: function(res) { 
                if (res.confirm) {
                console.log('識(shí)別正確')
                } else if (res.cancel) {
                console.log('重新識(shí)別')
                }
                }
                })     
          }
        })
      }
    })
  },
});

flask端:

將圖片裁剪,填充,調(diào)用自己訓(xùn)練保存最優(yōu)的模型,用softmax處理結(jié)果矩陣,最后得到預(yù)測(cè)種類

# coding=utf-8
from flask import Flask, render_template, request, jsonify
from werkzeug.utils import secure_filename
from datetime import timedelta
from flask import Flask, render_template, request
import torchvision.transforms as transforms
from PIL import Image
from torchvision import models
import os
import torch
import json
import numpy as np
import torch.nn as nn
import matplotlib.pyplot as plt
import base64

app = Flask(__name__)

def softmax(x):
    exp_x = np.exp(x)
    softmax_x = exp_x / np.sum(exp_x, 0)
    return softmax_x

with open('dir_label.txt', 'r', encoding='utf-8') as f:
    labels = f.readlines()
    print("oldlabels:",labels)
    labels = list(map(lambda x: x.strip().split('\t'), labels))
    print("newlabels:",labels)

def padding_black(img):
    w, h = img.size

    scale = 224. / max(w, h)
    img_fg = img.resize([int(x) for x in [w * scale, h * scale]])

    size_fg = img_fg.size
    size_bg = 224

    img_bg = Image.new("RGB", (size_bg, size_bg))

    img_bg.paste(img_fg, ((size_bg - size_fg[0]) // 2,
                              (size_bg - size_fg[1]) // 2))

    img = img_bg
    return img
# 輸出
@app.route('/')
def hello_world():
    return 'Hello World!'

# 設(shè)置允許的文件格式
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'bmp'])
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

# 設(shè)置靜態(tài)文件緩存過期時(shí)間
app.send_file_max_age_default = timedelta(seconds=1)

# 添加路由
@app.route('/upload', methods=['POST', 'GET'])
def upload():
    if request.method == 'POST':
        # 通過file標(biāo)簽獲取文件
        team_image = base64.b64decode(request.form.get("image"))  # 隊(duì)base64進(jìn)行解碼還原。
        with open("static/111111.jpg", "wb") as f:
            f.write(team_image)
        image = Image.open("static/111111.jpg")
        # image = Image.open('laji.jpg')
        image = image.convert('RGB')
        image = padding_black(image)
        transform1 = transforms.Compose([
            transforms.Resize(224),
            transforms.ToTensor(),
        ])
        image = transform1(image)
        image = image.unsqueeze(0)
        # image = torch.unsqueeze(image, dim=0).float()
        print(image.shape)
        model = models.resnet50(pretrained=False)
        fc_inputs = model.fc.in_features
        model.fc = nn.Linear(fc_inputs, 214)
        # model = model.cuda()
        # 加載訓(xùn)練好的模型
        checkpoint = torch.load('model_best_checkpoint_resnet50.pth.tar')
        model.load_state_dict(checkpoint['state_dict'])
        model.eval()

        src = image.numpy()
        src = src.reshape(3, 224, 224)
        src = np.transpose(src, (1, 2, 0))
        # image = image.cuda()
        # label = label.cuda()
        pred = model(image)
        pred = pred.data.cpu().numpy()[0]

        score = softmax(pred)
        pred_id = np.argmax(score)

        plt.imshow(src)
        print('預(yù)測(cè)結(jié)果:', labels[pred_id][0])
        # return labels[pred_id][0];
        return json.dumps(labels[pred_id][0], ensure_ascii=False)//將預(yù)測(cè)結(jié)果傳回給前端
        # plt.show()
    #     return render_template('upload_ok.html')
    #     重新返回上傳界面
    # return render_template('upload.html')

if __name__ == '__main__':
    app.run(debug=False)

大致的效果:

但是在手機(jī)上測(cè)試的話,wx.request{}里的url的域名不規(guī)范,不能出現(xiàn)這種端口號(hào),目前還在想解決辦法,有知道的大佬還望告知。

總結(jié)

到此這篇關(guān)于微信小程序前端如何調(diào)用python后端模型的文章就介紹到這了,更多相關(guān)小程序調(diào)用python后端模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python自動(dòng)化運(yùn)維之Telnetlib的具體使用

    python自動(dòng)化運(yùn)維之Telnetlib的具體使用

    本文將結(jié)合實(shí)例代碼,介紹python自動(dòng)化運(yùn)維之Telnetlib的具體使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Python讀取HTML中的canvas并且以圖片形式存入Word文檔

    Python讀取HTML中的canvas并且以圖片形式存入Word文檔

    這篇文章主要介紹了Python讀取HTML中的canvas并且以圖片形式存入Word文檔,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • python使用NumPy文件的讀寫操作

    python使用NumPy文件的讀寫操作

    這篇文章主要介紹了python使用NumPy讀寫文本文件。想了解第三方庫文件操作的同學(xué),來看一下吧
    2021-04-04
  • Python同時(shí)處理多個(gè)異常的方法

    Python同時(shí)處理多個(gè)異常的方法

    這篇文章主要介紹了Python同時(shí)處理多個(gè)異常的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Django序列化中SerializerMethodField的使用詳解

    Django序列化中SerializerMethodField的使用詳解

    這篇文章主要介紹了Django序列化中SerializerMethodField的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • django框架使用方法詳解

    django框架使用方法詳解

    這篇文章主要介紹了django框架使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 圖文詳解Django使用Pycharm連接MySQL數(shù)據(jù)庫

    圖文詳解Django使用Pycharm連接MySQL數(shù)據(jù)庫

    這篇文章主要介紹了Django使用Pycharm連接MySQL數(shù)據(jù)庫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python實(shí)現(xiàn)網(wǎng)站用戶名密碼自動(dòng)登錄功能

    python實(shí)現(xiàn)網(wǎng)站用戶名密碼自動(dòng)登錄功能

    最近接到這樣的需求通過網(wǎng)頁用戶認(rèn)證登錄實(shí)現(xiàn)上網(wǎng),如何實(shí)現(xiàn)網(wǎng)站自動(dòng)登錄功能呢,接下來小編給大家?guī)砹藀ython實(shí)現(xiàn)網(wǎng)站用戶名密碼自動(dòng)登錄功能,需要的朋友可以參考下
    2019-08-08
  • python讀取.mat文件及將變量存為.mat文件的詳細(xì)介紹

    python讀取.mat文件及將變量存為.mat文件的詳細(xì)介紹

    這篇文章主要給大家介紹了關(guān)于python讀取.mat文件及將變量存為.mat文件的詳細(xì)介紹,?mat文件是matlab的數(shù)據(jù)存儲(chǔ)的標(biāo)準(zhǔn)格式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • pandas combine_first函數(shù)處理兩個(gè)數(shù)據(jù)集重疊和缺失

    pandas combine_first函數(shù)處理兩個(gè)數(shù)據(jù)集重疊和缺失

    combine_first是pandas中的一個(gè)函數(shù),它可以將兩個(gè)DataFrame對(duì)象按照索引進(jìn)行合并,用一個(gè)對(duì)象中的非空值填充另一個(gè)對(duì)象中的空值,這個(gè)函數(shù)非常適合處理兩個(gè)數(shù)據(jù)集有部分重疊和缺失的情況,可以實(shí)現(xiàn)數(shù)據(jù)的補(bǔ)全和更新,本文介紹combine_first函數(shù)的語法及一些案例應(yīng)用
    2024-01-01

最新評(píng)論

南雄市| 宝坻区| 通城县| 宣化县| 尼玛县| 日照市| 马鞍山市| 曲周县| 繁峙县| 台北县| 旅游| 安平县| 内乡县| 都昌县| 鹤山市| 松阳县| 中超| 通化县| 沂源县| 龙游县| 南江县| 南澳县| 兴隆县| 普定县| 本溪市| 镇安县| 永福县| 微山县| 会昌县| 柞水县| 永康市| 乐至县| 晋城| 大埔县| 禄劝| 永定县| 葵青区| 邹城市| 葫芦岛市| 根河市| 平阴县|