首页 > 其他分享 >使用预训练模型(yolov8、MobileNetV2、ResNet50)与Gradio构建图像目标检测Web应用

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

时间:2024-07-15 23:25:57浏览次数:11  
标签:Web ResNet50 img MobileNetV2 image 图像 array 模型

简介:

   利用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 则更适合静态图像的分类任务,尤其是在资源受限的移动或嵌入式设备上。

标签:Web,ResNet50,img,MobileNetV2,image,图像,array,模型
From: https://blog.csdn.net/wangzhengyang214/article/details/140293621

相关文章

  • NSSCTF中24网安培训day2中web题目
    [SWPUCTF2021新生赛]ez_unserialize这道题目考察php反序列化的知识点打开题目,发现没有提示,我们试着用御剑扫描目录文件,发现存在robots.txt的文件接着访问这个文件,发现是一段php反序列化代码,我们需要进行序列化的转换简单的构造exp代码如下,在末尾那里<?phperror_re......
  • 转型Web3开发第二课:Dapp开发入门基础 | 01 | 安装MetaMask
    前言完成了《转型Web3开发第一课》之后,得到了不少读者的认可,很多都在问什么时候开始下一课,近期终于抽出了时间开始搞起这第二课。这第二课的主题为「Dapp开发入门基础」,即想要转型做Dapp开发的人员,不管是做前端开发、后端开发、智能合约开发,都需要掌握的基础知识。这......
  • Python从0到100(四十):Web开发简介-从前端到后端(文末免费送书)
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • 基于Java+Ssm+Mysql实现的Java Web酒店管理项目系统设计与实现
    一、前言介绍:1.1项目摘要随着信息技术的快速发展和互联网的普及,传统酒店行业面临着转型升级的压力。为了提高酒店的经营管理水平,提升客户体验,酒店管理系统应运而生。酒店管理系统通过整合酒店内部资源,实现信息的快速传递和处理,为酒店提供了高效、便捷的管理手段。课题“......
  • PolarD&N-CTF靶场web通关记录
    新人尝试,还请见谅!!!web简单swp进题先扫dirsearch然后发现了一个叫做/.index.php.swp的备份文件。访问/.index.php.swp这时我们需要post一个名为xdmtql的变量,然后这个变量不能是数组。不能与/sys.nb/is正则匹配。但是结果的sysnb要在第一位。但是结果的sysnb要在第一位。......
  • thinkPHP+swoole扩展搭建一个websocket连接聊天室(简易版)
    1.服务器搭建好宝塔面板,并开放用于连接websocket的端口:例如9502 2.本地准备好连接的文件,以thinkPHP举例:(1)根目录下的Websocket.php文件(2)前端index入口文件添加test()方法,然后在view目录里添加相应的test.html  test()方法: test.html:  3.打开宝塔面板,放行9502......
  • 从0到1打造一个 WebRTC 应用
    ......
  • [Web] 接口文档工具: Swagger
    0引言1springboot整合swagger2,并配置密码登录认证依赖引入spring-boot.version:2.3.12.RELEASEswagger.version:1.5.14springfox-swagger2.version:2.8.0<!--swagger|start--><!--springfox-swagger2:内部依赖/自动引入swagger-annotations/swagger......
  • Python Web应用的部署与维护
    PythonWeb应用的部署与维护是一个涉及多个环节和技术的复杂过程,涵盖了从项目准备、服务器配置、代码部署到后期监控与维护的全方位工作。以下是对这一过程的详细阐述。一、Web应用的部署1.项目准备在部署之前,首先需要确保PythonWeb项目已经开发完成,并且经过了充分的测......
  • 在webapi中创建一个jwt token
    1.第一步首先创建一个webapi项目2.安装nuget包: Microsoft.AspNetCore.Authentication.JwtBearer3.,然后再Program.cs文件中添加 4.然后运行起来 5.打开jwt.io网站,解密token 关于:iss,sub,exp,iat,nbf更新信息看下图:  ......