yolov5部署+微信小程序前端展示

分为yolov5项目部署和微信小程序两部分,先介绍微信小程序前端展示+flask后端,之后介绍项目部署这部分。

一、先上效果图

  1. 点击选择图片,调用摄像头选择图片

yolov5部署+微信小程序前端展示

2.选择图片之后,点击开始检测,然后返回结果

yolov5部署+微信小程序前端展示

二、前端代码

wxml文件:

view class="container">
    <view>
      <image src="{{avatarUrl}}" class=".img" bindtap="imgClick"></image>
      <button bindtap="chooseimg" class=".btn_select">&#x9009;&#x62E9;&#x56FE;&#x7247;</button>
      <button form-type="submit" class=".btn_submit" bindtap="submitimg">&#x5F00;&#x59CB;&#x68C0;&#x6D4B;</button>
    </view>
    <view class="text-container">
      <view>{{name_and_nums}}</view>
      <view class="text" wx:for="{{names}}">{{item.name}}: {{item.value}} </view>
    </view>

js文件,分为两部分,一部分是调用摄像头,另一部分是图片检测

  1. 数据定义:
data: {
    avatarUrl: 'res.png',
    base64imgurl: null,
    name_num: '',
    names: [],
    name_and_nums: ''

  },
  1. 调用摄像头,使用微信小程序中的wx.chooseImage接口,并使用wx.setStorage接口对图片路径进行保存。代码:
chooseimg: function() {
    var that = this
    // &#x9009;&#x62E9;&#x56FE;&#x7247;
    wx.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'],
      success(res) {
        // tempFilePath&#x53EF;&#x4EE5;&#x4F5C;&#x4E3A; img &#x6807;&#x7B7E;&#x7684; src &#x5C5E;&#x6027;&#x663E;&#x793A;&#x56FE;&#x7247;
        var tempFilePaths = res.tempFilePaths
        console.log(tempFilePaths)
        that.setData({avatarUrl:tempFilePaths[0]})
        console.log(tempFilePaths[0])
    wx.setStorage({key:'img_path', data: tempFilePaths[0]})
}
  1. 先使用wx.getImageInfo获取上一步保存的图片格式(png/jpg等),然后调用wx.uploadFile接口,将图片上传到服务器,然后使用训练好的权重参数对图片进行检测,然后返回结果,因为返回的结果是一种图像流。为了在前端对图片进行展示,需要在图片编码前加字段:’data:image/png;base64’,将图片格式转换为base64格式。代码:
submitimg: function(){
    var img_path
    var that
    wx.getImageInfo({
          src: img_path,
          success(res){
          imgtype = res.type
          console.log(imgtype)
      }
    })
    wx.uploadFile({
          filePath: img_path,
          name: 'image',
          url: '&#x670D;&#x52A1;&#x5668;&#x5730;&#x5740;',
          // &#x4E0A;&#x4F20;&#x6210;&#x529F;&#xFF01;
          success(res){
            console.log(res)
            var img_data =  JSON.parse(res.data).data.image
            var base64str_img = 'data:image/' + imgtype + ';base64,' + img_data
            that.setData({avatarUrl: base64str_img})

          // &#x4E0A;&#x4F20;&#x5931;&#x8D25;
          fail(){
          console.log('--failed--')

          }
        })
      }
}

(PS:在前端定义了传入的数据名为image,所以,flask后端接收数据名也同样为image)

//&#x524D;&#x7AEF;&#xFF1A;

wx.uploadFile({
      filePath: img_path,
      name: 'image',
      url: &#x670D;&#x52A1;&#x5668;&#x5730;&#x5740;
})

//&#x540E;&#x7AEF;
img_file = request.files["image"]

三、后端代码

后端这里使用的是flask,这部分的使用相对比较简单

  1. 因为model返回的结果是一个list,里面有dict组成,主要就是框的左上角、右下角左边、类别以及类别名。之后对这个result进行处理,写一个画图的py文件,根据输入的图像和得到result画框,将画框后的结果保存到save_path中,然后再将图像格式进行转换为base64(返回的数据格式:(这里的img_res已经是经过画框之后的结果))

  2. 然后因为前端的要求,返回的形式需要用json格式,同时也需要将返回结果放在data里面,方便前端读取后端返回的数据。

@app.route(DETECTION_URL, methods=["POST"])
def predict():
    if request.method != "POST":
        return jsonify({"code": 2, "msg": "the request method is error!", "data": {"isSecret": "null"}})
    if request.files.get("image"):
        # &#x5C06;&#x8BFB;&#x53D6;&#x7684;&#x56FE;&#x7247;&#x6D41;&#x8F6C;&#x6362;&#x4E3A;&#x56FE;&#x7247;&#x683C;&#x5F0F;
        im_file = request.files["image"]
        im_bytes = im_file.read()
        im = Image.open(io.BytesIO(im_bytes))
        #&#x5C06;&#x56FE;&#x7247;&#x8F93;&#x5165;&#x5230;&#x6A21;&#x578B;&#x4E2D;&#xFF0C;&#x8F93;&#x51FA;&#x7684;&#x7ED3;&#x679C;&#x662F;&#x4E00;&#x4E2A;list&#xFF0C;&#x5E26;&#x6709;&#x5750;&#x6807;&#x7C7B;&#x522B;&#x7B49;&#x4FE1;&#x606F;
        results = model(im, size=640)  # reduce size=320 for faster inference
        # &#x9884;&#x6D4B;&#x7684;&#x7ED3;&#x679C;&#xFF08;&#x5750;&#x6807; &#x79CD;&#x7C7B; &#x7F6E;&#x4FE1;&#x5EA6;&#xFF09;
        result = results.pandas().xyxy[0].to_json(orient="records")

        img_res = ''
        with open(save_path, 'rb') as f:
            img_res = f.read()
            img_res = base64.b64encode(img_res)

        return jsonify({ "data": {"detect_res": "yes", "image": str(img_res, 'utf-8')}})

if __name__ == "__main__":
    torch.hub._validate_not_a_forked_repo = lambda a, b, c: True

    model = torch.hub.load("path", "custom", path="./best.pt", source="local", force_reload=False)  # force_reload to recache

最后!总结一下,之前刚开始要做的时候,感觉还挺难的,真的开始做的时候,感觉还行(虽然做的比较简单,页面也不是很好看,css一生之敌!!!)

之后,会学一下项目的部署,目前用的是别人部署好的,但是还是要自己学学的!!!

ps:为什么会写这个博客呢?因为在刚开始找资料的时候,找到一个博客,感觉和我的需求一样,于是就点进去看,结果是一个购买链接,还卖399!!!就这么个东西就399!!我表示很无语,就决定自己写好了之后一定要公开!!!如果大家有什么问题,可以留言,我们一起共同学习!!!

Original: https://blog.csdn.net/qq_44935078/article/details/126147175
Author: 头秃的和尚
Title: yolov5部署+微信小程序前端展示

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/672456/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球