无人机检测车辆——多目标检测

目录

YOLOv3(You Only Look Once version 3)简介

YOLOv3 的主要特点

YOLOv3 的结构

1. 特征提取网络(Backbone)

2. 检测头(Head)

3. 输出层

YOLOv3 损失函数

YOLOv3 的优势

YOLOv3 的应用

YOLOv3 的局限性

实现思路

1. 加载模型和配置文件:

2. 视频读取:

3. 初始化跟踪器:

4. YOLOv3目标检测:

5. 目标跟踪:

6. 结果展示:

7. 资源释放:

整体代码

效果图

总结



YOLOv3(You Only Look Once version 3)简介

        YOLOv3 是一种目标检测模型,它是 YOLO(You Only Look Once)系列模型的第三个版本,主要改进了之前版本的精度和速度。YOLOv3 可以在单次推理中同时识别图像中的多个目标,它通过回归问题将目标检测任务转化为一个单一的回归问题,从而实现了非常高的检测速度。YOLOv3 在速度和精度之间提供了良好的平衡,成为了工业和学术界广泛使用的目标检测模型。

        YOLOv3 由 Joseph Redmon 和 Santosh Divvala 等人提出,主要的创新包括:

  1. 更好的多尺度检测:通过使用三个不同尺度的特征图来检测不同尺寸的目标。
  2. 更精确的特征提取网络:YOLOv3 使用了一个新的特征提取网络(Darknet-53),相比于之前的 YOLOv2 使用的 Darknet-19,它更深更强,能够提取更多的图像特征。
  3. 改进的损失函数:YOLOv3 对损失函数进行了改进,加入了对边界框位置、置信度、类别概率等因素的多方面考虑,使得模型能够更准确地进行目标检测。

YOLOv3 的主要特点

  1. 实时性和高效率:YOLOv3 可以实时进行目标检测,尤其适合需要实时反馈的应用场景,比如自动驾驶、监控摄像头等。

  2. 端到端训练和推理:YOLOv3 是一个端到端的模型,不需要额外的区域提议(region proposals)阶段。通过单一的神经网络结构,YOLOv3 可以在一次前向推理中同时完成目标的定位和分类。

  3. 高精度和高速度:虽然 YOLOv3 的推理速度非常快,但它并没有牺牲精度。YOLOv3 在 COCO 数据集上的表现优于许多其他实时目标检测模型(如 SSD 和 Faster R-CNN)。

  4. 支持多类别和多尺度检测:YOLOv3 支持大规模的类别检测(COCO 数据集中的 80 类物体),并且能够检测大小不一的目标物体,尤其是在小物体的检测上有显著提高。

  5. 使用 Leaky ReLU 激活函数:YOLOv3 使用了 Leaky ReLU 替代传统的 ReLU 激活函数,能够避免 ReLU 在某些情况下出现死神经元(dead neurons)问题。

  6. 检测层次结构:YOLOv3 使用三种不同大小的特征图来进行目标检测,从而更好地处理小物体、大物体的检测任务。其采用了类似 FPN(Feature Pyramid Networks)的结构,能够有效利用不同尺度的特征进行多尺度目标检测。


YOLOv3 的结构

        YOLOv3 的整体架构分为两个主要部分:特征提取网络(Backbone)检测头(Head)

1. 特征提取网络(Backbone)

        YOLOv3 使用 Darknet-53 作为其特征提取网络。Darknet-53 是一个具有 53 层的卷积神经网络,相比于 YOLOv2 使用的 Darknet-19,Darknet-53 更深且具备更强的特征提取能力。Darknet-53 由残差块组成,可以更有效地提取图像中的低级和高级特征。

2. 检测头(Head)

        YOLOv3 的检测头负责从特征图中提取目标的边界框坐标、置信度以及类别信息。YOLOv3 采用了三个不同尺度的特征图来进行检测:一个用于检测大物体,一个用于中等物体,另一个用于小物体。这些特征图分别来自网络中不同深度的卷积层。

3. 输出层

        YOLOv3 的输出是一个 3D 张量,包含了边界框的位置(x, y, w, h)、置信度和类别概率。输出的每个单元表示一个预测框的信息。

  • 每个预测框会有 4 个坐标值(x, y, w, h),表示边界框的位置和尺寸。
  • 每个框还会有一个置信度值,表示该框内包含目标的置信度。
  • 最后,每个框还会包含与每个类别相关的类别概率分布。

YOLOv3 损失函数

YOLOv3 使用了一个多任务损失函数,结合了位置损失、置信度损失和类别损失:

  1. 位置损失(Localization Loss):该损失用于优化边界框的预测精度,通常使用均方误差(MSE)来计算。

  2. 置信度损失(Confidence Loss):该损失用于衡量每个预测框内是否包含目标物体,越接近 1 说明预测越准确,目标物体越确定。YOLOv3 对所有预测框都计算了置信度损失。

  3. 类别损失(Classification Loss):该损失用于计算每个框的类别预测误差,通常使用交叉熵损失来计算。


YOLOv3 的优势

  • 实时性强:相较于许多传统的目标检测方法(如 Faster R-CNN),YOLOv3 的检测速度更快,适合实时应用。

  • 精度高:YOLOv3 在大型数据集(如 COCO、PASCAL VOC)上的精度较高,尤其是在小物体检测方面有所改进。

  • 多尺度检测:YOLOv3 的多尺度检测策略使得它能够在不同大小的物体上都有较好的表现。


YOLOv3 的应用

YOLOv3 被广泛应用于以下领域:

  1. 自动驾驶:YOLOv3 能够实时识别道路上的车辆、行人、交通标志等物体,对于自动驾驶系统的目标检测至关重要。

  2. 视频监控:YOLOv3 可以用来实时分析监控视频,识别入侵者、车辆或其他目标。

  3. 工业检测:在工业制造过程中,YOLOv3 可用于缺陷检测、零件识别等。

  4. 无人机目标检测:YOLOv3 适用于无人机上的实时物体识别,能够进行高效的目标追踪和监控。


YOLOv3 的局限性

尽管 YOLOv3 在速度和精度上都表现出色,但仍然存在一些局限性:

  1. 小物体检测问题:虽然 YOLOv3 引入了多尺度特征图来改进小物体检测,但对于极小的物体,它的检测精度仍然不如其他更精细的检测模型(如 Faster R-CNN 或 RetinaNet)。

  2. 精度与速度的平衡:YOLOv3 主要专注于速度,因此在极高精度的需求下,可能不如一些其他的目标检测模型。


实现思路

1. 加载模型和配置文件

  • 代码首先加载了COCO数据集中的类别名称(coco.names)和YOLOv3的配置文件(yolov3.cfg)以及权重文件(yolov3.weights)。这些文件是YOLOv3模型进行物体检测所需要的。
  • net = cv2.dnn.readNet() 用来加载YOLO模型,getLayerNames()getUnconnectedOutLayers() 获取模型的输出层名称。

2. 视频读取

  • 使用 cv2.VideoCapture() 打开一个视频文件,这里假设视频文件名为 test1.mp4,你可以更换成其他的视频文件路径。
  • 每帧视频将会被读取,并传入后续的目标检测和跟踪部分。

3. 初始化跟踪器

  • 使用 cv2.TrackerCSRT_create() 创建CSRT(Channel and Spatial Reliability Tracking)跟踪器。CSRT是一个高效的多目标跟踪算法,适用于动态物体(如车辆)跟踪。
  • tracker.init(frame, bbox) 初始化跟踪器,bbox 是目标的边界框坐标(x, y, w, h),代表车辆在视频中的位置。

4. YOLOv3目标检测

  • yolo_detection(frame) 是目标检测函数,首先将图像转换成YOLO模型所需的输入格式(blobFromImage())。然后,将图像传入YOLO模型进行前向传播,获得每个检测框的信息(如位置、类别、置信度)。
  • 根据YOLO的检测结果,代码筛选出置信度大于0.5且类别为“车”、“巴士”和“卡车”的目标,这些目标会被添加到跟踪列表中。

5. 目标跟踪

  • 初始化跟踪器后,开始对视频中的目标进行跟踪。在 while 循环中,程序不断读取视频帧并更新所有的跟踪器。
  • 每次更新时,通过 tracker.update(frame) 获取新的目标位置。如果跟踪成功,更新目标的边界框,并绘制在视频帧上;如果跟踪失败,则显示“Tracking failure”提示。

6. 结果展示

  • 每一帧被处理后,将通过 cv2.imshow() 显示出来。如果按下键盘上的 'q' 键,程序会退出循环并关闭窗口。
  • 绘制的跟踪框使用绿色((0, 255, 0)),并在框上方显示“Vehicle ID”来标识每个目标。

7. 资源释放

  • 在程序结束时,cap.release() 释放视频文件,cv2.destroyAllWindows() 关闭所有OpenCV的窗口。


整体代码

import cv2
import numpy as np# 加载类别名称
with open("../needFiles/coco.names", "r") as f:classes = [line.strip() for line in f.readlines()]# 加载YOLOv3配置文件和权重文件
net = cv2.dnn.readNet("../needFiles/yolov3.weights", "../needFiles/yolov3.cfg")# 获取输出层名称
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]# 打开视频文件(这里假设无人机视频文件为input_video.mp4)
cap = cv2.VideoCapture("./videos/test1.mp4")# 初始化变量
trackers = []  # 用于存储多个跟踪器
bboxes = []  # 存储所有目标的边界框
frame_count = 0# 车辆类别的ID(以COCO数据集为例)
vehicle_classes = ['car', 'bus', 'truck']  # 需要跟踪的车辆类别
vehicle_class_ids = [2, 5, 7]  # 对应的类别ID# 使用跟踪算法
def init_tracker(frame, bbox):# 使用CSRT跟踪器(适合动态物体)tracker = cv2.TrackerCSRT_create()tracker.init(frame, bbox)return tracker# YOLOv3检测
def yolo_detection(frame):blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)net.setInput(blob)outs = net.forward(output_layers)class_ids = []confidences = []boxes = []height, width, _ = frame.shapefor out in outs:for detection in out:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence > 0.5:  # 置信度阈值center_x = int(detection[0] * width)center_y = int(detection[1] * height)w = int(detection[2] * width)h = int(detection[3] * height)x = int(center_x - w / 2)y = int(center_y - h / 2)# 如果检测到的是车辆类别,则将目标添加到跟踪列表if class_id in vehicle_class_ids:boxes.append([x, y, w, h])confidences.append(float(confidence))class_ids.append(class_id)# 使用非极大值抑制(NMS)过滤多余的框indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)return boxes, confidences, class_ids, indexes# 选择视频中的一帧图像进行目标选择
ret, frame = cap.read()
if not ret:print("无法读取视频文件!")cap.release()exit()# 目标检测并初始化目标跟踪
boxes, confidences, class_ids, indexes = yolo_detection(frame)
for i in range(len(boxes)):if i in indexes:x, y, w, h = boxes[i]bbox = (x, y, w, h)  # 目标框坐标tracker = init_tracker(frame, bbox)trackers.append(tracker)bboxes.append(bbox)# 跟踪目标
while True:ret, frame = cap.read()if not ret:break# 调整帧大小以适应显示器screen_width = 800  # 设置显示器宽度screen_height = int(frame.shape[0] * (screen_width / frame.shape[1]))frame_resized = cv2.resize(frame, (screen_width, screen_height))# 更新所有的跟踪器for i, tracker in enumerate(trackers):success, bbox = tracker.update(frame)# 绘制跟踪框if success:x, y, w, h = [int(v) for v in bbox]cv2.rectangle(frame_resized, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.putText(frame_resized, f"Vehicle ID: {i+1}", (x, y - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)else:cv2.putText(frame_resized, "Tracking failure", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)# 显示图像cv2.imshow("WenJGo", frame_resized)# 按 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

效果图

总结

        YOLOv3 是一款强大的实时目标检测模型,它在精度和速度之间提供了很好的平衡。通过引入更深的网络架构、多个尺度的检测和改进的损失函数,YOLOv3 在多种应用场景中都取得了优秀的表现。对于需要快速处理并识别图像中多目标的任务,YOLOv3 是一个非常优秀的选择。但是我觉得我现在还用的不好。

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

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

相关文章

Java | Leetcode Java题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; class Solution {public String nearestPalindromic(String n) {long selfNumber Long.parseLong(n), ans -1;List<Long> candidates getCandidates(n);for (long candidate : candidates) {if (candidate ! selfNumber) {if (ans…

字节青训-小C的外卖超时判断、小C的排列询问

目录 一、小C的外卖超时判断 问题描述 测试样例 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; 二、小C的排列询问 问题描述 测试样例 最终代码&#xff1a; 运行结果&#xff1a; ​编辑 一、小C的外卖超时判断…

linux使用scp和密钥在不同服务器传输文件

将源服务密钥中公钥&#xff08;以pub结尾的&#xff09;复制或拷贝密文&#xff0c;粘贴到目标服务器中的/root/.ssh/authorized_keys文件中&#xff1b; 测试连接&#xff1a;ssh -p2129 root172.129.162.537&#xff0c;如果使用默认端口22 -p参数可省略&#xff0c;注意这…

数据结构习题——有效的括号(栈),栈与队列和互相实现,循环队列的实现

文章目录 前言1、有效的括号题目思路代码 2、用队列实现栈题目思路代码 3、用栈实现对列题目思路代码 4、设计循环队列4.1循环队列的概念和了解题目思路代码 总结 前言 继上篇博客学习了栈与队列之后&#xff0c;今天我们来尝试着使用他们来写一些题目&#xff0c;话不多说&…

常用命令之LinuxOracleHivePython

1. 用户改密 passwd app_adm chage -l app_adm passwd -x 90 app_adm -> 执行操作后&#xff0c;app_adm用户的密码时间改为90天有效期--查看该euser用户过期信息使用chage命令 --chage的参数包括 ---m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。 ---M 密码…

IDEA优雅debug

目录 引言一、断点分类&#x1f384;1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧&#x1f389;3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…

鸿蒙学习生态应用开发能力全景图-赋能套件(1)

文章目录 赋能套件鸿蒙生态应用开发能力全景图 赋能套件 鸿蒙生态白皮书: 全面阐释了鸿蒙生态下应用开发核心理念、关键能力以及创新体验,旨在帮助开发者快速、准确、全面的了解鸿蒙开发套件给开发者提供的能力全景和未来的愿景。 视频课程: 基于真实的开发场景,提供向导式…

贴代码框架PasteForm特性介绍之select,selects,lselect和reload

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

人工智能技术的应用前景与我们的应对策略

​ 大家好&#xff0c;我是程序员小羊&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;其在社会生活、产业转型以及科技进步中发挥着日益重要的作用。AI正逐步改变着我们的生活和工作方式&#xff0c;同时也带来了技术和伦理上的诸多挑战。本文…

Unreal engine5实现类似鬼泣5维吉尔二段跳

系列文章目录 文章目录 系列文章目录前言一、实现思路二、具体使用蓝图状态机蓝图接口三、中间遇到的问题 前言 先看下使用Unreal engine5实现二段跳的效果 一、实现思路 在Unreal Engine 5 (UE5) 中使用蓝图系统实现类似于《鬼泣5》中维吉尔的二段跳效果&#xff0c;可以通…

Python Excel XLS或XLSX转PDF详解:七大实用转换设置

目录 使用工具 Python将Excel文件转换为PDF Python将Excel文件转换为带页码的PDF Python将Excel文件转换为特定页面尺寸的PDF Python将Excel文件转换为PDF并将内容适应到一页 Python将Excel文件转换为PDF/A Python将Excel文件中的工作表转换为单独的PDF Python将Excel工…

Linux网络——网络初识

目录 1. 认识协议 2. 协议的分层 3. OSI 七层模型 && TCP/IP 五层(四层)模型 4. 网络传输的基本流程 5. 以太网的通信原理 6. 数据的跨网络传播 7. 认识 IP 地址 ① IP 是什么 ② IP 与 MAC 的关系 ③ 为什么需要 IP 在谈及网络之前&#xff0c;我们要先对学…

RedHat7—Linux中kickstart自动安装脚本制作

本实验使用虚拟机版本为rhel7&#xff0c;从rhel7后的版本kickstart工具进行收费使用。 1.在VMware关闭dhcp自动获取ip地址功能 2.安装并启动httpd [rootlocalhost ~]# yum install httpd [rootlocalhost ~]# systemctl start httpd [rootlocalhost ~]#systemctl stop firewal…

基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络

一、介绍 垃圾识别分类系统。本系统采用Python作为主要编程语言&#xff0c;通过收集了5种常见的垃圾数据集&#xff08;‘塑料’, ‘玻璃’, ‘纸张’, ‘纸板’, ‘金属’&#xff09;&#xff0c;然后基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对图像数据集进…

OMV7 树莓派 tf卡安装

​ 升级7之后&#xff0c;问题多多&#xff0c;不是docker不行了&#xff0c;就是代理不好使 今天又重装了一遍&#xff0c;用官方的链接&#xff0c;重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

前端无感刷新token

摘要&#xff1a; Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌&#xff08;access token&#xff09;的技术&#xff0c;确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项&#xff1a; 访问…

STM32 独立看门狗(IWDG)详解

目录 一、引言 二、独立看门狗的作用 三、独立看门狗的工作原理 1.时钟源 2.计数器 3.喂狗操作 4.超时时间计算 5.复位机制 四、独立看门狗相关寄存器 1.键寄存器&#xff08;IWDG_KR&#xff09; 2.预分频寄存器&#xff08;IWDG_PR&#xff09; 3.重载寄存器&…

RHCE的练习(12)

写一个脚本&#xff0c;完成以下要求&#xff1a; 给定一个用户&#xff1a; 如果其UID为0&#xff0c;就显示此为管理员&#xff1b;否则&#xff0c;就显示其为普通用户&#xff1b; #!/bin/bash ​ # 使用read命令获取用户名 read -p "请输入用户名: " username ​…

游戏引擎学习第15天

视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出&#xff08;IO&#xff09;操作的讨论。主要分为两类&#xff1a; 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源&#xff0c;例如音乐、音效、美术资源&#xff08;如 3D 模型和…

探索 HTML 和 CSS 实现的 3D旋转相册

效果演示 这段HTML与CSS代码创建了一个包含10张卡片的3D旋转效果&#xff0c;每张卡片都有自己的边框颜色和图片。通过CSS的3D变换和动画&#xff0c;实现了一个动态的旋转展示效果 HTML <div class"wrapper"><div class"inner" style"-…