简介:
利用gradio设计一个web运用,实现图片主体物的识别。
1)用户可以通过网页提交一张图片。
2)web应用将输出这张图片中主体物的名称(中英文都可以)。
3)可以使用预训练的模型。
利用预训练实现对物体识别
准备工作
在开始之前,请确保你的环境中已安装了以下依赖:
- Python 3.7+
- OpenCV
- Numpy
- Ultralytics(包含YOLOv8模型)
- Gradio
一、gradio
1、简介
Gradio 是一个开源的 Python 库,它允许数据科学家、机器学习工程师和研究人员快速创建交互式的 UI(用户界面),以便于测试和演示机器学习模型。Gradio 提供了一种简单直观的方式来可视化模型的输入和输出,而无需深入学习前端开发或 Web 开发技术。
特点:
- 易用性:Gradio 的 API 设计简洁,只需几行代码即可创建功能完备的 Web 界面。
- 灵活性:支持多种输入类型(如文本、图像、音频、视频、数字等)和输出类型(如文本、图像、表格、分类标签等)。
- 实时反馈:模型的输入变化会立即反映在输出上,非常适合调试和模型迭代。
- 兼容性:可以与各种机器学习框架(如 TensorFlow、PyTorch、Scikit-Learn 等)无缝集成。
- 部署选项:可以本地运行,也可以通过 Gradio Cloud 免费在线分享或部署应用。
- 文档和社区:拥有详尽的文档和活跃的社区支持,便于学习和解决问题。
使用场景:
- 模型测试:在模型训练过程中快速测试不同输入的效果。
- 演示和教育:向非技术背景的观众展示模型的工作原理。
- 客户反馈:收集最终用户对模型预测的反馈。
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