YOLOv5部署到web端(flask+js简单易懂)

这篇具有很好参考价值的文章主要介绍了YOLOv5部署到web端(flask+js简单易懂)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近,老板让写一个程序把yolov5检测模型部署到web端,在网页直接进行目标检测。经过1个星期的努力,终于实现基本功能👻(累晕了)。网上查阅了很多资料,发现很多的技术比较复杂,当然他们的页面都比较漂亮,然后我打算自己写一篇简单记录一下哈哈。进入正题,该项目完全由Python的轻量级web框架flask完成,其实有一点js代码,简单易懂👍

最终实现效果图

先看项目的效果图吧哈哈,比较辣鸡,但是功能实现了!
YOLOv5部署到web端(flask+js简单易懂)

检测结果显示:

YOLOv5部署到web端(flask+js简单易懂)

哈哈 可以看到检测结果还是可以的🤞

后端实现

首先,写了二个路由函数,分别是主界面、检测函数结果显示。如下所示

主界面

# 定义路由
@app.route('/', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':  #post是一种请求方式
        # 从表单中获取上传的文件
        f = request.files['file']  #request.files 函数作用就是获取前端名为 'file'的文件信息
        global filename  # 定义全局变量,方便其他地方调用filename,如果不定义全局变量,其他地方无法调用
        filename = f.filename  # 获取前端上传图片名字
        global file_path  #同理,定义全局变量
        
        # 将文件保存到服务器本地
        file_path = os.path.join(os.getcwd(), filename)  #本地路径+图片名字= 文件路径(file-path)

        print(file_path)  # 当时只是为了测试程序
        f.save(file_path)  # 保存上传的图片到本地目录下,方便后续推理,直接找到图片
        # 返回文件路径
        # return file_path

        #进行检测
        opt = parse_opt() 
        main(opt)
    return render_template('index.html')

检测函数+检测结果显示

# 检测结果显示
def return_img_stream(img_local_path):
    """
    工具函数:
    获取本地图片流
    :param img_local_path:文件单张图片的本地绝对路径
    :return: 图片流
    """
    import base64
    img_stream = ''
    with open(img_local_path, 'rb') as img_f:
        img_stream = img_f.read()
        img_stream = base64.b64encode(img_stream).decode()
    return img_stream

@app.route('/sh', methods=['GET', 'POST'])  #定义新路由,显示图片
def hello_world():
    #图片路径,推理完之后,默认保存的就是runs\\detect\\exp,这里加上filename,是变成完整的图片路径,然后才能获取显示
    img_path = 'runs\\detect\\exp\\' + str(filename)  
    img_stream = return_img_stream(img_path) #获取图片流
    return render_template('index.html', img_stream=img_stream)

最后,我把detect文件中的函数,parse_out函数直接放到app.py文件中了,因为这样传递图片路径比较方便。其中的main函数直接是调用的detect文件,如下所示:

# 检测图片的

def parse_opt():
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', nargs='+', type=str, default= 'yolov5s.pt', help='model path or triton URL')
    #parser.add_argument('--source', type=str, default=0, help='file/dir/URL/glob/screen/0(webcam)')
    parser.add_argument('--source', type=str, default= file_path, help='file/dir/URL/glob/screen/0(webcam)')
    parser.add_argument('--data', type=str, default= 'models/yolov5s.yaml', help='(optional) dataset.yaml path')
    parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
    parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold')
    parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold')
    parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image')
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--project', default= 'runs/detect', help='save results to project/name')
    parser.add_argument('--name', default='exp', help='save results to project/name')
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    parser.add_argument('--vid-stride', type=int, default=1, help='video frame-rate stride')
    opt = parser.parse_args()
    opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  # expand
    #print_args(vars(opt))
    args = parser.parse_args(args=[])
    print(args)
    return opt

到这里,后端实现就基本写完了。接下来,看看前端页面 很简单,我都不好意思写🙉

前端实现

主要就两个页面,分别是主页面index1.html和showimage.html。

主界面(index.html)+显示图片界面

index1.html就是主界面,显示的一些操作按钮。代码如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>目标检测系统</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <!-- <link rel="stylesheet" href="D:\WEB\static\style.css"> -->
  </head>
  <body>
    <h2 id="title">目标检测系统</h2>
    <br />
    <br />
    <img id="imageDisplay" width="500" height="500" />
    <img id="result_show" src="data:;base64,{{ img_stream }}">
    <br />
    <form method="POST" enctype="multipart/form-data">
      <br />
      <input type="file" id="imageFile" onchange="displayImage()" 
        <input type="file" name="file">
        <br />
        <input id=button_detect  type="submit" value="开始检测">
    </form>
    <br />
    <div id="imagePath"></div>
    <script>
        function displayImage() {
            var fileInput = document.getElementById("imageFile");
            var imagePath = document.getElementById("imagePath");
            var imageDisplay = document.getElementById("imageDisplay");
            var file = fileInput.files[0];
            var reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onload = function (e) {
              //imagePath.innerHTML = "Image Path: " + fileInput.value;
              imageDisplay.src = e.target.result;
            };
      }

      function Show() {
              var img = document.getElementById('img');
              img.src = '/sh';
          }
    </script>
      <!-- <button id="my-button" οnclick="Detect()">检测</button> -->
      <a href="http://127.0.0.1:5000/sh">
          <button id="button_show" onclick="Show()">显示图片</button>
      </a>
      
  </body>
  <style>
    #title{
    text-align: center; 
    color: black;
    font-size: xx-large;
    background-color: cadetblue;
}
    #imageDisplay{
        margin-left: 350px;
        position: relative;
    }
    #button_detect{
      width: 100px;
      height: 40px;
      background-color: skyblue;
      font-size: larger;
      margin-left: 900px;
      margin-top: auto;
    }
    #button_show{
      width: 100px;
      height: 40px;
      background-color: skyblue;
      font-size: larger;
      margin-left:900px;
      margin-top: auto;
    }
    #imageFile{
      width: 300px;
      height: 40px;
      background-color:white;
      font-size: larger;
      margin-left:900px;
      margin-top: auto;
    }
    #result_show{
      height: 500px;
      width: 500px;
      margin-left: 200px;
      
    }
  </style>
</html>

总结

写的比较潦草,代码的功能不难理解,相对比较基础。有什么问题可以在评论直接问。然后就是代码基本上都放上来了,可以直接复制然后用。

5.22 更新了一下代码文章来源地址https://www.toymoban.com/news/detail-428923.html

  • 更加简洁了,没有那么多繁琐的步骤
  • 加了一点点样式,增加了一些代码注释(不少人私信问我一些代码问题,之前忘记写了,不好意思)
  • 然后大家可以根据自己的需要进行改进
    ·······························
    如果觉得有用,就点点赞哈哈😍
    我看代码需要的同学比较多,我直接把代码上传到github了,就不一个个私发你们了。
    大家帮我点点赞或关注哈哈哈😘,然后自己下载吧🛴
    源码链接:https://github.com/Jss666/yolo_web

到了这里,关于YOLOv5部署到web端(flask+js简单易懂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python Flask+Nginx】实现HTTP、WS (两步实现,简单易懂)

    目录 一、创建Flask应用  二、部署Nginx 2.1 下载Nginx  2.2 修改Nginx配置文件 2.3 启动Nginx 三、测试         首先我写了如下一个基于Flask的Demo,该Demo包含两个接口一个是 HTTP 接口(http://127.0.0.1:5000),一个是 Websocket 接口(ws://127.0.0.1:5000/test) 如果调用HTTP接口,会返回一个

    2024年02月11日
    浏览(22)
  • YOLOv5 + Flask + Vue实现基于深度学习算法的垃圾检测系统源码+数据库

    YOLOv5🚀 :高效、准确的目标检测算法,实时识别检测图像和视频中的各种对象 PyTorch :机器学习框架,以动态计算图为基础,具有灵活性和易用性 OpenCV :计算机视觉库,提供了丰富的图像和视频处理功能 Vue3 :采用 Vue3 + script setup 最新的 Vue3 组合式 API Element Plus :Element

    2024年02月22日
    浏览(31)
  • Yolov5-Python系列(一)—— 基础入门(yolov5安装、简单使用)

    推荐使用Anconda环境:通过Anaconda则可以通过创造新的虚拟环境解决资源包(python库)之间冲突问题。 (一)Anconda安装:https://www.anaconda.com/download (二)Yolov5 下载:https://github.com/ultralytics/yolov5 安装很简单的,略,安装成功后… (一)进入anaconda命令行 (二)为yolov5创建独立

    2023年04月26日
    浏览(42)
  • 树莓派yolov5简单调用

    yolov5下载并部署 参考博客 labelme注意事项 labelme包下载 labelme-master https://www.aliyundrive.com/s/bMeCNrwHuva 提取码: a43f 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。 里面的train_txt.py是把json转txt的脚本,注意模型参数的yaml文

    2023年04月09日
    浏览(29)
  • yolov5-7.0简单训练教程

    yolov5-7.0简单训练教程。 可以自己去git上下载,没有梯子的点这里去百度网盘下载资源 点击下载资源包:objectdetection_script-master 将下载到的脚本目录中的yolo文件夹内的文件复制到yolov5-7.0的根目录下。 Annotations:存放VOC格式的标注的XML文件 JPEGImages:存放数据集里的图片,图片

    2024年02月02日
    浏览(31)
  • 【YOLOv5】LabVIEW+TensorRT的yolov5部署实战(含源码)

    ‍‍🏡博客主页: virobotics的CSDN博客:LabVIEW深度学习、人工智能博主 🎄所属专栏:『LabVIEW深度学习实战』 🍻上期文章: 手把手教你使用LabVIEW TensorRT实现图像分类实战(含源码) 📰如觉得博主文章写的不错或对你有所帮助的话,还望大家多多支持呀! 欢迎大家✌关注、

    2024年02月14日
    浏览(26)
  • Node.js安装及环境配置(简单易懂全面!)

    参考:https://www.cnblogs.com/liuqiyun/p/8133904.html https://www.jianshu.com/p/13f45e24b1de 目录 一、安装环境 二、安装Node.js步骤 三、前期准备  四、开始安装 五、环境配置 六、测试 1、本机系统:Windows 10 (64位) 2、Node.js:v12.16.1LTS(64位) 1、下载对应你系统的Node.js版本:https://nodejs.org/

    2024年02月15日
    浏览(29)
  • JS绑定事件的三种方法(简单易懂)

    相信大家都了解过事件,但如何给元素绑定事件,如何使用呢? 让我为大家介绍三种绑定事件的方法吧! 以下都是用点击事件(click)来做示范 代码总结: 本人文笔有限,如有不对的地方,可以向我提出,感谢大家!

    2024年02月03日
    浏览(48)
  • 【目标检测算法实现之yolov5】 一、YOLOv5环境配置,将yolov5部署到远程服务器上

    在官网:https://github.com/ultralytics/yolov5上下载yolov5源代码 下载成功如下: 在配置基础环境之前,提前压缩自己的代码文件,并通过winscp传输给linux端,传输之后,解压该文件。解压前,先创建一个文件夹,再解压。 winscp下载使用教程参考上一篇博客:使用WinSCP下载和文件传输

    2024年01月15日
    浏览(40)
  • Docker部署yolov5

    Ubuntu:22.10 Docker:24.0.0 这里我下载了6.0版本的,想要别的版本的自己修改,但dockerfile可能目录不同,可以通过find指令查询 这里要等待很长时间,构建大概20g的镜像 具体错误详情: 这是因为版本不匹配的问题,Dockerfile中只限制了opencv-python的版本大于4.1.2并没有限制最高版本,

    2024年02月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包