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

news2024/11/19 23:38:10

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

一、先上效果图

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

 

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

 ​​​​​​​

 

 二、前端代码

wxml文件:

view class="container">
    <view>
      <image src="{{avatarUrl}}" class=".img" bindtap="imgClick"></image>
      <button bindtap="chooseimg" class=".btn_select">选择图片</button>
      <button form-type="submit" class=".btn_submit" bindtap="submitimg">开始检测</button>
    </view>
    <view class="text-container">
      <view>{{name_and_nums}}</view>
      <view class="text" wx:for="{{names}}">{{item.name}}: {{item.value}} </view>
    </view>
  </view>

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

1. 数据定义:

data: {
    avatarUrl: 'res.png',
    base64imgurl: null,
    name_num: '',
    names: [],
    name_and_nums: ''

  },

2. 调用摄像头,使用微信小程序中的wx.chooseImage接口,并使用wx.setStorage接口对图片路径进行保存。代码:

chooseimg: function() {
    var that = this
    // 选择图片
    wx.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'],
      success(res) {
        // tempFilePath可以作为 img 标签的 src 属性显示图片
        var tempFilePaths = res.tempFilePaths
        console.log(tempFilePaths)
        that.setData({avatarUrl:tempFilePaths[0]})
        console.log(tempFilePaths[0])
    wx.setStorage({key:'img_path', data: tempFilePaths[0]})
}

3. 先使用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: '服务器地址',
          // 上传成功!
          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})
            
          // 上传失败
          fail(){
          console.log('--failed--')
    
          }
        })
      }
}

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

//前端:

wx.uploadFile({
      filePath: img_path,
      name: 'image',
      url: 服务器地址
})

//后端
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"):
        # 将读取的图片流转换为图片格式
        im_file = request.files["image"]
        im_bytes = im_file.read()
        im = Image.open(io.BytesIO(im_bytes))
        #将图片输入到模型中,输出的结果是一个list,带有坐标类别等信息
        results = model(im, size=640)  # reduce size=320 for faster inference
        # 预测的结果(坐标 种类 置信度)
        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!!我表示很无语,就决定自己写好了之后一定要公开!!!如果大家有什么问题,可以留言,我们一起共同学习!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTF----Web真零基础入门

目录 前置知识导图&#xff1a; ​TCP/IP体系结构&#xff08;IP和端口&#xff09;&#xff1a; IP是什么&#xff1a;是计算机在互联网上的唯一标识&#xff08;坐标&#xff0c;代号&#xff09;&#xff0c;用于在互联网中寻找计算机。 内网&#xff08;局域网&#xf…

JSONP解决跨域问题

一、什么是同源 概念&#xff1a;如果两个页面的协议、域名和端口都相同&#xff0c;则这两个页面具有相同的源。 二、什么是同源策略 概念&#xff1a;是浏览器提供的一个安全功能。 三、什么是跨域 概念&#xff1a;同源指的是两个URL的协议、域名、端口号一致&#xff0c…

前端开发调式必备技能F12开发者工具之Elements(元素)面板,详细图解带流程【第一部分】

目录 一、进入浏览器开发工具的几种方式 二、Elements&#xff08;元素&#xff09;面板 左侧区域 右侧区域 计算样式 事件监听器 大家好&#xff01;我是爷爷的茶七里香&#xff0c;这个名字有没有让你想起周董的歌捏&#xff1f;好了&#xff0c;废话不多说&#xff0c;开始今…

项目实训记录(十二)——el-table-column根据条件修改字体颜色

目录 一、干了什么&#xff1f; 二、问题和解决方法 1. el-table-column根据条件修改字体颜色 2.问题 总结 一、干了什么&#xff1f; 本周要完成数据去重工作和前端的完善。 清理工作 主要是来删除用户插入的重复数据。由管理员决定表是否允许重复数据。如果用户上传的表不允…

vue3 自定义全局loading组件 (PC和移动端都非常适用)

前言 在开发的过程中&#xff0c;点击提交按钮&#xff0c;或者是一些其它场景总会遇到loading加载框&#xff0c;PC的一些ui库也没有这样的加载框&#xff0c;无法满足业务需求&#xff0c;因此可以自己自定义一个&#xff0c;实现过程如下。 效果图&#xff08;loading样式…

个人博客小程序

文章目录1.前言2.首页博客数据展示3.用data中的数据渲染博客展示4.使用云数据库创建集合blogs5.读取数据库中的数据6.创建添加博客页面1.前言 这篇文章详细的介绍了个人博客小程序的云开发流程&#xff0c;包括博客展示页面&#xff0c;添加博客页面的创建&#xff0c;以及云函…

pm2基本使用

1.pm2的基本介绍 pm2是node的进程管理器&#xff0c;利用它可以简化node任务的管理,且内置了许多功能,常用于后台脚本管理。 pm2特性 自带热部署 - - - 当源文件更新 线上项目也会自动重启后台运行 - - - 不会占用实时窗口 会在后台运行服务信息查看 - - - 查看运行中程序的…

Vue权限控制

此文章根据视频教程进行整理前端面试官必问系列-后台系统的权限控制与管理&#xff0c;建议搭配视频教程一起食用效果更佳 目录 1、权限相关概念 1.1、权限的分类 后端权限 前端权限 1.2 、前端权限的意义 降低非法操作的可能性 尽量减少不必要请求&#xff0c;减轻服务…

VUE跨域、常用解决跨域的方法

当我们遇到请求后台接口遇到 Access-Control-Allow-Origin 时&#xff0c;那说明跨域了。 跨域是因为浏览器的同源策略所导致&#xff0c;同源策略&#xff08;Same origin policy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;同源是指&…

〖大前端 - 基础入门三大核心之CSS篇⑱〗- CSS中的背景

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费开放&#xff0c;购买任意白宝书体系化专栏可加入TFS-CLUB 私域社区。福利&#xff1a;除了通过订阅"白宝书系列专栏"加入社区获取所有付费专栏的内容之外&#xff0c;还可以通过加入星荐…

【React Router v6】路由组件传参params/search/state(router v6)

欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t 框架 React框架 Reac

react-router v6 如何实现动态路由?

前言 最近在肝一个后台管理项目&#xff0c;用的是react18 ts 路由用的是v6&#xff0c;当需要实现根据权限动态加载路由表时&#xff0c;遇到了不少问题。 v6相比于v5做了一系列改动&#xff0c;通过路由表进行映射就是一个很好的改变&#xff08;个人认为&#xff09;&…

Docker利用Nginx部署前端项目

今天给大家分享的是Docker利用Nginx部署Vue等前端页面项目&#xff1b;其实是我工作刚好用到&#xff0c;顺便分享给大家O(∩_∩)O&#xff0c;那么话不多说直接开始。 一&#xff1a;准备文件 我们先将前端项目打包好&#xff0c;放到此文件夹下&#xff0c;例如我这样&#…

ts基本类型 typeof 和keyof

安装编译ts的工具 安装命令&#xff1a;npm i -g typescript 或者 yarn global add typescript。 验证是否安装成功&#xff1a;tsc –v&#xff08;查看 TypeScript 的版本&#xff09;。 编译并运行 TS 代码 创建 hello.ts 文件&#xff08;注意&#xff1a;TS 文件的后缀名…

vue3中ref和reactive的区别

ref 接受一个内部值并返回一个响应式且可变的 ref 对象&#xff0c;有一个 .value 属性&#xff0c;可以通过其读取/修改对象的值。 const active ref(false)console.log(active.value) // falseactive.value trueconsole.log(active.value) // true 为ref值指定泛型参数覆盖…

Vue中的$set

项目场景&#xff1a; 例如&#xff1a;在我写前端项目的时候&#xff0c;后端给我们的一个json对象&#xff0c;并且我已经渲染在页面上了。但是由于我自己的需求&#xff0c;想往返回的对象里面添加一个字段&#xff0c;后来才意识到不是响应式的。如果我们要让这个新字段是…

【博主推荐】html好看的个人主页(附源码)

个人主页介绍【博主推荐】html好看的个人主页1.背景个人主页效果2.背景个人主页代码3.简洁个人主页效果4.简洁个人主页代码5.卡片个人主页效果6.卡片个人主页代码7.星空个人主页效果8.星空个人主页代码源码下载【博主推荐】html好看的个人主页 附带四种风格个人主页 背景个人主…

牛客前端刷题(五)—— CSS相关概念

还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦! 赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏…

解决vue3+vite+TS 中使用element-plus按需引入 ElLoading、ElMessage 样式失效

ElMessage 样式失效 其实他不是失效了&#xff0c;只是加载到我们的 可以看到下面使用的方式和效果图&#xff0c;vue3的element-plus遇到的问题&#xff0c;因为要测试一下&#xff0c;所以点的频率比较大&#xff0c;但可以明显的看到ElMessage样式显示在你浏览器的下面 i…

echarts之markPoint(在途中任意位置增加标注及自动获取最大最小值处理)

echarts之markPoint(在途中任意位置增加标注及自动获取最大最小值处理) 前言 记录自己工作中的一点小心得&#xff0c;希望可以帮助有同样需求的朋友。 1.使用场景 之前我工作中有需要在图标中添加特殊标识的&#xff0c;我是费劲用散点图进行添加&#xff0c;十分麻烦。又比…