使用预训练模型(yolov8、MobileNetV2、ResNet50)与Gradio构建图像目标检测Web应用

简介:

   利用gradio设计一个web运用,实现图片主体物的识别。

   1)用户可以通过网页提交一张图片。

   2)web应用将输出这张图片中主体物的名称(中英文都可以)。

   3)可以使用预训练的模型。

利用预训练实现对物体识别

准备工作

在开始之前,请确保你的环境中已安装了以下依赖:

  • Python 3.7+
  • OpenCV
  • Numpy
  • Ultralytics(包含YOLOv8模型)
  • Gradio

一、gradio

1、简介

Gradio 是一个开源的 Python 库,它允许数据科学家、机器学习工程师和研究人员快速创建交互式的 UI(用户界面),以便于测试和演示机器学习模型。Gradio 提供了一种简单直观的方式来可视化模型的输入和输出,而无需深入学习前端开发或 Web 开发技术。

特点:

  1. 易用性:Gradio 的 API 设计简洁,只需几行代码即可创建功能完备的 Web 界面。
  2. 灵活性:支持多种输入类型(如文本、图像、音频、视频、数字等)和输出类型(如文本、图像、表格、分类标签等)。
  3. 实时反馈:模型的输入变化会立即反映在输出上,非常适合调试和模型迭代。
  4. 兼容性:可以与各种机器学习框架(如 TensorFlow、PyTorch、Scikit-Learn 等)无缝集成。
  5. 部署选项:可以本地运行,也可以通过 Gradio Cloud 免费在线分享或部署应用。
  6. 文档和社区:拥有详尽的文档和活跃的社区支持,便于学习和解决问题。

使用场景:

  • 模型测试:在模型训练过程中快速测试不同输入的效果。
  • 演示和教育:向非技术背景的观众展示模型的工作原理。
  • 客户反馈:收集最终用户对模型预测的反馈。

2、安装

2.1打开终端

2.2 安装

pip install gradio

二、算法描述

本设计中使用的算法基于yolov8、MobileNetV2、ResNet50模型。

(1)YOLOv8是You Only Look Once(YOLO)目标检测算法的最新迭代,它以卓越的实时性能和高准确度而受到青睐。YOLOv8通过其创新的单阶段检测框架,能够在图像中直接预测边界框和类别概率,无需依赖区域提议网络。这种设计大幅减少了计算量,同时保持了检测精度,使其非常适合在资源受限的设备上进行实时目标检测任务。

(2)MobileNetV2采用了深度可分离卷积(depthwise separable convolutions)作为其核心组件,这不仅减少了模型的参数数量,也降低了计算复杂度。此外,MobileNetV2还引入了倒置残差结构和线性瓶颈层,进一步提高了模型的性能和效率。

(3)ResNet50是深度学习领域中一个里程碑式的网络结构,以其引入的残差学习概念而著称。这种设计通过跳跃连接解决了深层网络训练中的梯度消失问题,使得构建和训练更深的网络成为可能。ResNet50在图像分类任务上表现出色,并且在多种计算机视觉应用中作为特征提取器被广泛使用,证明了其在提取图像特征方面的有效性和泛用性。

三、代码

1、MobileNetV2、resnet50

只需要修改导入预训练的代码以及gradio生成web的文字提示即可

import numpy as np
from PIL import Image
import tensorflow as tf
import gradio as gr

# # 加载预训练的VGG16模型  计算内存不足
#model = tf.keras.applications.VGG16(weights='imagenet')

# 加载预训练的MobileNetV2模型
#model = tf.keras.applications.MobileNetV2(weights='imagenet')

# 加载预训练的ResNet50模型
model = tf.keras.applications.ResNet50(weights='imagenet')

# 图像预处理函数  mobilenet_v2
# def preprocess_image(image):
#     img = Image.fromarray(image)
#     img = img.resize((224, 224))  # MobileNetV2输入尺寸
#     img_array = tf.keras.preprocessing.image.img_to_array(img)
#     img_array = np.expand_dims(img_array, axis=0)
#     img_array = tf.keras.applications.mobilenet_v2.preprocess_input(img_array)
#     return img_array


#resnet50
def preprocess_image(image):
    img = Image.fromarray(image)
    img = img.resize((224, 224))  # ResNet50输入尺寸
    img_array = tf.keras.preprocessing.image.img_to_array(img)
    img_array = np.expand_dims(img_array, axis=0)
    # 使用ResNet50的预处理函数
    img_array = tf.keras.applications.resnet50.preprocess_input(img_array)
    return img_array


# 图像分类函数
def classify_image(image):
    # 预处理图像
    processed_image = preprocess_image(image)
    
    # 使用模型进行预测
    predictions = model.predict(processed_image)
    
    # 解码预测结果  提取最有可能的类别和置信度top1
    decoded_predictions = tf.keras.applications.mobilenet_v2.decode_predictions(predictions, top=1)
    
    # 获取预测结果
    class_name, description, confidence = decoded_predictions[0][0]
    
    # 返回结果
    return f"预测结果: {description} (置信度: {confidence * 100:.2f}%)"

# 创建Gradio界面
iface = gr.Interface(
    fn=classify_image,
    inputs=gr.Image(type="numpy", label="上传图像"),
    outputs=gr.Textbox(label="分类结果"),
    title="基于ResNet50的图像分类",
    description="上传一张图像,使用ResNet50模型进行分类"
)

# 启动Gradio应用
iface.launch()

2、yolov8

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_idx = box.cls[0]  # 类别索引
            cls_name = model.names[int(cls_idx)]  # 将类别索引转换为类别名称

            # 在图像上绘制矩形和类别名称   左上角x1y1及右下角坐标x2y2
            cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)  #绿色 线条粗细设置为2像素(蓝绿红)
            cv2.putText(image, f'{cls_name}:{conf:.2f}', (int(x1), int(y1) - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36, 255, 12), 2)

            # 将检测结果添加到列表中
            detection_results.append(f'Class: {cls_name}, 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(  #定义接口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()

四、测试

使用不同的预训练模型进行测试:使用同一张图片进行输入,对比预测结果和置信度

(1)MobileNetV2

预测结果:bicycle-built-for-two,置信度为36.04%,可以看到虽然分类结果正确,但是置信度较低。

(2)ResNet50

预测结果:tricycle,置信度为51.39%

预测结果:suit,置信度33.37%

(3)yolov8

五、实验结论

        通过对比 YOLOv8 与 ResNet50 和 MobileNetV2 模型的预测效果,我们发现 YOLOv8 在目标检测任务上表现出色,能够准确地识别图像中的多个对象及其位置。这得益于 YOLOv8 的创新算法,它能够在单次前向传播中直接预测边界框和类别概率。

        所有使用的模型都是在大规模的 ImageNet 数据集上进行预训练的,这表明它们具有良好的泛化能力。在实验中,这些模型能够处理和识别各种各样的图像内容。

        YOLOv8 由于其快速和准确的目标检测能力,非常适合实时应用场景,如视频监控、自动驾驶车辆等。而 ResNet50 和 MobileNetV2 则更适合静态图像的分类任务,尤其是在资源受限的移动或嵌入式设备上。

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值