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

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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 20:10:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 20:10:07       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 20:10:07       82 阅读
  4. Python语言-面向对象

    2024-06-05 20:10:07       91 阅读

热门阅读

  1. pnpm包管理器总结

    2024-06-05 20:10:07       28 阅读
  2. 计算机系统基础知识-经典题目

    2024-06-05 20:10:07       29 阅读
  3. S4 BP 常用tcode

    2024-06-05 20:10:07       25 阅读
  4. 安全物理环境

    2024-06-05 20:10:07       30 阅读
  5. Python容器化技术的15个Docker实践

    2024-06-05 20:10:07       29 阅读
  6. Docker从安装开始精通

    2024-06-05 20:10:07       23 阅读
  7. 拼接sql字符串工具类

    2024-06-05 20:10:07       25 阅读
  8. 【CSharp】无符号短整型数组ushort[]转化为IntPtr

    2024-06-05 20:10:07       27 阅读
  9. 插件:qrcode的使用

    2024-06-05 20:10:07       31 阅读
  10. Android NDK系列(五)内存监控

    2024-06-05 20:10:07       21 阅读
  11. 前端24春招求职-延毕厦门某渣硕的春招0offer之旅

    2024-06-05 20:10:07       24 阅读
  12. Oracle表分区的基本使用

    2024-06-05 20:10:07       21 阅读
  13. 函数的“重载”,全人工打造未解之谜

    2024-06-05 20:10:07       25 阅读