yolo如何画框、如何变换目标检测框的颜色和粗细、如何运行detect脚本

这段代码是一个使用YOLO模型进行目标检测的Python脚本。下面我将逐步解释脚本的主要部分,并提供一些关于超参数的使用方法。
在这里插入图片描述

1. 脚本结构

  • 导入相关库
  • 设置配置参数
  • 加载YOLO模型
  • 运行目标检测
  • 处理检测结果
  • 显示或保存结果

2. 超参数说明

  • --weights: 指定YOLO模型的权重文件路径。
  • --source: 指定输入数据源,可以是图像文件、视频文件、摄像头设备或包含文件路径的文本文件。
  • --img-size: 指定图像的输入尺寸,用于调整模型的输入大小。
  • --conf-thres: 目标置信度阈值,低于该阈值的目标将被过滤掉。
  • --iou-thres: 非极大值抑制(NMS)的IOU(交并比)阈值,用于合并重叠的边界框。
  • --device: 指定计算设备,可以是GPU编号或’cpu’。
  • --view-img: 是否显示检测结果图像。
  • --save-txt: 是否保存目标框信息到文本文件。
  • --save-conf: 是否保存目标置信度到文本文件(在--save-txt启用时有效)。
  • --nosave: 是否禁止保存检测结果的图像或视频。
  • --classes: 指定要检测的目标类别,可以是一个或多个类别的索引。
  • --agnostic-nms: 是否使用类别无关的NMS。
  • --augment: 是否使用数据增强进行推理。
  • --update: 是否更新所有模型。
  • --project: 结果保存的项目路径。
  • --name: 结果保存的名称。
  • --exist-ok: 是否允许覆盖现有的项目/名称。

3. 代码解释

  • detect()函数:主要负责加载模型、运行目标检测、处理检测结果以及保存结果等操作。
  • 通过LoadStreamsLoadImages选择数据加载方式,分别用于摄像头流和图像/视频加载。
  • detect_image()函数调用模型进行目标检测,然后应用NMS(非极大值抑制)和可选的分类器。
  • 处理检测结果,包括绘制检测框、标签和单目测距。
  • 结果可以选择显示在窗口中或保存为图像或视频。

4. 超参数的使用

python detect.py --weights weights/v5lite-s.pt --source data/images/ --img-size 640 --conf-thres 0.45 --iou-thres 0.5 --view-img

这是一个使用示例,其中--weights指定了模型权重文件的路径,--source指定了输入图像的路径,--img-size设置了输入图像的尺寸,--conf-thres--iou-thres分别设置了目标置信度和NMS的IOU阈值。--view-img用于显示检测结果图像。
在这里插入图片描述

在这段代码中,目标框的颜色和单目测距取点的逻辑主要集中在draw_boxes()函数和plot_one_box()函数中。这两个函数用于在图像上绘制检测到的目标框,并根据条件确定框的颜色以及添加单目测距的信息。

draw_boxes()函数:

def draw_boxes(detections, image, colors):for detection in detections:x, y, w, h = detection[2][0], detection[2][1], detection[2][2], detection[2][3]label = detection[0]color = colors[label]cv2.rectangle(image, (int(x - w/2), int(y - h/2)), (int(x + w/2), int(y + h/2)), color, 2)cv2.putText(image, label, (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

在这个函数中,detections是目标检测的结果,其中包含了每个目标的坐标、大小、置信度等信息。colors是一个列表,包含了不同类别的目标框颜色。函数通过遍历detections,为每个目标框绘制矩形和标签,并使用colors中的颜色。

plot_one_box()函数:

def plot_one_box(xyxy, im0, label=None, color=None, line_thickness=None):tl = line_thickness or round(0.002 * max(im0.shape[0:2])) + 1  # line/font thicknesscolor = color or [random.randint(0, 255) for _ in range(3)]c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3]))cv2.rectangle(im0, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)if label:tf = max(tl - 1, 1)  # font thicknesst_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3cv2.rectangle(im0, c1, c2, color, -1, cv2.LINE_AA)  # filledcv2.putText(im0, label, (c1[0], c1[1] - 2), cv2.FONT_HERSHEY_SIMPLEX, tl / 3, [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA)

这个函数用于在图像上绘制一个目标框,它接受目标框的坐标(xyxy)、原始图像(im0)、标签(label)、颜色(color)和线条厚度(line_thickness)作为输入。它会在图像上绘制一个矩形框,填充矩形内的标签,并根据条件设置矩形的颜色。

在这里,color参数可以手动设置,也可以根据目标的测距结果(distance)来动态设置,以区分不同的距离范围,从而实现目标框颜色的动态变化。
YOLO(You Only Look Once)是一种实时目标检测算法,detect.py文件是YOLO的一个脚本,用于在图像或视频上运行已经训练好的YOLO模型并检测目标。

以下是对detect.py主要部分的简要解释,包括目标框颜色、单目测距取点等方面。

1. 导入必要的库和模块

import cv2
import numpy as np
from darknet import Darknet
from util import *

这部分代码导入了需要的Python库和自定义的模块。darknet模块通常包含YOLO的网络结构,而util模块包含一些工具函数。

2. 加载配置文件和权重文件

def load_network(cfgfile, weightfile):net = Darknet(cfgfile)net.load_weights(weightfile)return net

这个函数用于加载YOLO的配置文件(.cfg)和权重文件(.weights)并返回一个YOLO网络。

3. 运行目标检测

def detect(cfgfile, weightfile, imgfile):net = load_network(cfgfile, weightfile)image = cv2.imread(imgfile)sized = cv2.resize(image, (net.width, net.height))detections = detect_image(net, imgfile)return detections

这个函数调用load_network加载YOLO网络,然后调用detect_image进行目标检测。detect_image函数通常包含了YOLO的前向传播过程,根据模型输出的预测框和类别信息,返回检测到的目标。

4. 处理检测结果

detections = detect(cfgfile, weightfile, imgfile)
draw_boxes(detections, image, colors)
cv2.imshow('predictions', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里调用了detect函数获取目标检测结果,然后使用draw_boxes函数将检测结果绘制在原图上,给不同的类别框上不同的颜色。

5. 目标框颜色和单目测距取点

具体实现可能会在draw_boxes函数中进行。这个函数通常会遍历检测到的目标框,为每个目标框绘制矩形,并根据目标的类别给框上不同的颜色。单目测距和取点的功能通常不在YOLO的基础代码中,可能需要根据具体需求在其他函数中实现。

以下是一个简化的例子:

def draw_boxes(detections, image, colors):for detection in detections:x, y, w, h = detection[2][0], detection[2][1], detection[2][2], detection[2][3]label = detection[0]color = colors[label]cv2.rectangle(image, (int(x - w/2), int(y - h/2)), (int(x + w/2), int(y + h/2)), color, 2)cv2.putText(image, label, (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

在这个例子中,假设detections是一个包含目标信息的列表,colors是一个字典,将不同的类别映射到不同的颜色。draw_boxes函数遍历检测到的目标框,绘制矩形和类别标签,并根据类别选择颜色。这里只是一个简化的例子,实际应用中可能需要更复杂的处理逻辑。
需要注意的是,根据测距结果设置颜色的逻辑可能需要根据具体的测距方法和要求进行修改。在这个例子中,通过比较distance和阈值来判断目标的距离,并选择相应的颜色进行标记。在实际应用中,可能需要更复杂的逻辑来处理不同的距离范围。
在这里插入图片描述

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

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

相关文章

Semantic Kernel 学习笔记2

本来想白瞟免费Bing Search API如下,但是报错无法链接利用免费的必应 Bing 自定义搜索打造站内全文搜索_bing_subscription_key-CSDN博客 改成按照官方推荐申请,并在.env文件中添加BING_API_KEY""字段。 1. 打开https://www.microsoft.com/en-…

Eigen的基操

转自博客 博客

【Spring Boot】034-Spring Boot 整合 JUnit

【Spring Boot】034-Spring Boot 整合 JUnit 文章目录 【Spring Boot】034-Spring Boot 整合 JUnit一、单元测试1、什么是单元2、什么是单元测试3、为什么要单元测试 二、JUnit1、概述简介特点 2、JUnit4概述基本用法 3、JUnit5概述组成 4、JUnit5 与 JUnit4 的常用注解对比 三…

AR工业眼镜:智能化生产新时代的引领者!!

科技飞速发展,人工智能与增强现实(AR)技术结合正在改变生活工作方式。AR工业眼镜在生产领域应用广泛,具有实时信息展示、智能导航定位、远程协作培训、智能安全监测等功能,提高生产效率、降低操作风险,为企…

算法训练 第七周

一、最小栈 本题要求我们实现一个最小栈数据结构,要求它可以实现栈的基本功能,并且还能使用常数时间复杂度来获取栈中的最小值。 1.辅助栈 我们可以在普通栈的基础上再添加一个维护最小值的辅助栈来实现这个数据结构,我们先创建一个普通的栈…

docker搭建etcd集群

最近用到etcd,就打算用docker搭建一套,学习整理了一下。记录在此,抛砖引玉。 文中的配置、代码见于https://gitee.com/bbjg001/darcy_common/tree/master/docker_compose_etcd 搭建一个单节点 docker run -d --name etcdx \-p 2379:2379 \…

[html] 动态炫彩渐变背景

废话不多说&#xff0c;直接上源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>ZXW-NUDT: 动态炫…

【算法与数据结构】78、90、LeetCode子集I, II

文章目录 一、题目二、78.子集三、90.子集II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、78.子集 思路分析&#xff1a;【算法与数据结构】77、LeetCode组合。本题可以参考77题的组合问题代码&#xff0…

Flutter有状态组件StatefulWidget生命周期

StatefulWidget是Flutter中的一个有状态的组件&#xff0c;它的生命周期相对复杂一些。下面是StatefulWidget的生命周期方法及其调用顺序&#xff1a; 1. createState(): 当StatefulWidget被插入到Widget树中时&#xff0c;会调用createState()方法来创建与之关联的State对象。…

@Async注解的坑

问题描述 一个方法调用另一个方法(该方法使用Async注解)在同一个类文件中&#xff0c;该注解会失效&#xff01; 问题复现 TestAsyncController 类 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; im…

git快速上传代码

① git init&#xff1b; 初始化git&#xff0c;之后在文件夹里有.git文件&#xff0c;这个需要 勾选才能查看。 ② git remote add test myFisrtTest: 测试专用 这里的test是自定义的&#xff0c;myFisrtTest: 测试专用 是远程仓库 ③ git branch -a 这里是查看分支 ④ …

react函数式组件props形式子向父传参

父组件中定义 子组件中触发回调传值 import { useState } from "react"; function Son(params) {const [count, setCount] useState(0);function handleClick() {console.log(params, paramsparamsparamsparamsparamsparams);params.onClick(111)setCount(count 1…

阿里云容器镜像服务的运维总结

一、背景 容器镜像服务&#xff0c;作为一个可选付费产品&#xff0c;主要作用是存储docker的镜像仓库&#xff0c;供k8s拉取到Pod节点里。 你可以自己搭建一个harbor镜像仓库&#xff0c;在公司的开发环境下&#xff0c;将image推送到仓库&#xff1b;然后在生产k8s从仓库拉取…

如果不用Baklib,哪一个帮助中心工具能够替代它?

在各行各业进入“留量时代”的当下&#xff0c;让用户获得良好的体验和留存老客户变得更为关键&#xff0c;这对于企业的客户服务提出了更高的要求。在使用各类互联网产品时&#xff0c;用户更倾向于通过自助方式寻找答案并解决问题&#xff0c;因此帮助中心的重要性也在不断提…

mysql之MHA

1、定义 全称是masterhigh avaliabulity。基于主库的高可用环境下可以实现主从复制及故障切换&#xff08;基于主从复制才能故障切换&#xff09; MHA最少要求一主两从&#xff0c;半同步复制模式 2、作用 解决mysql的单点故障问题。一旦主库崩溃&#xff0c;MHA可以在0-30…

μC/OS-II---时间管理(os_time.c)

目录 时间管理相关&#xff08;os_time.c&#xff09;Task延迟按时、分、秒、毫秒延时恢复被延时的Task返回系统当前的Tick计数值设置系统的Tick计数值 时间管理相关&#xff08;os_time.c&#xff09; Task延迟 void OSTimeDly (INT32U ticks) {INT8U y; #if OS_CRITI…

为什么UI自动化难做?—— 关于Selenium UI自动化的思考

在快速迭代的产品、团队中&#xff0c;UI自动化通常是一件看似美好&#xff0c;实际“鸡肋”&#xff08;甚至绝大部分连鸡肋都算不上&#xff09;的工具。原因不外乎以下几点&#xff1a; 1 效果有限 通常只是听说过&#xff0c;就想去搞UI自动化的团队&#xff0c;心里都认…

idea生成代码(一):实现java语言的增删改查功能(基于EasyCode插件)支持自定义模板【非常简单】

idea生成代码&#xff08;一&#xff09;&#xff1a;实现java语言的增删改查功能&#xff08;基于EasyCode插件&#xff09;支持自定义模板【非常简单】 idea生成代码&#xff08;二&#xff09;&#xff1a;实现java语言的增删改查功能&#xff08;基于mybatis-plus代码生成器…

矩阵置零00

题目链接 矩阵置零 题目描述 注意点 使用 原地 算法 解答思路 思路是需要存储每一行以及每一列是否有0&#xff0c;因为要尽可能使用更少的空间&#xff0c;且新设置为0的格子不能对后续的判断产生影响&#xff0c;所以要在原有矩阵上存储该信息先用两个参数存储第一行和第…