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

简介: 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()函数:主要负责加载模型、运行目标检测、处理检测结果以及保存结果等操作。
  • 通过LoadStreams或LoadImages选择数据加载方式,分别用于摄像头流和图像/视频加载。
  • 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 thickness
    color = 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 thickness
        t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]
        c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3
        cv2.rectangle(im0, c1, c2, color, -1, cv2.LINE_AA)  # filled
        cv2.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和阈值来判断目标的距离,并选择相应的颜色进行标记。在实际应用中,可能需要更复杂的逻辑来处理不同的距离范围。

相关文章
|
算法 数据可视化
Halcon边缘检测和线条检测(1),文章含自适应/动态二值化等算子
Halcon边缘检测和线条检测(1),文章含自适应/动态二值化等算子
1596 0
|
1月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
48 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
1月前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
64 0
|
6月前
|
计算机视觉
【YOLOv8改进】Shape-IoU:考虑边框形状与尺度的指标(论文笔记+引入代码)
YOLO目标检测专栏探讨了边框回归损失的创新方法,强调了目标形状和尺度对结果的影响。提出的新方法Shape-IoU关注边框自身属性,通过聚焦形状和尺度提高回归精度。实验显示,该方法提升了检测效果,超越现有技术,在多个任务中达到SOTA。论文和代码已公开。
|
6月前
|
计算机视觉 索引
【OpenCV】—ROI区域图像叠加&图像混合
【OpenCV】—ROI区域图像叠加&图像混合
|
6月前
|
传感器 人工智能 搜索推荐
用 ChatGPT 4.0 实现获取并保存 RealSense 相机的深度图像,处理colorizer,histogram equalization配置,解决深度图像颜色分布异常问题
用 ChatGPT 4.0 实现获取并保存 RealSense 相机的深度图像,处理colorizer,histogram equalization配置,解决深度图像颜色分布异常问题
102 0
用 ChatGPT 4.0 实现获取并保存 RealSense 相机的深度图像,处理colorizer,histogram equalization配置,解决深度图像颜色分布异常问题
|
传感器
ENVI: 如何进行图像的自动配准?
ENVI: 如何进行图像的自动配准?
523 0
OpenCV-图像阴影调整
OpenCV-图像阴影调整
198 0
OpenCV-图像高光调整
OpenCV-图像高光调整
254 0
【IMAQ】imaqSetImageSize() 设置图像大小
【IMAQ】imaqSetImageSize() 设置图像大小