YOLOPython实现以及 OpenCV

Darknet 实现 YOLO

从头开始开发 YOLO模型不容易,所以我们要使用预训练模型在项目里进行目 标检测。你可以在 https://pjreddie.com里到所有可用的预训练模型。这是 Joseph C. Redmon的主页,他是 Darknet的维护者。

注意      DarknetCCUDA开发的开源神经网络框架,它很快,很容易安装,支持 CpU GpU计算。

在子页  (https://pjreddie.com/darknet/yolo/),  你可以找到 YOLO算法的所有信息。你可以从这个网页下载多个预训练模型的权重。对于每一个模型,你需要二个文件 :

  • 一个 .cfg文件,它包含网络结构.

  • 一个 .weights文件,它包含训练后的权重

为了给你这些文件的内容, .cfg文件包含使用的层的信息等,示例如:

[convolutional] batch_normalize=1 filters=64

size=3

stride=1 pad=1

activation=leaky

这告 诉你有特殊的卷积层。最重要的信息是:

  • Network architecture

  • Anchor boxes

  • Number of classes

  • Learning rate and other parameters used

  • Batch size

其它文件(.weights)包含预训练权重以进行推断。注意它们不能保存为Keras兼容的格式 ( .h5文件),所以它们不能加载到 Keras模型,除非你先转换。

有一些非标准的工具可以转换这些文件,因为格式不是固定的 ( YOLOv2 YOLOv3有些不同)。如果你感兴趣以 YOLO v2,你可以使用 YAD2K (另一个是 Darknet 2 Keras),可以在 https://github.com/allanzelener/YAD2K里找到。

注意这不能处理 YOLOv3 .cfg文件。相信我,我试过。但是如果你满意 YOLOv2, 你可以用这个目录的代码转换 .weight文件到Keras友好的格式。有个目录实现了 YOLOv3 的转换,在https://github.com/qqwweee/keras-yolo3。它有些局限,但是它是转换的很好的起点。 但是有便好的方法,使用预训练模型,那就是使用 OpenCV, 后面我们会看到。

Darknet检测对象

如果你只是想对图像进行分类,最容易的办法是按 darknet网站的指示。我们看一下如何做。如果你使用Linux MacOS X系统,这些指令有用。 Windows里,你要安装 gcc和别的工具。如网站所述,安装只需要几行代码:

git  clone  https://github.com/pjreddie/darknet cd darknet

make

wget     https://pjreddie.com/media/files/yolov3.weights

这里你就可以进行目标检测了:

./darknet detect cfg/yolov3.cfg yolov3.weights table.jpg

注意,权重文件很大,下载时要注意这一点,使用CPU这很慢,MacBook Pro 2018需要18秒来下载。见图 7-2

7-2. YOLOv3使用 darknet进行图像检测

黙认使用0.25的阈值。但是你可以使用不同的参数。你必须改变XYZ到你想要的值。

黙认使用0.25的阈值。但是你可以使用不同的参数。你必须改变XYZ到你想要的值。.

这个方法于于目标检测 很好,但是很难在python项目里使用。要这样做,你需要在你的代码里使用预训练的模型。有几个方法,最容易的是使用opencv库。如果你处理图像,你很可能已经使用过这个库。如果你没有听说过,建议你试一下,因为它是处理图像很有名的库。你可以看官网 https:// opencv.org.

你可以在网上下载本章的完整代码,但是我们只简单的讨论重要的部分。

你需要安装最新的opencv库。 用下面的代码检测版本:

import cv2

print (cv2.  version  )

我们需要从https:// pjreddie.com 下载三个文件:

  • coco.names

  • yolov3.cfg

  • yolov3.weights

coco.names 包含了预训练模型能分类的标签。yolov3.cfg yolov3.weights是模型配置参数  (前面已讨论过)且我们需要使用 权重。为了你方便,yolov3.weights大约 240MB容量,你可以下载 ZIP 文件自 http://toe.lt/r。在代码里我们需要指明文件在哪里。例如,你使用下面的代码:

weightsPath  =  "yolo-coco/yolov3.weights" configPath   =   "yolo-coco/yolov3.cfg"

你要改变文件的位置。 OpenCV提供了函数来加载权重而不需要转换它们:

net  =  cv2.dnn.readNetFromDarknet(configPath,  weightsPath)

这很舒服,因为你不需要分析和写加载函数。它返回模型对象供你后面推断。如果你记得本章开始的讨论,你要得到输出层来得到所有需要的信息,像边框和预测分类。我们用下面的代码很容易做到:

ln  =  net.getLayerNames()

ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]

 getUnconnectedOutLayers()函数返回带用unconnected输出的层, 正是我们想要的。ln这量含有下面的层:

['yolo_82', 'yolo_94', 'yolo_106']

然后我们要改变图像大小到 416x416并归一化它:

blob  =  cv2.dnn.blobFromImage(image,  1  / 255.0,  (416,  416), swapRB=True, crop=False)

然后用它作为模型的输入:

net.setInput(blob)

然后我们用 forward()函数向前传递给训练模型:

layerOutputs   =   net.forward(ln)

我们还没有完成,不要休息。我们要提取边框,我们保存在列表里,然后是置信,然后是预测分类.

我们初始化列表:

boxes = [] confidences = [] classIDs = []

然后我们遍历各层并提取我们要的信息。

for output in layerOutputs: for  detection  in  output:

现在分 数保存在第5个检测变量的元素里,我们提取分类用np. argmax(scores):

scores   =   detection[5:] classID  =  np.argmax(scores)

置信度是预测分类的分值:

confidence   =   scores[classID]

我们想要预测置信度大于0的。我们选择限度为0.15。预测边框包含于检测变量的前4个里:

box =  detection[0:4] *  np.array([W, H,  W,  H]) (centerX,   centerY,   width,   height)   =   box.astype("int")

如果你记得,YOLO预测边框的中心点,所在我们要的提取左上角位置:

x = int(centerX - (width / 2)) y = int(centerY - (height / 2))

然后我们将发现的值添加到列表

boxes.append([x, y, int(width), int(height)]) confidences.append(float(confidence)) classIDs.append(classID)

然后我们使用 non-maxima 抑制 (上一节讨论过) OpenCV 也提供了函数:

idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.6,0.2)

函数需要下面的参数:

  • 边框集合 (保存于 boxes变量)

  • 置信度集合 (保存于confidences变量)

  • 按分值过滤边框的阈值  (前面代码是0.6)

  •  non-maximum抑制的阈值 (前面的代码是0.2)

然我们得到准确的位置:

for i in idxs.flatten():

# extract the bounding box coordinates (x,  y)  =  (boxes[i][0],  boxes[i][1])

(w,  h)  =  (boxes[i][2],  boxes[i][3])

你可以在图 7-3看到结果。

 7-3. YOLOv3 OpenCV获得的结果

这正是它应有的与图7-2一样的结果。另外,我们有预测边框的概率。你可以看到这是多么的容易。你只需要添加几行代码到你的项目。

这正是它应有的与图7-2一样的结果。另外,我们有预测边框的概率。你可以看到这是多么的容易。你只需要添加几行代码到你的项目。

记住我们使用预训练模型只能检测数据集里的对象。如果你要用不同的对象,你要微调模型,或重新训练模型。从头训练模型超出了本书的范围。但是下一节我会给你一些提示。

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

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

相关文章

译|Netflix 数据平台运营中基于机器学习自动修复系统

来自上传文件中的文章《Evolving from Rule-based Classifier: Machine Learning Powered Auto Remediation in Netflix Data Platform》 本文介绍了Netflix如何将基于规则的错误分类器与机器学习服务集成,实现Spark作业失败的自动修复。技术亮点包括结合规则和ML智…

PAES算法求解 ZDT1 双目标优化问题

前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…

逻辑回归的应用

一参数逻辑回归参数及多分类策略等完整解析LogisticRegression 初始参数声明LogisticRegression(penaltyl2, dualFalse, tol0.0001, C1.0, fit_interceptTrue, intercept_scaling1, class_weightNone, random_stateNone, solverliblinear, max_iter100, multi_classovr, verbos…

C语言(长期更新)第7讲:VS实用调试技巧

C语言(长期更新) 第7讲 VS实用调试技巧 跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学习内容,你的支持就是博主最大的动力。 目录 C语言(长期更新) 第7讲 …

CONTRASTIVE-KAN:一种用于稀缺标记数据的网络安全半监督入侵检测框架

研究背景与挑战​ ​工业环境需求​: 第四次工业革命中,物联网(IoT)和工业物联网(IIoT)的普及使网络安全成为关键挑战。 入侵检测系统需实时性高,尤其对关键基础设施(如燃气管道)的快速攻击检测至关重要。 ​核心问题​: ​标签数据稀缺​:工业系统多数时间处于正常…

综合:单臂路由+三层交换技术+telnet配置+DHCP

技术考核1 实验拓扑:实验需求 1.按照图示配置IP地址设备名 2.在SW1和SW2之间配置链路聚合增加链路带宽,提高可靠性 3.PC5和PC6属于VLAN10, PC7和PC8属于VLAN20 4.SW1和SW2属于二层交换机,SW3为三层交换机(VLAN100用于对…

工业火焰识别漏报率↓78%!陌讯多模态融合算法实战解析

原创声明:本文技术方案解析基于陌讯技术白皮书2025版 标签:#陌讯视觉算法 #火焰识别优化 #工业安全监控 #边缘计算优化一、行业痛点:工业火灾监控的漏检危机据《2025工业安全白皮书》统计,化工场景传统火焰识别系统漏报率高达35%&…

C++引用:高效安全的别名机制详解

目录 一、引用的概念 二、引用的特性 1、定义时必须初始化 2、一个变量可以有多个引用 3、引用一旦绑定实体就不能更改 三、const引用(常引用) 1、const引用的基本特性 2、临时对象与const引用 3、临时对象的特性 4、const 引用作为函数形参 …

大语言模型API付费?

下面是目前主流 大语言模型 API 的付费情况总览: 🧠 一、主要大语言模型 API:是否付费对比 提供方模型是否免费限制 / 说明OpenAIGPT-3.5 / GPT-4 / GPT-4o❌ 付费为主有免费额度(如 ChatGPT 免费版),API …

巧用Wisdom SSH:容器化运维与传统运维的抉择

巧用Wisdom SSH:容器化运维与传统运维的抉择 在当下的技术领域,容器化运维与传统运维是运维人员面临的两大主要方向,对于从业者来说,如何抉择至关重要,而Wisdom SSH在其中能发挥显著作用。 传统运维:基石…

API征服者:Python抓取星链卫星实时轨迹

API征服者:Python抓取星链卫星实时轨迹从基础调用到工业级卫星追踪系统实战指南一、太空数据时代:星链卫星的全球覆盖​​星链卫星网络规模​​:已发射卫星数量:4,000目标卫星总数:42,000轨道高度:340km - …

《深潜React列表渲染:调和算法与虚拟DOM Diff的优化深解》

当用户在内容平台无限滑动,或是在管理系统中处理成百上千条数据时,每一次无卡顿的交互,都是调和算法与虚拟DOM Diff机制协同工作的成果。理解这两者的底层逻辑,不仅是性能优化的钥匙,更是从“使用框架”到“理解框架”…

自动化与配置管理工具 ——Ansible

一、Ansible 概述1.1 核心特性Ansible 是一款开源的自动化运维工具,采用无代理(Agentless)架构,通过 SSH 协议实现对远程节点的管理。其核心特性包括:无代理架构:被管理节点无需安装代理软件,降…

Effective C++ 条款18:让接口容易被正确使用,不易被误用

Effective C 条款18:让接口容易被正确使用,不易被误用核心思想:设计接口时,应使正确使用方式直观自然,同时通过类型系统、行为约束等手段主动预防常见错误,减少用户犯错的可能性。 ⚠️ 1. 接口误用的常见陷…

nodejs读写文件

1.读文件 node有很多模块,可在node模块查看相应模块; var fsrequire(fs)fs.readFile(./src/a.doc,utf8,function(err,data){// 如果发生错误,data是undefined 如果成功 err为null console.log(err); console.log(data); }) 2.写文件 var…

ConcurrentHashMapRedis实现二级缓存

1. 为什么使用ConcurrentHashMap?在Java中,ConcurrentHashMap 是一个线程安全且高效的哈希表实现,广泛用于高并发场景。将其用作一级缓存的原因主要包括以下几点:1.1. 线程安全性ConcurrentHashMap 是线程安全的,支持多…

Mysql集群技术

实验在RHEL7中做,因为9中缺少了一个关键的高可用组件环境:两台数据库,内存和CPU要多一点主流是MYSQL(开源),Oracle收费较贵RHEL7中直接用make编译是有问题的,所以需要要gcc工具做好前置准备&…

自动驾驶嵌入式软件工程师面试题【持续更新】

文章目录前言请描述 CAN 帧的基本结构(包括标识符、数据字段、CRC 等)描述 WebSocket 协议的基本工作流程(包括握手、数据帧结构)请说明如何实现 WebSocket 连接的心跳机制以检测连接状态,并描述在断开后如何通过重连策…

vue(5)-组件

一.组件三大组成部分(结构/样式/逻辑)(1)组件样式冲突用scoped全局样式在组件中起全局作用,局部样式可以加scoped属性来只作用于当前组件图中只给baseone加这个样式,就在baseone中style加scoped&#xff08…

【机器学习】两大线性分类算法:逻辑回归与线性判别分析:找到分界线的艺术

文章目录一、核心概念:数据分类的"切分线"二、工作原理:从"找分界线"理解二、常见算法1、逻辑回归:二分类2、线性判别分析(LDA):分类与降维3、两种算法对比分析三、实际应用&#xff1…