当前位置: 首页 > news >正文

Python入门到实战:手把手教你调用DAMOYOLO-S完成目标检测

Python入门到实战:手把手教你调用DAMOYOLO-S完成目标检测

你是不是觉得AI目标检测听起来很高深,需要复杂的数学和大量的代码?其实,借助一些强大的开源工具,用Python写几十行代码就能实现。今天,我就带你从零开始,一步步用Python调用DAMOYOLO-S模型,完成一个简单的目标检测任务。整个过程就像搭积木,你只需要跟着做,就能看到电脑识别出图片里的物体,非常有成就感。

DAMOYOLO-S是一个轻量级但性能不错的目标检测模型,特别适合我们新手入门。它速度快,精度也够用,用来检测常见的猫狗、车辆、行人完全没问题。学完这篇教程,你不仅能掌握调用AI模型的基本流程,还能亲手做出一个能“看懂”图片的小程序。

1. 环境准备:搭建你的Python工作台

工欲善其事,必先利其器。我们先来把需要的工具都准备好。整个过程很简单,就像安装手机APP一样。

1.1 安装Python和必备工具

首先,确保你的电脑上安装了Python。我推荐使用Python 3.8或3.9版本,这两个版本比较稳定,兼容性好。你可以打开命令行(Windows上是CMD或PowerShell,Mac/Linux上是Terminal),输入python --version来检查。如果显示了版本号,比如“Python 3.9.13”,那就没问题。

如果没有安装,去Python官网下载安装包,记得在安装时勾选“Add Python to PATH”这个选项,这样系统才能找到Python命令。

接下来,我们需要一个写代码的地方。你可以用任何文本编辑器,但我强烈推荐使用Visual Studio Code (VS Code)。它免费、功能强大,对新手特别友好。安装好VS Code后,再安装一个叫“Python”的扩展,这样写代码时就有智能提示和语法高亮了,非常方便。

1.2 安装必要的Python库

我们需要几个Python库来帮忙。打开你的命令行,一条一条输入下面的命令来安装。如果遇到网络慢的情况,可以在命令最后加上-i https://pypi.tuna.tsinghua.edu.cn/simple来使用国内的镜像源加速。

pip install opencv-python pip install numpy pip install requests pip install Pillow

我来简单解释一下这几个库是干什么的:

  • opencv-python: 这是处理图片和视频的“瑞士军刀”,我们用它来读取图片、画框、显示结果。
  • numpy: Python里做数学计算的核心库,很多AI模型的数据处理都依赖它。
  • requests: 一个非常简单的库,用来从网上下载东西,比如我们的模型文件。
  • Pillow: 另一个处理图片的库,有时候比OpenCV更轻便。

安装过程可能会花一两分钟,看到“Successfully installed”就表示成功了。

2. 获取模型:让AI拥有“视力”

现在,我们需要让程序拥有“视力”,也就是目标检测模型。DAMOYOLO-S的模型文件通常以.onnx格式提供,这是一种通用的模型格式,很多框架都能调用。

2.1 下载模型文件

我们可以直接从项目的官方发布页面或者一些模型仓库下载。为了教程的连贯性,我准备了一个示例模型文件的下载链接(请注意,实际开发中请使用官方最新发布的模型)。我们将用requests库来下载它。

在你的代码文件夹里,新建一个Python文件,比如叫object_detection.py。然后,把下面这段代码复制进去。这段代码的作用就是去网上下载模型文件,并保存到你的电脑里。

import requests import os def download_file(url, save_path): """ 从指定的URL下载文件,并保存到本地路径。 """ print(f"正在下载模型文件...") response = requests.get(url, stream=True) response.raise_for_status() # 检查请求是否成功 # 确保保存的文件夹存在 os.makedirs(os.path.dirname(save_path), exist_ok=True) # 以二进制写入模式打开文件,并分块下载写入,适合大文件 with open(save_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) print(f"模型文件已保存至: {save_path}") # 示例模型下载链接(请替换为实际可用的链接) # 这里是一个假设的链接,你需要替换成真实的DAMOYOLO-S ONNX模型链接 model_url = "https://example.com/path/to/damoyolo_s.onnx" # 请替换! local_model_path = "./models/damoyolo_s.onnx" # 执行下载 download_file(model_url, local_model_path)

重要提示: 上面代码里的model_url是一个示例链接,你需要把它替换成真实的、有效的DAMOYOLO-S ONNX模型文件地址。你可以去DAMOYOLO的GitHub仓库的“Releases”页面寻找,或者在一些模型平台(如Hugging Face Model Hub)上搜索“damoyolo-s onnx”。

2.2 准备一张测试图片

模型有了,我们还需要一张让它“看”的图片。你可以用手机拍一张包含猫、狗、汽车或者杯子的照片,或者直接从网上下载一张。把这张图片放在你的代码文件夹里,重命名为test_image.jpg

如果暂时没有合适的图片,我们也可以用代码生成一张简单的测试图,或者用OpenCV画一个。这里我们先假设你已经有了一张test_image.jpg

3. 核心实战:三步完成目标检测

最激动人心的部分来了!我们将把准备工作串联起来,完成加载模型、识别物体、画出结果这三步。

3.1 第一步:加载模型并读取图片

首先,我们需要用OpenCV读取图片,并准备好模型需要的输入数据格式。ONNX模型通常需要一个叫onnxruntime的库来运行。我们先安装它:pip install onnxruntime

然后,看下面的代码:

import cv2 import numpy as np import onnxruntime as ort # 1. 加载我们已经下载好的ONNX模型 model_path = "./models/damoyolo_s.onnx" session = ort.InferenceSession(model_path) # 创建一个推理会话 # 获取模型输入输出的名称,后面会用到 input_name = session.get_inputs()[0].name output_names = [output.name for output in session.get_outputs()] # 2. 用OpenCV读取测试图片 image_path = "./test_image.jpg" original_image = cv2.imread(image_path) if original_image is None: print(f"错误:无法读取图片,请检查路径 {image_path}") exit() # 显示一下原始图片看看 cv2.imshow('Original Image', original_image) cv2.waitKey(1000) # 显示1秒 cv2.destroyAllWindows() # 3. 图片预处理:将图片调整到模型要求的大小,并转换格式 # 假设DAMOYOLO-S模型要求输入为640x640的RGB图像,且数值归一化到0-1 input_size = (640, 640) # 具体尺寸请查阅你所使用模型的文档 # 将BGR格式(OpenCV默认)转换为RGB格式 image_rgb = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB) # 调整图片尺寸 image_resized = cv2.resize(image_rgb, input_size) # 将像素值从0-255转换到0-1的浮点数,并调整维度顺序为 (批次数, 通道数, 高, 宽) input_tensor = image_resized.astype(np.float32) / 255.0 input_tensor = np.transpose(input_tensor, (2, 0, 1)) # 从 (H,W,C) 变为 (C,H,W) input_tensor = np.expand_dims(input_tensor, axis=0) # 增加批次维度,变成 (1, C, H, W) print("图片预处理完成,输入数据形状:", input_tensor.shape)

这段代码做了三件事:加载模型、读取你的照片、把照片转换成模型能“吃”下去的格式(调整大小、转换颜色、归一化数字)。

3.2 第二步:运行模型,得到检测结果

模型“吃”下数据后,就会“吐”出检测结果。这一步非常简单,就一行核心代码。

# 4. 运行模型进行推理(预测) outputs = session.run(output_names, {input_name: input_tensor}) print("模型推理完成!") print(f"输出数量:{len(outputs)}") # 通常,目标检测模型的输出会比较复杂,可能包含框的位置、置信度、类别等 # 我们需要根据DAMOYOLO-S具体的输出格式来解析 # 这里假设第一个输出是包含所有检测框信息的数组 detections = outputs[0] print(f"检测到的原始数据形状:{detections.shape}")

outputs变量里就装着模型找到的所有可疑物体的信息,比如“这里可能有一只猫,坐标是X,Y,可信度是85%”。不过,这些信息还是原始数据,我们需要下一步来解读它。

3.3 第三步:解析结果并画在图片上

原始数据是一堆数字,我们需要从中提取出我们能看懂的信息:是什么物体、在哪里、有多确信。然后把这些信息用框和文字标在原来的图片上。

# 5. 解析模型的输出结果 # 注意:不同的模型输出格式不同,以下解析逻辑需要根据你使用的DAMOYOLO-S具体版本来调整 # 这里提供一个常见的YOLO系列输出解析示例 def parse_detections(detections, original_image, input_size): """ 解析检测结果,并在原图上绘制边界框。 这是一个示例函数,你需要根据模型实际输出调整。 """ img_height, img_width = original_image.shape[:2] scale_x = img_width / input_size[0] scale_y = img_height / input_size[1] # 假设detections的形状是 [1, N, 6],其中N是检测框数量,6代表 [x1, y1, x2, y2, 置信度, 类别ID] # 这只是假设,务必查阅你的模型文档! drawn_image = original_image.copy() for det in detections[0]: # 遍历所有检测框 # 提取坐标、置信度和类别 x1, y1, x2, y2, conf, class_id = det # 如果置信度太低,忽略这个检测 if conf < 0.5: # 置信度阈值,可以调整 continue # 将坐标从模型输入尺寸(640x640)映射回原始图片尺寸 x1 = int(x1 * scale_x) y1 = int(y1 * scale_y) x2 = int(x2 * scale_x) y2 = int(y2 * scale_y) # 为不同的类别准备不同的颜色(这里简单用类别ID*50来区分) color = (int(class_id * 50) % 255, int(class_id * 100) % 255, int(class_id * 150) % 255) # 在图片上画矩形框 cv2.rectangle(drawn_image, (x1, y1), (x2, y2), color, 2) # 准备标签文字:类别ID和置信度 label = f"Class {int(class_id)}: {conf:.2f}" # 计算文字背景框的大小 (label_width, label_height), baseline = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2) # 画一个填充矩形作为文字背景 cv2.rectangle(drawn_image, (x1, y1 - label_height - baseline), (x1 + label_width, y1), color, -1) # 在背景上写白色文字 cv2.putText(drawn_image, label, (x1, y1 - baseline), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2) return drawn_image # 调用函数解析并绘制结果 result_image = parse_detections(detections, original_image, input_size) # 6. 展示最终结果 cv2.imshow('Detection Result', result_image) print("检测结果已显示,按任意键关闭窗口。") cv2.waitKey(0) # 等待按键 cv2.destroyAllWindows() # 可选:保存结果图片 cv2.imwrite('./detection_result.jpg', result_image) print("结果图片已保存为 'detection_result.jpg'")

运行完这段代码,你应该会看到一个弹窗,里面是你原来的图片,但上面多了彩色的框和标签,标出了模型识别到的物体。第一个数字是类别(比如0代表‘人’,1代表‘自行车’,具体看模型训练时的定义),第二个数字是置信度,越高表示模型越确信。

4. 完整代码与下一步建议

为了方便你直接运行,我把上面关键的步骤整合成一个完整的、可以执行的脚本。你需要做的就是:1. 准备好真实的模型文件链接;2. 准备一张测试图片。

# object_detection_complete.py import cv2 import numpy as np import onnxruntime as ort import requests import os # ---- 第一部分:下载模型(只需运行一次)---- def download_model(): model_url = "YOUR_ACTUAL_MODEL_DOWNLOAD_LINK_HERE" # !!!请务必替换成真实链接!!! local_path = "./models/damoyolo_s.onnx" if not os.path.exists(local_path): print("未找到本地模型,开始下载...") os.makedirs(os.path.dirname(local_path), exist_ok=True) response = requests.get(model_url, stream=True) with open(local_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) print("模型下载完成。") else: print("本地模型已存在,跳过下载。") return local_path # ---- 第二部分:主检测流程 ---- def main(): # 1. 确保模型存在 model_path = download_model() # 2. 加载模型 session = ort.InferenceSession(model_path) input_name = session.get_inputs()[0].name # 3. 加载图片 img_path = "./test_image.jpg" # 请确保此图片存在 img = cv2.imread(img_path) if img is None: print(f"错误:找不到图片 {img_path}") return # 4. 图片预处理 input_size = (640, 640) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_resized = cv2.resize(img_rgb, input_size) input_tensor = img_resized.astype(np.float32) / 255.0 input_tensor = np.transpose(input_tensor, (2, 0, 1)) input_tensor = np.expand_dims(input_tensor, axis=0) # 5. 模型推理 outputs = session.run(None, {input_name: input_tensor}) detections = outputs[0] # 根据你的模型调整索引 # 6. 解析并绘制结果 (这里需要你根据模型输出格式完善parse_detections函数) # result_img = your_parse_function(detections, img, input_size) # 由于不同版本模型输出格式差异大,这里先简单显示原始图片 cv2.imshow('Original Image (Need Custom Parser)', img) cv2.waitKey(0) cv2.destroyAllWindows() print("流程执行完毕!请根据你的模型输出格式,完善结果解析函数。") if __name__ == "__main__": main()

最重要的提醒:这个完整脚本里的parse_detections函数是个空壳。因为不同的DAMOYOLO-S模型版本(比如v1, v2, tiny版)输出数据的格式可能完全不同。要让它真正工作,你必须去查阅你所下载的那个特定模型文件的文档,搞清楚它的输出到底是个什么结构(是几个数组?每个数组的形状和含义是什么?),然后根据文档来重写这个解析函数。这是从“跑通Demo”到“真正理解”的关键一步。

5. 总结

走完这一趟,你应该已经成功让程序“看见”并识别物体了。整个过程其实就几个核心步骤:搭环境、下模型、读图片、送进模型、解读结果、画出来。对于新手来说,最大的挑战可能不是写代码,而是理解模型输入输出的数据格式,以及如何根据官方文档调整预处理和后处理的代码。

我建议你接下来可以多做两件事:第一,用不同的图片(比如街景、室内照片)去测试,看看模型的识别效果怎么样,哪些物体认得好,哪些容易认错。第二,尝试去GitHub上找到DAMOYOLO项目的官方示例代码,对比一下他们的解析方式,这样能帮你更快地写出正确的解析函数。

目标检测是AI视觉里非常基础又实用的一个领域。通过这个小小的项目,你不仅学会了调用一个现成的模型,更重要的是摸清了AI应用开发的基本 pipeline。有了这个基础,以后再去玩图像分类、风格迁移、甚至是文生图模型,你会发现思路都是相通的。编程和AI学习就是这样,动手做一次,比看十遍理论都管用。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.cnnetsun.cn/news/1357304.html

相关文章:

  • VASP6.4.2安装vtstcode-199避坑指南:为什么make顺序错了会失败?
  • lychee-rerank-mm环境配置:Ubuntu 22.04 + CUDA 12.1 + PyTorch 2.3适配清单
  • OpenClaw技能生态实战:用ollama-QwQ-32B自动生成周报并邮件发送
  • 快速构建Multisim 14.0安装引导原型:用快马AI十分钟打造可视化教程助手
  • WorkshopDL终极方案:跨平台游戏模组下载的高效实践
  • Llama Factory效果展示:微调前后对比,AI对话质量显著提升案例
  • 霜儿-汉服-造相Z-Turbo与Claude Code对比:不同AI模型在创意编程中的角色
  • 如何在OBS中为音频源添加VST插件:一个技术实现视角
  • Qwen3智能字幕对齐教程:清音刻墨错误对齐定位与人工修正快捷键大全
  • Linux下Matplotlib中文乱码终极解决方案:从字体安装到全局配置(附SimHei.ttf下载)
  • 美胸-年美-造相Z-Turbo:不止是快,实测主体一致性、细节丰富度大幅提升
  • R语言矩阵操作避坑指南:如何快速定位和解决‘subscript out of bounds‘错误
  • 基于SiameseAOE的Java面试题智能解析与观点抽取应用
  • Jupyter Notebook虚拟环境缺失?三步快速配置ipykernel的实战指南
  • 【目标跟踪】Anti-UAV数据集:多模态挑战与评估标准深度解析
  • Microsoft Teams与Outlook邮件组联动:5分钟搞定团队创建与成员同步
  • Docker容器中文乱码终极解决方案:Ubuntu镜像下5步搞定(附字体包)
  • 生态模型避坑指南:七鳃鳗性别比例建模中的常见错误与解决方案
  • Cosmos-Reason1-7B在.NET生态中的应用:开发智能C#桌面应用
  • 【香橙派镜像实战指南】从选型到环境配置的避坑与优化
  • 在Windows上运行Android应用:WSABuilds完整指南
  • HslCommunication实战:5分钟搞定西门子S7-1200 PLC数据读写(附C#代码)
  • PaddleOCR-VL-WEB在办公场景实战:自动识别表格公式图表
  • Nanbeige 4.1-3B智能代理开发:从基础概念到实战项目
  • SDXL-Turbo实操手册:提示词中逗号分隔与逻辑连接词(and/or)效果实测
  • 腾讯云轻量服务器避坑指南:Ubuntu 20.04下僵尸毁灭工程专用swap分区配置全流程
  • Python逆向实战:手把手教你破解网易云音乐评论加密(2024最新版)
  • Debian12容器环境apt换源指南:DEB822格式与国内镜像源实战
  • 别再让FormData坑你了!Minio前端直传的正确姿势(SpringBoot + Axios实战)
  • VMware虚拟机沙箱:在隔离环境中安全测试霜儿-汉服-造相Z-Turbo的不同部署版本