使用gradio库实现Web应用,允许用户上传图像,并使用YOLOv8模型对图像进行目标检测。

news2024/11/17 17:55:14

一、Gradio

Gradio 详细介绍

Gradio 是一个用于构建和分享机器学习模型和数据科学应用的开源Python库。它简化了创建交互式Web界面的过程,让开发者可以快速搭建原型并与他人分享。

主要特性
  1. 易用性

    • 无需前端开发经验:只需几行Python代码就可以创建功能完备的Web界面。
    • 即时部署:可以快速本地运行和在线共享。
  2. 广泛的支持

    • 支持多种输入和输出类型:包括图像、文本、音频、视频、滑动条等。
    • 与主流机器学习框架兼容:如TensorFlow、PyTorch、scikit-learn等。
  3. 自动化

    • 自动生成接口:根据定义的函数自动生成Web界面。
    • 实时更新:可以实时查看和测试模型的效果。
  4. 协作和分享

    • 共享链接:生成的应用可以通过链接分享,方便他人访问和测试。
    • 集成到现有的工作流程中:可以与Jupyter Notebook、Google Colab等集成使用。
Gradio的基本使用方法
  1. 安装Gradio

    pip install gradio
    
  2. 创建一个简单的Gradio应用

    import gradio as gr
    
    def greet(name):
        return f"Hello {name}!"
    
    iface = gr.Interface(fn=greet, inputs="text", outputs="text")
    iface.launch()
    
    • gr.Interface:定义了一个简单的接口。
    • fn=greet:指定了处理函数。
    • inputs="text":定义输入组件为文本输入框。
    • outputs="text":定义输出组件为文本输出框。
    • iface.launch():启动Gradio应用。
  3. 支持多种输入和输出类型
    Gradio支持多种输入和输出组件,如图像、视频、音频、滑动条、复选框等。

    def classify_image(image):
        # 假设有一个预训练的分类模型
        return "分类结果"
    
    iface = gr.Interface(fn=classify_image, inputs=gr.inputs.Image(), outputs="text")
    iface.launch()
    
  4. 多个输入和输出
    支持多输入和多输出的情况,可以构建复杂的界面。

    def process_data(name, age, image):
        # 假设处理这些输入并返回结果
        return f"Name: {name}, Age: {age}", image
    
    iface = gr.Interface(
        fn=process_data,
        inputs=[gr.inputs.Textbox(label="Name"), gr.inputs.Slider(0, 100, label="Age"), gr.inputs.Image(type="numpy", label="Image")],
        outputs=["text", "image"]
    )
    iface.launch()
    
Gradio组件

Gradio提供了多种组件来满足不同的输入输出需求。以下是一些常用的组件:

  • 文本输入gr.inputs.Textbox
  • 滑动条gr.inputs.Slider
  • 复选框gr.inputs.Checkbox
  • 图像gr.inputs.Image
  • 音频gr.inputs.Audio
  • 视频gr.inputs.Video

每个组件都可以通过不同的参数进行定制,以满足特定的需求。

高级特性
  1. 自定义CSS和JS
    Gradio允许用户自定义应用的外观和行为,通过添加自定义的CSS和JavaScript文件。

  2. 集成到现有工作流
    Gradio应用可以嵌入到Jupyter Notebook、Google Colab等环境中,方便与数据科学工作流的无缝集成。

  3. 共享和部署
    Gradio提供了一键共享功能,可以生成一个临时链接,方便快速分享应用。还可以将应用部署到云端,提供更长时间的访问。

  4. 错误处理和调试
    提供了详细的错误信息和调试工具,帮助开发者快速定位和解决问题。

二、实例

本文主要使用Gradio库创建了一个Web应用,允许用户上传图像,并使用YOLOv8模型对图像进行目标检测。处理后的图像会显示检测框和标签,并展示检测结果的详细信息。通过简单的Web界面,用户可以轻松地进行图像检测而无需编写复杂的前端代码。

代码实现的具体功能

  • 图像上传:用户可以通过Web界面上传图像文件。
  • 目标检测:上传的图像被传递给YOLO模型进行目标检测。
  • 结果展示:处理后的图像会在Web界面显示,并且显示检测到的目标物体的类别、置信度和位置。
  • 交互体验:用户可以实时查看检测结果,并可以继续上传新的图像进行检测。

通过上述代码,用户能够方便地使用YOLOv8模型进行图像目标检测,并通过直观的Web界面查看结果。
下面是代码的流程以及各部分的作用功能:

代码流程和功能

  1. 引入必要的库

    import gradio as gr
    import cv2
    import numpy as np
    import os
    from ultralytics import YOLO
    
    • gradio:用于创建Web界面的库。
    • cv2:用于图像处理的OpenCV库。
    • numpy:用于处理数组和矩阵的库。
    • os:用于文件和目录操作。
    • ultralytics.YOLO:用于加载和使用YOLOv8模型。
  2. 设置上传和结果文件夹

    UPLOAD_FOLDER = 'uploads'
    RESULT_FOLDER = 'results'
    os.makedirs(UPLOAD_FOLDER, exist_ok=True)
    os.makedirs(RESULT_FOLDER, exist_ok=True)
    
    • UPLOAD_FOLDERRESULT_FOLDER:定义上传文件和处理结果的保存目录。
    • os.makedirs:创建目录(如果目录不存在)。
  3. 加载YOLO模型

    model = YOLO('yolov8n.pt')
    
    • model:加载YOLOv8模型,用于后续的图像检测。
  4. 定义图像处理函数

    def process_image(image):
        # 保存上传的图像
        filename = 'uploaded_image.jpg'
        file_path = os.path.join(UPLOAD_FOLDER, filename)
        cv2.imwrite(file_path, image)
    
        # 处理图像
        results = model(image)
        detection_results = []
        for result in results:
            boxes = result.boxes
            for box in boxes:
                x1, y1, x2, y2 = box.xyxy[0]
                conf = box.conf[0]
                cls = box.cls[0]
                cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
                cv2.putText(image, f'{cls}:{conf:.2f}', (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9,
                            (36, 255, 12), 2)
                detection_results.append(f'Class: {cls}, Confidence: {conf:.2f}, Box: ({x1}, {y1}), ({x2}, {y2})')
    
        # 保存处理后的图像
        result_filename = 'result_image.jpg'
        result_path = os.path.join(RESULT_FOLDER, result_filename)
        cv2.imwrite(result_path, image)
    
        return image, '\n'.join(detection_results)
    
    • process_image函数:处理上传的图像,使用YOLO模型进行检测,绘制检测框和标签,并返回处理后的图像和检测结果文本。
      • 保存上传的图像到指定目录。
      • 使用YOLO模型对图像进行检测。
      • 绘制检测框和标签,并保存处理后的图像。
      • 返回处理后的图像和检测结果文本。
  5. 创建Gradio界面

    iface = gr.Interface(
        fn=process_image,
        inputs=gr.Image(type="numpy", label="上传图像"),
        outputs=[gr.Image(type="numpy", label="处理后的图像"), gr.Textbox(label="检测结果")],
        title="YOLOv8 图像检测",
        description="上传图像并使用YOLOv8模型进行检测"
    )
    
    • gr.Interface:定义Gradio界面的主要组件。
    • fn=process_image:指定处理函数为process_image
    • inputs=gr.Image(type="numpy", label="上传图像"):定义图像上传输入组件。
    • outputs=[gr.Image(type="numpy", label="处理后的图像"), gr.Textbox(label="检测结果")]:定义处理后的图像输出和检测结果文本输出组件。
    • titledescription:设置界面的标题和描述。

完整代码如下:

import gradio as gr
import cv2
import numpy as np
import os
from ultralytics import YOLO

# 设置上传和结果文件夹
UPLOAD_FOLDER = 'uploads'
RESULT_FOLDER = 'results'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(RESULT_FOLDER, exist_ok=True)

# 加载模型
model = YOLO('yolov8n.pt')

def process_image(image):
    # 保存上传的图像
    filename = 'uploaded_image.jpg'
    file_path = os.path.join(UPLOAD_FOLDER, filename)
    cv2.imwrite(file_path, image)

    # 处理图像
    results = model(image)
    detection_results = []
    for result in results:
        boxes = result.boxes
        for box in boxes:
            x1, y1, x2, y2 = box.xyxy[0]
            conf = box.conf[0]
            cls = box.cls[0]
            cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
            cv2.putText(image, f'{cls}:{conf:.2f}', (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9,
                        (36, 255, 12), 2)
            detection_results.append(f'Class: {cls}, Confidence: {conf:.2f}, Box: ({x1}, {y1}), ({x2}, {y2})')

    # 保存处理后的图像
    result_filename = 'result_image.jpg'
    result_path = os.path.join(RESULT_FOLDER, result_filename)
    cv2.imwrite(result_path, image)

    return image, '\n'.join(detection_results)

# 创建Gradio界面
iface = gr.Interface(
    fn=process_image,
    inputs=gr.Image(type="numpy", label="上传图像"),
    outputs=[gr.Image(type="numpy", label="处理后的图像"), gr.Textbox(label="检测结果")],
    title="YOLOv8 图像检测",
    description="上传图像并使用YOLOv8模型进行检测"
)

# 启动Gradio应用
iface.launch()

运行,复制下面链接:
在这里插入图片描述
界面如下:
在这里插入图片描述
选择图片检测结果如下:
在这里插入图片描述

三、 番外篇-YOLOV10尝鲜

最近由清华大学的研究团队研发的最新的YOLOV10模型。这一新一代的YOLO模型专注于实时端到端的目标检测。YOLOv10在多个方面进行了改进,包括优化模型架构、消除非极大值抑制(NMS)后处理步骤,并引入了高效的模型设计策略,从而在提高检测精度的同时显著降低了计算开销和推理延迟。
具体来说,YOLOv10的研发团队包括Ao Wang, Hui Chen, Lihao Liu, Kai Chen, Zijia Lin, Jungong Han和Guiguang Ding。这些研究人员通过广泛的实验,证明了YOLOv10在不同模型规模上实现了最先进的性能和效率。例如,与YOLOv9-C相比,YOLOv10-B在相同性能下延迟减少了46%,参数减少了25%。
通过这些改进,YOLOv10在实时性和精度方面都达到了新的高度,适用于各种实时目标检测应用,如自动驾驶、视频监控和智能安防等。

好奇心驱使尝试一下v10模型的效果。下载了yolov10s.pt版本,进行实时视频监控测试。
各版本下载和介绍如下:
模型下载:

YOLOv10-N:https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10n.pt
YOLOv10-S:https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10s.pt
YOLOv10-M:https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10m.pt
YOLOv10-B:https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10b.pt
YOLOv10-L:https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10l.pt
YOLOv10-X:https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10x.pt

模型介绍:
在这里插入图片描述
YOLOv10实战:30行左右代码构建基于YOLOv10的实时视频监控
代码如下:运行后电脑摄像头自动开启,实时检测摄像头内的目标。

import cv2
from ultralytics import YOLOv10

model = YOLOv10("yolov10s.pt")
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    if not ret:
        break  # 如果没有读取到帧,退出循环
    results = model.predict(frame)
    # 遍历每个预测结果
    for result in results:
        # 结果中的每个元素对应一张图片的预测
        boxes = result.boxes  # 获取边界框信息
        for box in boxes:
            x1, y1, x2, y2 = map(int, box.xyxy[0])
            cls = int(box.cls[0])
            conf = float(box.conf[0])
            cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
            cv2.putText(frame, f'{model.names[cls]} {conf:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
                        (255, 0, 0), 2)
    # 显示带有检测结果的帧
    cv2.imshow('YOLOv10实时检测', frame)
    # 按'q'键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

检测结果:
在这里插入图片描述
检测效果确实很赞!
参考:基于YOLOv10实现你的第一个视觉AI大模型

四、 YOLO版本简史

YOLO(You Only Look Once)系列目标检测模型的发展历程中,不同版本是由不同的研究团队研发的。以下是各个版本的研发团队简介:

YOLOv1

研发团队:Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi

  • 机构:华盛顿大学和Facebook AI Research (FAIR)
  • 发布时间:2016年
  • 简介:YOLOv1是YOLO系列的第一个版本,提出了一种统一的目标检测方法,能够在单次前向传递中预测物体边界和类别。

YOLOv2 (YOLO9000)

研发团队:Joseph Redmon, Ali Farhadi

  • 机构:华盛顿大学
  • 发布时间:2017年
  • 简介:YOLOv2在YOLOv1的基础上进行了改进,引入了多尺度训练和Batch Normalization等技术,并扩展了模型的检测能力(YOLO9000)来识别9000种类别。

YOLOv3

研发团队:Joseph Redmon, Ali Farhadi

  • 机构:华盛顿大学
  • 发布时间:2018年
  • 简介:YOLOv3进一步改进了网络结构,引入了残差网络和多尺度特征金字塔,使其在精度和速度上有显著提升。

YOLOv4

研发团队:Alexey Bochkovskiy, Chien-Yao Wang, Hong-Yuan Mark Liao

  • 机构:Alexey Bochkovskiy的独立研究与台湾国立中山大学
  • 发布时间:2020年
  • 简介:YOLOv4在YOLOv3的基础上,结合了许多新技术如CSPNet、Mish激活函数和SAM,进一步提高了性能。

YOLOv5

研发团队:Glenn Jocher

  • 机构:Ultralytics LLC
  • 发布时间:2020年
  • 简介:YOLOv5由Ultralytics团队开发,注重易用性和快速部署,提供了多种预训练模型和丰富的工具,便于在各种应用中使用。

YOLOv6

研发团队:Meituan-Dianping

  • 机构:美团
  • 发布时间:2022年
  • 简介:YOLOv6专注于工业应用中的高效目标检测,优化了模型的推理速度和精度,适合在生产环境中部署。

YOLOv7

研发团队:Wong Kin-Yiu, Alexey Bochkovskiy, Chien-Yao Wang, Hong-Yuan Mark Liao

  • 机构:台湾国立中山大学
  • 发布时间:2022年
  • 简介:YOLOv7进一步优化了网络架构和训练策略,使得模型在速度和精度上都达到了新的高度。

YOLOv8

研发团队:Ultralytics LLC

  • 机构:Ultralytics LLC
  • 发布时间:2023年
  • 简介:YOLOv8延续了YOLOv5的开发理念,通过改进的架构和训练方法,进一步提升了目标检测的性能和效率。

YOLOv9

研发团队:Ultralytics LLC

  • 机构:Ultralytics LLC
  • 发布时间:2024年
  • 简介:YOLOv9在YOLOv8的基础上,针对大规模数据集和复杂场景进行了优化,提供了更高的检测精度和速度。

YOLOv10

研发团队:Ao Wang, Hui Chen, Lihao Liu, Kai Chen, Zijia Lin, Jungong Han, Guiguang Ding

  • 机构:清华大学
  • 发布时间:2024年
  • 简介:YOLOv10通过优化模型架构和消除非极大值抑制(NMS),显著提升了实时目标检测的性能和效率。

这些不同版本的YOLO模型在各自的时代都对目标检测技术做出了重要贡献,推动了这一领域的发展。各个版本在精度、速度和易用性上都有不同的侧重点,以满足不同应用场景的需求。

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

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

相关文章

Python dateutil库:日期和时间处理的利器

更多Python学习内容:ipengtao.com Python的dateutil库是一个强大且灵活的日期和时间处理工具。它扩展了标准库中的datetime模块,提供了更多的功能和更高的灵活性。dateutil库特别适用于复杂的日期解析、日期计算、时区转换和重复事件处理。本文将详细介绍…

mysql高级刷题-01-求项目子任务分组计算

这条 SQL 查询用于从 Tasks 表中计算项目的相关信息,并根据项目的总时长进行排序。具体来看,这段查询的目的是将连续的任务分组为一个项目,并计算每个项目的总天数、子任务 ID 列表、项目的开始日期和结束日期。下面是对这条 SQL 查询的详细分…

递归书写树形图示例

大叫好&#xff0c;今天书写了一个扁型转换为树型的例子&#xff0c;使用的是递归&#xff0c;请大家食用&#xff0c;无毒 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" conte…

redis常用设计模式

Redis常用的设计模式分为读&#xff0c;写&#xff0c;读写三种 一、概要说明 读操作 Read Through Pattern 读穿透 写操作 以Redis统一视图为准&#xff1a;先更新缓存&#xff0c;后更新数据库。 Write Through Pattern 直写模式&#xff08;首先将数据写入缓存&#xf…

github删除某个仓库

在GitHub上删除一个仓库&#xff0c;按照以下步骤操作&#xff1a; 1、登录到GitHub账户。 2、导航到想要删除的仓库页面。 3、点击仓库页面上的"Settings"&#xff08;设置&#xff09;选项卡。 4、向下滚动到页面底部&#xff0c;找到"Danger Zone"&…

数字证书-USBKey使用指导

在商用密码应用安全性评估&#xff08;密评&#xff09;场景下&#xff0c;您可以通过数字证书管理服务控制台申请带有私钥的合规CA证书。只有在安装了USBKey控件并将USBKey插入本地操作系统后&#xff0c;才能选择本地密钥容器来申请合规CA证书。本文介绍如何安装和使用USBKey…

10_JavaWeb过滤器

文章目录 过滤器1.过滤器的实现1.1 实现过滤器1.2 配置过滤器1.2.1 过滤器的xml方式1.2.2 过滤器的注解方式 2. 过滤器的生命周期3. 过滤器链使用 过滤器 生活举例: 公司前台,停车场安保,地铁验票闸机 java中过滤仅仅是对请求做出过滤 客户端向服务器发出请求&#xff0c;在服…

使用 Hugging Face 推理终端搭建强大的“语音识别 + 说话人分割 + 投机解码”工作流...

Whisper 是当前最先进的开源语音识别模型之一&#xff0c;毫无疑问&#xff0c;也是应用最广泛的模型。如果你想部署 Whisper 模型&#xff0c;Hugging Face推理终端能够让你开箱即用地轻松部署任何 Whisper 模型。但是&#xff0c;如果你还想叠加其它功能&#xff0c;如用于分…

0531作业 链表

结果 整体代码 主要实现 /**实现* */ #include "./linklist.h"linklist* create_linklist(datatype param){linklist* node(linklist*)malloc(sizeof(linklist));if(NULLnode){puts("节点创建失败");}node->paramparam;node->pnextNULL;puts("…

每天CTF小练--ctfshow新手村

easy_base 密文&#xff1a;0XezFWZfNXafRjNlNXYit3dvh2cmR3Y 等号在前面&#xff0c;直接倒序后解码 ctfshow{base64_is_easy} 代码解&#xff1a; s 0XezFWZfNXafRjNlNXYit3dvh2cmR3Y print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转…

运放应用2 - 同相放大电路

1. 前置知识 同相放大电路存在 负反馈电路 &#xff0c;工作在线性区&#xff0c;可以利用 虚短 概念来分析电路。 注&#xff1a;运放的 虚断 特性是一直存在的&#xff0c;虚短 特性则需要运放工作在 线性区 有关运放的基础知识&#xff0c;可以参考我的另外一篇文章&#x…

【深度学习】目标检测,Faster-RCNN算法训练,使用mmdetection训练

文章目录 资料环境数据测试 资料 https://mmdetection.readthedocs.io/zh-cn/latest/user_guides/config.html 环境 Dockerfile ARG PYTORCH"1.9.0" ARG CUDA"11.1" ARG CUDNN"8"FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}…

掘金AI商战宝典-系统班:2024掘金AIGC课程(30节视频课)

课程下载&#xff1a;掘金AI商战宝典-系统班&#xff1a;2024掘金AIGC课程(30节视频课)-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 课程目录 1-第一讲学会向Al提问&#xff1a;万能提问公式_1.mp4 2-第二讲用AI写视频脚本_1.mp4 3-第三讲…

教科书般的充电桩平台多租户技术架构设计,建议收藏!-慧哥充电桩开源平台

慧哥充电桩开源平台V2.5.2_----- SpringCloud 汽车 电动自行车 云快充1.5、云快充1.6 https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001.5502 一、多租户的概念 多租户本质上是一种软件的技术架构&#xff0c;它最核心的特征是多个租户可以共享一…

Mamba v2诞生:1 儒(Transformers)释(SSD)道(Mamba)本是一家?!

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

基于MinGW64 GCC编译Windows平台上的 libuvc

安装cmake 打开cmake官网 https://cmake.org/download/&#xff0c;下载安装包&#xff1a; 安装时选择将cmake加到系统环境变量里。安装完成后在新的CMD命令窗口执行cmake --version可看到输出&#xff1a; D:\>cmake --version cmake version 3.29.3 CMake suite mainta…

Hotcoin精彩亮相Consensus 2024 Austin,探索行业风向标

5 月 31 日&#xff0c;由CoinDesk主办的“Consensus 2024”大会在德克萨斯州的奥斯汀市正式落下帷幕。作为全球规模最大、最具影响力的加密货币、区块链、Web3盛会&#xff0c;本次Consensus 2024 Austin吸引来自 100 多个国家/地区的 15,000 多名与会者、6,800 家公司、850 多…

LeetCode-2246. 相邻字符不同的最长路径【树 深度优先搜索 图 拓扑排序 数组 字符串】

LeetCode-2246. 相邻字符不同的最长路径【树 深度优先搜索 图 拓扑排序 数组 字符串】 题目描述&#xff1a;解题思路一&#xff1a;找路径背诵版&#xff1a;解题思路三&#xff1a; 题目描述&#xff1a; 给你一棵 树&#xff08;即一个连通、无向、无环图&#xff09;&…

python中实现队列功能

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python中实现队列功能 选择题 以下代码最后一次输出的结果是&#xff1f; from collections import deque queue deque() queue.append(1) queue.append(2) queue.append(3) print(【显示】…

Nginx 配置:gzip动态压缩、静态压缩

动态压缩 动态压缩开启的现象 Nginx配置 http {# 启用 gzip 压缩gzip on;# 设置 gzip 压缩级别&#xff0c;范围是1-9&#xff0c;数字越大压缩率越高但CPU消耗也越大gzip_comp_level 5;# 设置最低压缩的文件大小&#xff08;大于1KB的文件才进行压缩&#xff09;gzip_min_le…