使用 Python 实现目标检测

目录

  1. 简介
  2. 环境准备
  3. 数据集
  4. 模型选择
  5. 预处理
  6. 模型加载与推理
  7. 结果可视化
  8. 优化与调参
  9. 部署与应用
  10. 参考资料

简介

目标检测是计算机视觉中的一个重要任务,旨在识别图像或视频中的特定对象并标注它们的位置。近年来,深度学习技术的发展使得目标检测的准确性和效率得到了显著提升。本文将介绍如何使用 Python 和 PyTorch 实现目标检测,并提供详细的代码示例。

环境准备

在开始之前,我们需要安装一些必要的库。确保你的环境中已经安装了 Python 和 pip。以下是需要安装的库:

pip install torch torchvision
pip install matplotlib pillow

数据集

目标检测任务通常需要大量的标注数据。常见的数据集包括 COCO、PASCAL VOC 和 ImageNet 等。这些数据集提供了丰富的图像和对应的标注信息。

下载 COCO 数据集

COCO 数据集是一个大型的目标检测、分割和字幕生成数据集。我们可以从官方网站下载:

wget http://images.cocodataset.org/zips/train2017.zip
wget http://images.cocodataset.org/annotations/annotations_trainval2017.zipunzip train2017.zip -d data/
unzip annotations_trainval2017.zip -d data/

模型选择

PyTorch 提供了多种预训练的目标检测模型,包括 Faster R-CNN、RetinaNet 和 SSD 等。我们将使用 Faster R-CNN 模型,因为它在准确性和速度之间取得了良好的平衡。

加载预训练模型

import torch
import torchvision# 加载预训练的 Faster R-CNN 模型
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
model.eval()

预处理

在进行目标检测之前,需要对输入图像进行预处理。常见的预处理步骤包括缩放、归一化和转换为张量。

定义预处理函数

import torchvision.transforms as Tdef preprocess_image(image_path):# 读取图像image = Image.open(image_path).convert("RGB")# 定义预处理变换transform = T.Compose([T.ToTensor(),])# 应用预处理image_tensor = transform(image)# 添加批次维度image_tensor = image_tensor.unsqueeze(0)return image_tensor, image

模型加载与推理

加载预处理后的图像并进行推理,得到检测结果。

进行推理

import numpy as npdef detect_objects(image_tensor, model, threshold=0.5):with torch.no_grad():predictions = model(image_tensor)# 提取预测结果boxes = predictions[0]['boxes'].cpu().numpy()labels = predictions[0]['labels'].cpu().numpy()scores = predictions[0]['scores'].cpu().numpy()# 过滤掉低置信度的检测结果high_confidence_indices = np.where(scores > threshold)[0]boxes = boxes[high_confidence_indices]labels = labels[high_confidence_indices]scores = scores[high_confidence_indices]return boxes, labels, scores

结果可视化

将检测结果可视化,以便更直观地查看检测效果。

可视化函数

import matplotlib.pyplot as plt
import matplotlib.patches as patchesdef visualize_results(image, boxes, labels, scores, class_names):fig, ax = plt.subplots(1, figsize=(10, 10))ax.imshow(image)for box, label, score in zip(boxes, labels, scores):x_min, y_min, x_max, y_max = boxrect = patches.Rectangle((x_min, y_min), x_max - x_min, y_max - y_min, linewidth=2, edgecolor='r', facecolor='none')ax.add_patch(rect)class_name = class_names[label]ax.text(x_min, y_min, f'{class_name}: {score:.2f}', color='white', fontsize=12, bbox=dict(facecolor='red', alpha=0.5))plt.show()

类别名称

COCO_INSTANCE_CATEGORY_NAMES = ['__background__', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus','train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'N/A', 'stop sign','parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow','elephant', 'bear', 'zebra', 'giraffe', 'N/A', 'backpack', 'umbrella', 'N/A', 'N/A','handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball','kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket','bottle', 'N/A', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl','banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza','donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'N/A', 'dining table','N/A', 'N/A', 'toilet', 'N/A', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone','microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'N/A', 'book', 'clock', 'vase', 'scissors','teddy bear', 'hair drier', 'toothbrush'
]

完整示例

image_path = 'data/train2017/000000000001.jpg'
image_tensor, image = preprocess_image(image_path)
boxes, labels, scores = detect_objects(image_tensor, model)
visualize_results(image, boxes, labels, scores, COCO_INSTANCE_CATEGORY_NAMES)

优化与调参

为了提高目标检测的性能,可以进行以下优化和调参:

数据增强

数据增强可以增加模型的泛化能力。常见的数据增强方法包括随机裁剪、旋转、翻转和颜色抖动等。

模型微调

如果需要在特定数据集上进行目标检测,可以对预训练模型进行微调。微调可以通过以下步骤实现:

  1. 加载预训练模型

    model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
    
  2. 修改分类器

    num_classes = 20  # 例如,PASCAL VOC 数据集有 20 个类别
    in_features = model.roi_heads.box_predictor.cls_score.in_features
    model.roi_heads.box_predictor = torchvision.models.detection.faster_rcnn.FastRCNNPredictor(in_features, num_classes)
    
  3. 训练模型

    import torch.optim as optimdevice = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
    model.to(device)optimizer = optim.SGD(model.parameters(), lr=0.005, momentum=0.9, weight_decay=0.0005)
    num_epochs = 10for epoch in range(num_epochs):model.train()for images, targets in train_loader:images = [image.to(device) for image in images]targets = [{k: v.to(device) for k, v in t.items()} for t in targets]loss_dict = model(images, targets)losses = sum(loss for loss in loss_dict.values())optimizer.zero_grad()losses.backward()optimizer.step()
    

部署与应用

将目标检测模型部署到生产环境中,可以使用多种方式,包括 Flask、Django、FastAPI 等 Web 框架,以及 Docker 容器化技术。

使用 Flask 部署

from flask import Flask, request, jsonify
import ioapp = Flask(__name__)@app.route('/detect', methods=['POST'])
def detect():file = request.files['image']image_bytes = file.read()image = Image.open(io.BytesIO(image_bytes))image_tensor, _ = preprocess_image(image)boxes, labels, scores = detect_objects(image_tensor, model)result = {'boxes': boxes.tolist(),'labels': labels.tolist(),'scores': scores.tolist()}return jsonify(result)if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

使用 Docker 容器化

创建一个 Dockerfile 文件:

FROM python:3.8-slimWORKDIR /appCOPY requirements.txt .
RUN pip install -r requirements.txtCOPY . .CMD ["python", "app.py"]

创建一个 requirements.txt 文件:

torch
torchvision
flask
Pillow

构建并运行 Docker 容器:

docker build -t object-detection-app .
docker run -d -p 5000:5000 object-detection-app

参考资料

  1. PyTorch 官方文档:https://pytorch.org/docs/stable/index.html
  2. TensorFlow 官方文档:https://www.tensorflow.org/api_docs
  3. OpenCV 官方文档:https://docs.opencv.org/master/
  4. COCO 数据集:http://cocodataset.org/
  5. Faster R-CNN 论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
  6. Flask 官方文档:https://flask.palletsprojects.com/en/2.0.x/
  7. Docker 官方文档:https://docs.docker.com/

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 Android 单元测试 No tests found for given includes:

问题 报错: Execution failed for task :testDebugUnitTest. > No tests found for given includes: 解决方案 1、一开始以为是没有给测试类加public修饰 2、然后替换 Test 注解的包可以解决,将 org.junit.jupiter.api.Test 修改为 org.junit.Tes…

服务机器人三甲坎德拉:用智能化开启售后服务新篇章

随着市场需求快速增长,专注自动驾驶服务机器人研发的坎德拉近年来实现了快速发展,并且通过技术创新与优质服务收获了良好口碑。为了不断提升售后服务质量和客户服务水平,坎德拉与新一代智能客户服务解决方案提供商售后宝共同打造智能化的售后…

3D建筑模型的 LOD 规范

LOD(细节层次) 是3D城市建模中用于表示建筑模型精细程度的标准化描述不同的LOD适用于不同的应用场景 LOD是3D建模中重要的分级标准,不同层级适合不同精度和用途的需求。 从LOD0到LOD4,细节逐渐丰富,复杂性和精度也逐…

递归------深度优先搜索

深度优先搜索(Depth-First Search,简称DFS)是一种用于遍历或搜索树或图的算法。它从一个顶点开始,尽可能深地搜索树的分支。深度优先搜索沿着一条路径深入,直到无法继续为止,然后回溯并尝试其他路径。这种搜…

蓝桥杯c++算法学习【5】之枚举与模拟(卡片、回文日期、赢球票、既约分数:::非常典型的比刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! !!! 关注博主,更多蓝桥杯nice题目静待更新:) 枚举与模拟 一、卡片: 【问题描述】 小蓝有很多数字卡片,每张卡片上都…

相机网卡开启巨型帧和关闭节能模式方法

2022 年 8 月 2 日 Tank 阅读次数(ip/1年): 26,796 win10为例子 首先在开始菜单搜索:网络连接 对想要设置的网络右键:属性 点 配置 高级里面找到这三个选项,参考下图设置,螃蟹网卡建议关掉所有节能有关的…

Windows server2016设置多用户界面——保姆级教程

在 Windows Server 2016 服务器中,通常默认情况下能够支持两个用户进行远程登录。而通过在服务器上安装远程桌面服务中的远程桌面会话主机和远程桌面授权,并对其进行相应配置,便可以实现多用户远程登录。 远程桌面服务是一种由若干角色服务所…

第一个autogen与docker项目

前提条件:在windows上安装docker 代码如下: import os import autogen from autogen import AssistantAgent, UserProxyAgentllm_config {"config_list": [{"model": "GLM-4-Plus","api_key": "your api…

后端开发详细学习框架与路线

🚀 作者 :“码上有前” 🚀 文章简介 :后端开发 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 为帮助你合理安排时间,以下是结合上述学习内容的阶段划分与时间分配建议。时间安排灵活&a…

【Isaac Sim】相关问题汇总

目录 一、安装点击Install时报错二、启动时报 Failed to create any GPU devices三、加载Isaac Sim自带模型或示例时报 Isaac Sim is not responding 一、安装点击Install时报错 报错: request to https://asset.launcher.omniverse.nvidia.com/… failed, reason:…

社团管理智能化:SpringBoot技术

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

【C++】继承(inheritance)

引入 假设我们有一个动物类 class Animal { public:int age;void eat() {std::cout << "吃东西&#xff01;" << std::endl;} };又想写一个狗类&#xff0c;它也有年龄&#xff0c;也会吃&#xff0c;除此之外还有种类 class Dog { public:const char…

Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(二)

Oracle - 多区间按权重取值逻辑 &#xff0c;分时区-多层级-取配置方案https://blog.csdn.net/shijianduan1/article/details/133386281 某业务配置表&#xff0c;按配置的时间区间及组织层级取方案&#xff0c;形成报表展示出所有部门方案的取值&#xff1b; 例如&#xff0…

电子应用设计方案-19:智能云饭锅系统方案设计

智能云饭锅系统方案设计 一、系统概述 本智能云饭锅系统旨在提供便捷、个性化和智能化的烹饪体验&#xff0c;结合云服务实现远程控制、食谱推荐和烹饪数据管理等功能。 二、系统组成 1. 锅体 - 采用高品质的不粘涂层内胆&#xff0c;确保米饭受热均匀且易于清洁。 - 具备良好…

镁光MT25QU01GXXX norflash调试笔记

目录 前言一、芯片概述二、数据手册解释1. 数据手册获取2.内容概括 三、几个操作的代码1.复位芯片操作2.读取芯片ID3.擦除芯片扇区4.向芯片存入数据5.读取存储的数据6.其它操作函数 前言 本笔记总结如何使用MCU对nor flash进行数据存储&#xff0c;包括芯片基本介绍&#xff0…

Qt界面设计时使各控件依据窗口缩放进行栅格布局的方法

图1 最终效果 想要达成上述图片的布局效果&#xff0c;具体操作如下&#xff1a; 新建一窗体&#xff1a; 所需控件如下&#xff1a; Table View控件一个&#xff1b; Group Box控件一个&#xff1b; Push Button控件2个&#xff1b; Horiziontal Spacer控件2个&#xf…

【Git】:Git基本操作

目录 创建、配置本地仓库 创建本地仓库 配置本地仓库 认识工作区、暂存区、版本库 修改文件 版本回退 撤销修改 删除文件 创建、配置本地仓库 创建本地仓库 我们通常可以通过以下两种方式之一获取 Git 存储库&#xff1a; 自己在本地目录创建一个本地仓库 从其它服务…

CANDENCE: 绘制好的封装元件 刷新(Refresh) 和 替换 (Replace)焊盘

绘制好的封装元件 刷新(Refresh) 和 替换 &#xff08;Replace&#xff09;焊盘 一、刷新(Refresh) 1、以下面这个bga484封装的元件为例 2、打开bga的焊盘文件 3、我们对上面这个焊盘稍加修改&#xff0c;如下&#xff0c;然后保存 4、在封装编辑页面&#xff0c;如下操作 5…

HarmonyOS:使用ArkWeb构建页面

一、简介 页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 页面加载过程中&#xff0c;若涉及网络资源获取&#xff0c;需要配置ohos.permission.INTERNET网络访问权限。 二、…

修改一下达梦disql 提示符

经常用disql的有时某些信息希望提示一下&#xff0c;默认的只显示SQL> 为了方便使用&#xff0c;可以在 glogin.sql 中增加些内容。 vi $DM_HOME/bin/disql_conf/glogin.sql增加以下几行 set time on set lineshow offcol global_name new_value global_name SELECT ins…