Yolov5部署成为Python接口 当然是用flask实现啦~ yolo5写成接口

2023-11-15

一、在此之前你是不是要先把yolov5跑通?

yolov5的环境特别简单,建议在Ubuntu18.04下面部署,一次成型,省去很多麻烦。

  • Ubuntu18.04
  • RTX2080
  • CUDA10.0
  • CUDNN7.4.1
  • Torch1.3.1GPU
  • torchvision0.4.2
  • Python 3.6.5

项目地址:https://gitee.com/situyufeng/yolov5.git

github太慢了 我把他迁到了gitee上面

装好Torch以后呢,记得修改pip为清华源,然后修改requirements.txt里面关于cocoapi的部分。

第13行:

git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI

换成:

git+https://gitee.com/situyufeng/cocoapi.git#subdirectory=PythonAPI

然后

pip install -r requirements.txt

至此所有跑通yolov5的准备工作已经结束了

权重的话不要担心,文末我上传了整个项目,希望可以换点积分。

对了,运行下面这个命令的话是可以跑通的~

python detect.py --source ./inference/images/ --weights yolov5s.pt --conf 0.4

yolov5最方便的地方就是用Python写的,不需要编译,不需要编译,不需要编译!

二、开始搭建flask接口!

第一件事就是安装flask

pip install flask

接下来接口的主要函数文件都是基于detect.py,本来想做成yolov3那种项目和配置,奈何能力有限,读取权重的时候无法生成model。说到这里,yolov4我也尝试过做成flask接口,这里OpenCV拖了后腿,最新OpenCV不支持yolo4里面的mish函数,所以没有办法读取整个模型,可能是因为太新了不兼容。

打开detect.py复制一份,改成yolo5.py

因为我改动的部分实在是太多了,这里只能简要说一下了,具体的修改见我上传的代码。

part1 detect.py就是核心推断函数,只不过传参使用命令行的方式传进去的,
但是所有的参数并不是每一个都需要修改,常用的也就是图片路径
(这里需要夸赞U神单张批量和视频都写到一个函数里面了,当初改yolov3的时候简直麻烦到天上去了),
剩下的参数写成默认参数就可以了:
def detect( save_img=False,
            o_weights = "weights/yolov5s.pt",
            o_source = "inference/images",
            o_output = "inference/output",
            o_img_size = 640,
            o_conf_thres = 0.4,
            o_iou_thres = 0.5,
            o_fourcc = "mp4v",
            o_device = '',
            o_view_img = False,
            o_save_txt = False,
            o_classes = None,
            o_agnostic_nms = False,
            o_augment = False):
    p = ''
    c1 = (0,0)
    c2 = (0,0)
    label_no_value = ''
    detection_result_list = []
    out, source, weights, view_img, save_txt, imgsz = \
        o_output, o_source, o_weights, o_view_img, o_save_txt, o_img_size
    webcam = source == '0' or source.startswith('rtsp') or source.startswith('http') or source.endswith('.txt')

第二个部分:

part2 原始代码在获得推断结果以后会进行调用绘图函数画框,保存文本结果
,保存图像结果等一系列操作,那我们的思路就是在他调用绘图函数之前截获他的目标检测坐标和标签信息:
            if det is not None and len(det):
                # 重新缩放框从img_size到im0的尺寸
                det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()
                # 打印结果
                # for c in det[:, -1].unique():
                #     n = (det[:, -1] == c).sum()  # 推断每一类
                    # s += '%g %ss, ' % (n, names[int(c)])  # 加到输出串里面个数 标签
                    # s  = 'sssssaaaaassssaaaa %s' % ("asdffdsfsdfsfsf")
                # 写出结果
                for *xyxy, conf, cls in det:
                    label = '%s: %.2f' % (names[int(cls)], conf)
                    label_no_value = '%s' % (names[int(cls)])
                    confidences_value = '%.2f' % (conf)
                    c1,c2=plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=3)
                    print(c1,c2,label_no_value)

忽略我乱七八糟的调试代码~

第三个部分:

part3 我们只是为了拿他的坐标、标签和置信度,并不需要(至少暂时不需要)保存结果,真的完成绘图步骤,所以找到这些地方然后注释掉以提升速度:
            # 打印时间 (推断时间 + NMS)
            # print('%sDone. (%.3fs)' % (s, t2 - t1))

            # # 视频流的结果
            # if view_img:
            #     #返回实时检测结果
            #     cv2.imshow(p, im0)
            #     if cv2.waitKey(1) == ord('q'):  # q to quit
            #         raise StopIteration

            # # 保存结果 (推断后的图像)
            # if save_img:
            #     if dataset.mode == 'images':
            #         cv2.imwrite(save_path, im0)
            #     else:
            #         if vid_path != save_path:  # 新的视频
            #             vid_path = save_path
            #             if isinstance(vid_writer, cv2.VideoWriter):
            #                 vid_writer.release()  # 释放上一个视频编写器句柄

            #             fps = vid_cap.get(cv2.CAP_PROP_FPS)
            #             w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
            #             h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
            #             vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*opt.fourcc), fps, (w, h))
            #         vid_writer.write(im0)
    # print(detection_result_list)
其中绘图函数写在了utils.py里面:
def plot_one_box(x, img, color=None, label=None, line_thickness=None):
    # Plots one bounding box on image img
    # tl = line_thickness or round(0.002 * (img.shape[0] + img.shape[1]) / 2) + 1  # line/font thickness
    # color = color or [random.randint(0, 255) for _ in range(3)]
    c1, c2 = (int(x[0]), int(x[1])), (int(x[2]), int(x[3]))
    # cv2.rectangle(img, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)
    # print(c1,c2)
    # if label:
    #     tf = max(tl - 1, 1)  # font thickness
    #     t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]
    #     c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3
    #     cv2.rectangle(img, c1, c2, color, -1, cv2.LINE_AA)  # filled
    #     cv2.putText(img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA)
    return c1,c2

第四个部分就是把这些我们需要的信息封装成为json文件,通过flask来传送他们:

part4 这里你可以改为你需要的信息:
 text = label
                    text_inf = text + ' ' + '(' + str(c1[0]) + ',' + str(c1[1]) + ')' + ' ' + '宽:' + str(c2[0]-c1[0]) + '高:' + str(c2[1]-c1[1])
                    info.append({"label":names[int(cls)],"confidences":confidences_value})
                    loc.append([c1[0], c1[1], c2[0]-c1[0], c2[1]-c1[1]])
                    lab.append(text_inf)
                # for *xyxy, conf, cls in det:
                #     if save_txt:  # 写到文件
                #         xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # 归一化 xywh
                #         with open(txt_path + '.txt', 'a') as f:
                #             f.write(('%g ' * 5 + '\n') % (cls, *xywh))  # 格式化标签
                #     if save_img or view_img:  # 把框画到图像上
                #         label = '%s %.2f' % (names[int(cls)], conf)
                #         plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=3)
            data['data']=info
            res = jsonify(data)
            print(res)

第五部分:编写flask的代码部分:

part5 把flask的代码写好,调用yolo5的检测函数
set_upload_path = 'static/images'
set_result_path = 'static/images'
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'bmp'])
# glo._init()
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
app = Flask(__name__)
app.send_file_max_age_default = timedelta(seconds=1)
#URL地址
@app.route('/api/face_detection5', methods=['POST', 'GET'])
def upload():

其中调用的yolo5的检测函数被我改成了这样:
with torch.no_grad():
    lab, loc, res = yolo5.detect(o_source = upload_path)

第六部分:做成linux服务d

part6 保存个日志文件,方便调试~
PRG_KEY="yolo5"
RUN_PATH=$(cd `dirname $0`;pwd)   # Get the absolute path of the work
 
 
cd $RUN_PATH
 
case "$1" in
    start)
        nohup python3 -u $RUN_PATH/flask_yolo5.py runserver > nohup.log 2>&1 &
 
        echo "$PRG_KEY started, please check log."
 
        ;;
 
    stop)

第七部分:写个网页,用来上传图片:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传图片</title>
</head>
<body>
    <h1>上传</h1>
    <h2> yolo v5 </h2>
    <form action="" enctype='multipart/form-data' method='POST'>
	Identifier:
	<br>
	<input type="text" name="identifier" />
	<br>
        <input type="file" name="file" style="margin-top:20px;"/>
        <br>
        <input type="submit" value="上传并识别" class="button-new" style="margin-top:15px;"/>
    </form>
</body>
</html>

三、启动啊!等什么呢?

sh runServer.sh start

基本上yolo5写成api接口就是这些步骤了,https://download.csdn.net/download/Andrwin/12573384

文件已经上传了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yolov5部署成为Python接口 当然是用flask实现啦~ yolo5写成接口 的相关文章

  • 解决yolov5_deepsort报错:no module named “torchreid”

    遇到了同样的问题 xff0c 直接pip install torchreid没用 xff0c 从GitHub上找到了解决方法 https github com phil bergmann tracking wo bnw issues 159
  • yolov5记录检测框中心坐标

    yolov5记录检测框中心坐标 最近用到yolov5进行目标检测并确定目标在图片中的位置 xff0c 直接上代码 xff1a 第一步在detect py中建立文件夹并对每张图片建立txt文件 xff1a location center di
  • yolov5+tensorrt8 C++部署加速

    yolov5 tensorrt C 部署加速 参考代码 主要参考github https github com yzy12 max yolov5 deploy 码云备份 https gitee com qitiandashengdiyun
  • YOLOv5训练参数简介

    YOLOv5参数解析 xff0c 这次主要解析源码中train py文件中包含的参数 1 1 39 weights 39 1 2 39 cfg 39 1 3 39 data 39 1 4 39 hyp 39 1 5 39 epochs 39
  • yolov5源码解析--输出

    本文章基于yolov5 6 2版本 主要讲解的是yolov5是怎么在最终的特征图上得出物体边框 置信度 物体分类的 一 总体框架 首先贴出总体框架 xff0c 直接就拿官方文档的图了 xff0c 本文就是接着右侧的那三层输出开始讨论 Bac
  • c++读取yolov5模型进行目标检测(读取摄像头实时监测)

    文章介绍 本文是篇基于yolov5模型的一个工程 xff0c 主要是利用c 43 43 将yolov5模型进行调用并测试 xff0c 从而实现目标检测任务 任务过程中主要重点有两个 xff0c 第一 版本问题 xff0c 第二配置问题 一
  • c++部署yolov5模型

    C 43 43 部署yolov5模型 前言一 准备模型二 Fastdeploy准备三 调用总结 前言 不可否认 xff0c yolov5在目标检测方面大杀四方 xff0c 在 SOTA 榜上留下过万众瞩目的成绩 xff0c 但是官网代码给的
  • yolov5报错:RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place

    在执行下面代码时 python train span class token punctuation span py span class token operator span img span class token number 64
  • yolov5输出检测到的目标坐标信息/位置

    找到detect py xff0c 在大概113行 xff0c 找到plot one box span class token macro property span class token directive hash span span
  • yolov5/v7/v8自动检测多个文件夹及截取锚框

    目前yolo仅支持检测图片或单个文件夹 xff0c 但在很多时候需要对成百上千个文件夹中图片进行检测 xff0c 再根据得到的位置信息txt文件来截取图片 xff0c 如何一步完成呢 xff0c 详情见下文 在detect py中将save
  • Jetson Xavier NX使用yolov5+deepsort实现CSI摄像头的目标跟踪

    文章目录 安装过程运行效果用python代码来打开CSI摄像头实现CSI摄像头目标跟踪报错 AttributeError 39 NoneType 39 object has no attribute 39 shape 39 运行效果 参考文
  • YOLOv5和YOLOv7环境(GPU)搭建测试成功

    本来是用doc写的 xff0c 直接复制到这里很多图片加载缓慢 xff0c 我直接把doc上传到资源里面了 xff0c 0积分下载 xff1a 10条消息 YOLOv5和YOLOv7开发环境搭建和demo运行 Python文档类资源 CSD
  • yolov5 【v4.0】用自有数据集训练结果大比拼【5s,5m,5l,5x,5shpy】

    5s python test py weights runs train exp9 weights best pt data data 9 yaml task test save json iou thres 0 5 模型大小 best p
  • 干货-YOLOv5检测烟火

    火灾是一种常见的自然灾害和事故 经常给人们的生命财产安全带来威胁 在人力无法及时发现火灾的情况下 火势可能迅速扩散 造成不可挽回的损失 因此 及时发现火灾并采取有效的救援措施至关重要 利用计算机视觉技术检测火灾具有以下意义 提高火灾检测效率
  • 【目标检测-YOLO】YOLOv5-5.0v-数据处理(第三篇)

    前文链接 YOLOv5 v5 0 yolov5s网络架构详解 第一篇 星魂非梦的博客 CSDN博客 YOLOv5 5 0v yaml 解析 第二篇 星魂非梦的博客 CSDN博客 1 性能分析 YOLOv5 P6 models 4 outpu
  • YOLOv5训练目标检测数据集(小白)

    一 提前准备工作 1 利用labelimg软件给收集到的图片打标签 具体步骤网上都有 2 下载好yolov5 v6 1 源码 下载地址 https github com ultralytics yolov5 用pycharm打开 在项目目录
  • Yolov5权重 预训练模型 V4.0版本

    首先用bash weights download weights sh在主目录执行 下载模型要比直接去release快很多 不过你可能更想要这个 链接 https pan baidu com s 1Wc1jpP wcCKfwtWf iNml
  • YOLOv5小目标检测(方法与评价)

    问题 当我们在对小目标数据集进行检测时 发现无论如何都有一些漏检的 其中我们也添加一些模块 以及其他的一些改进方法 如注意力 激活函数等等 结果始终不会令人满意 map也没有丝毫的提升 目的 增加对小目标的检测能力 不能产生漏检 自述 许多
  • 关于yolov5训练大量数据存在的问题记录

    相关配置环境 拉取官方最新的镜像 docker pull ultralytics yolov5 以及代码 git clone https github com ultralytics yolov5 torch 1 10 1 cu102 CU
  • 还是得从代码角度看yolov5(1)

    train 参考文章 又是经典写到一半发现别人写的更好 基础函数 1 setattr setattr opt k v 将给定对象上的命名属性设置为指定值 等价于opt k v 2 getattr callback getattr logge

随机推荐

  • C语言:利用函数递归实现计算n!。

    C语言 利用函数递归实现计算n include
  • 简单javascript的使用

    1 javascript的简介 是基于对象和事件驱动的语言 应用于客户端 基于对象 提供了好多对象 可以直接拿过来使用 事件驱动 html做网站静态效果 javascript动态效果 客户端 专门指浏览器 js的特点 1 交互性 信息的动态
  • 【Python文件的使用】

    文章目录 一 文件概述 1 文件类别 2 文件路径 3 文件的编码方式 二 文件操作 1 文件打开 2 文件读写 3 文件关闭 三 操作实例 一 文件概述 1 文件类别 文件是一个存储在辅助存储器上的数据序列 可以包含任何数据内容 概念上
  • 蓝桥杯.Java.数列排序

    问题描述 给定一个长度为n的数列 将这个数列按从小到大的顺序排列 1 lt n lt 200 输入格式 1 第一行为一个整数n 2 第二行包含n个整数 为待排序的数 每个整数的绝对值小于10000 输出格式 输出一行 按从小到大的顺序输出排
  • android 实现自动输入文本效果

    此控件的功能是帮助用户实现自动输入 例如当用户输入一个字符后 能够根据这个字符提示显示出与之相关的数据 里面用到了一个适配器来实现此功能 源代码如下 package com example autosearch import android
  • 土地调查图斑编号_土地年度变更调查“图斑类型”说明

    年 度 土 地 变 更 调 查 图 斑 类 型 年度土地变更调查 图斑类型 共分为11大类27个二级类 根据影像和数据库情况 分别填写相应数字代码 大类填写阿拉伯数字 小类填写大写的英文字母 如 1A 第1类 前时相影像有植被覆盖或明显非建
  • Java 多线程 --- 锁的概念和类型划分

    Java 多线程 锁的概念和类型划分 锁的概念 锁可以保证 原子性 可见性 有序性 乐观锁与悲观锁 公平锁与非公平锁 什么是可重入锁 独占锁与共享锁 轻量级锁和重量级锁 自旋锁 Spinlock 锁泄露 锁的概念 锁可以将多个线程对共享数据
  • 数据中心的拥塞控制(1)CN

    一 概述 CN来自于IEEE802 1Qau 它的目地是为带宽 时延积的量级为5Mbit或更小值的网络域中的长时间存在的流增加拥塞管理功能 这种流常存在于DCB网络 存储网络 计算机集群网络等环境中 因而DCB也常用在这些网络环境中 为了使
  • vue父子组件&继承组件的生命周期以及应用

    父子组件的生命周期顺序 今天在做项目时候 发现了一个问题 那就是父子组件的执行顺序问题 在我印象里 肯定是先执行父组件的生命周期 再执行子组件的生命周期 但其实并不是这样的 我们来看代码 我们先用vue cli搭建一个项目 用什么搭建并不重
  • python爬虫实战---爬取大众点评评论

    python爬虫实战 爬取大众点评评论 加密字体 1 首先打开一个店铺找到评论 很多人学习python 不知道从何学起 很多人学习python 掌握了基本语法过后 不知道在哪里寻找案例上手 很多已经做案例的人 却不知道如何去学习更加高深的知
  • [git]使用git+gitee实现在两台电脑数据同步

    如果是使用Mac电脑安装git后右键看不到git bash here 直接右击打开终端即可 不影响 目录 一 准备工作 1 获取两台电脑的SSH公钥 添加到gitee 2 在gitee创建仓库 二 从电脑一 想要共享的文件夹所在的电脑 上传
  • linux ioctl()详解

    一 ioctl的简介 虽然在文件操作结构体 struct file operations 中有很多对应的设备操作函数 但是有些命令是实在找不到对应的操作函数 如CD ROM的驱动 想要一个弹出光驱的操作 这种操作并不是所有的字符设备都需要的
  • c语言输入一个整数判断能不能被357整除,编写程序实现:输入一个整数,判断它能否分别被3、5、7整除,并输出以下信息之一: (1)能同时被3、5、7整除; (2)能被其中两数(要指出哪两个)整除; (...

    编写程序实现 输入一个整数 判断它能否分别被3 5 7整除 并输出以下信息之一 1 能同时被3 5 7整除 2 能被其中两数 要指出哪两个 整除 3 能被其中一个数 要指出哪一个 整除 4 不能被3 5 7中任一个整除 更多相关问题 实行市
  • bmc linux 默认密码_系统下重置BMC密码方法

    Windows系统 1 重置密码之前 请先安装IPMI驱动 如已安装请跳过此步 点击下载并解压 ipmitool win rar 双击getlog bat自动安装 2 打开cmd命令行 进入附件工具下的ipmitool目录 执行如下命令 确
  • Reactor模式,或者叫反应器模式

    Reactor这个词译成汉语还真没有什么合适的 很多地方叫反应器模式 但更多好像就直接叫reactor模式了 其实我觉着叫应答者模式更好理解一些 通过了解 这个模式更像一个侍卫 一直在等待你的召唤 或者叫召唤兽 并发系统常使用reactor
  • Python3,os模块还可以这样玩,自动删除磁盘文件,非必要切勿操作。

    删除磁盘下所有的文件 1 引言 2 代码实战 2 1 模块介绍 2 2 获取盘符 2 3 获取盘符下的目录 2 3 1 os listdir 2 3 2 os environ 2 3 3 os getenv 2 4 删除文件 2 4 1 删
  • ubuntu命令大全(建议收藏)

    Ubuntu 命令大全 一 文件目录类 1 建立目录 mkdir 目录名 2 删除空目录 rmdir 目录名 3 无条件删除子目录 rm rf 目录名 4 改变当前目录 cd 目录名 进入用户home目录 cd 进入上一级目录 cd 5 查
  • 《我想进大厂》之Redis夺命连环11问

    这是面试题系列第三篇 redis专题 说说Redis基本数据类型有哪些吧 字符串 redis没有直接使用C语言传统的字符串表示 而是自己实现的叫做简单动态字符串SDS的抽象类型 C语言的字符串不记录自身的长度信息 而SDS则保存了长度信息
  • 数字信号处理第四次试验:IIR数字滤波器设计及软件实现

    数字信号处理第四次试验 IIR数字滤波器设计及软件实现 前言 一 实验目的 二 实验原理与方法 三 实验环境 四 实验内容及步骤 五 实验结果截图 含分析 六 思考题 前言 为了帮助同学们完成痛苦的实验课程设计 本作者将其作出的实验结果及代
  • Yolov5部署成为Python接口 当然是用flask实现啦~ yolo5写成接口

    一 在此之前你是不是要先把yolov5跑通 yolov5的环境特别简单 建议在Ubuntu18 04下面部署 一次成型 省去很多麻烦 Ubuntu18 04 RTX2080 CUDA10 0 CUDNN7 4 1 Torch1 3 1GPU