(篇六)基于PyDracula搭建一个深度学习的软件之新版本ultralytics-8.3.28调试

ultralytics-8.3.28版本debug记录

1传入文件

代码太多不粘贴在这里了,完整代码写在了篇三

    def open_src_file(self):config_file = 'config/fold.json'config = json.load(open(config_file, 'r', encoding='utf-8'))open_fold = config['open_fold']if not os.path.exists(open_fold):open_fold = os.getcwd()name, _ = QFileDialog.getOpenFileName(self, 'Video/image', open_fold, "Pic File(*.mp4 *.mkv *.avi *.flv *.jpg *.png)")if name:self.yolo_predict.source = name  #将图片或者视频传入到source中print(name)self.show_status('Load File:{}'.format(os.path.basename(name)))config['open_fold'] = os.path.dirname(name)config_json = json.dumps(config, ensure_ascii=False, indent=2) # 重新保存json的信息with open(config_file, 'w', encoding='utf-8') as f:f.write(config_json)self.stop()

最终我们发现,打开的图片其实保存到了YoloPredictor下面的source,但是BasePredictor(yolo检测器)这个文件下是没有source这个属性的。因此这一步并没有完成图片与yolo检测器之间的链接

# 设置输入源
self.setup_source(self.source if self.source is not None else self.args.source)# 打开的图片从这被self.args.source被加载进去
  • 在setup_source函数中,发现传入的source被包含到了self.dataset当中,我们要在这里找出self.dataset对于图片检测和视频检测都有什么区别。
1图片检测
“”“yolo检测器”“”
def setup_source(self, source):"""Sets up source and inference mode."""self.imgsz = check_imgsz(self.args.imgsz, stride=self.model.stride, min_dim=2)  # check image sizeself.transforms = (getattr(self.model.model,"transforms",classify_transforms(self.imgsz[0], crop_fraction=self.args.crop_fraction),)if self.args.task == "classify"else None)self.dataset = load_inference_source(source=source,batch=self.args.batch,vid_stride=self.args.vid_stride,buffer=self.args.stream_buffer,)self.source_type = self.dataset.source_typeif not getattr(self, "stream", True) and (self.source_type.streamor self.source_type.screenshotor len(self.dataset) > 1000  # many imagesor any(getattr(self.dataset, "video_flag", [False]))):  # videosLOGGER.warning(STREAM_WARNING)self.vid_writer = {}
‘’‘新版本yolo’‘’
def load_inference_source(source=None, batch=1, vid_stride=1, buffer=False):"""Loads an inference source for object detection and applies necessary transformations.Args:source (str, Path, Tensor, PIL.Image, np.ndarray): The input source for inference.batch (int, optional): Batch size for dataloaders. Default is 1.vid_stride (int, optional): The frame interval for video sources. Default is 1.buffer (bool, optional): Determined whether stream frames will be buffered. Default is False.Returns:dataset (Dataset): A dataset object for the specified input source."""source, stream, screenshot, from_img, in_memory, tensor = check_source(source) # 打断点source_type = source.source_type if in_memory else SourceTypes(stream, screenshot, from_img, tensor)# Dataloaderif tensor:dataset = LoadTensor(source)elif in_memory:dataset = sourceelif stream:dataset = LoadStreams(source, vid_stride=vid_stride, buffer=buffer)elif screenshot:dataset = LoadScreenshots(source)elif from_img:dataset = LoadPilAndNumpy(source)else:dataset = LoadImagesAndVideos(source, batch=batch, vid_stride=vid_stride)# Attach source types to the datasetsetattr(dataset, "source_type", source_type)return dataset

输入图片之后load_inference_source函数打断点,发现图片走的是这行代码。

    else:dataset = LoadImagesAndVideos(source, batch=batch, vid_stride=vid_stride)

再仔细分析check_source(source)返回的全是false,在这个函数内部判定is_file:True。我们的source确实是file文件,因此这一步并没有问题。
在这里插入图片描述

在这里插入图片描述
我们再仔细分析一下这行代码

    else:dataset = LoadImagesAndVideos(source, batch=batch, vid_stride=vid_stride)

我们返回的dataset是一个迭代器,使用方式如下面代码所示:

Examples:>>> loader = LoadImagesAndVideos("path/to/data", batch=32, vid_stride=1)>>> for paths, imgs, info in loader:...     # Process batch of images or video frames...     pass

在接下来的代码中有:

batch = next(self.dataset)  # 使用 next(self.dataset) 可以显式地获取下一批数据,而不是依赖 for 循环或隐式的迭代器行为。这种方式适用于需要更细粒度控制数据加载的场景,例如在某个特定条件下才加载下一批数据。self.batch = batch  # 保存当前批次
path, im, im0s = batch  # 从批次中提取路径、图像、原始图像、视频捕获和其他信息

这种情况明显和新版的dataset是不一致的。具体表现在im0s以前是原图,但如今表示注释信息info。

2视频检测

我们发现输入为视频,在check_source(source)函数中依旧会被判定为is_file:True。因此最后依旧会走LoadImagesAndVideos这个类,所生成的dataset依旧是没有属性的。setattr(dataset, "source_type", source_type)这里的属性是没有的。
在这里插入图片描述
LoadImagesAndVideos会将MP4装到一个列表里面
在这里插入图片描述
后续LoadImagesAndVideos会用视频解释器给装起来,变成self.frames

    def _new_video(self, path):"""Creates a new video capture object for the given path and initializes video-related attributes."""self.frame = 0self.cap = cv2.VideoCapture(path)self.fps = int(self.cap.get(cv2.CAP_PROP_FPS))if not self.cap.isOpened():raise FileNotFoundError(f"Failed to open video {path}")self.frames = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT) / self.vid_stride)

在提取的时候数据的时候,最后一个batch所提取的是path表示地址,im当前帧numpy数组,info其他信息。

batch = next(self.dataset)  # 使用 next(self.dataset) 可以显式地获取下一批数据,而不是依赖 for 循环或隐式的迭代器行为。这种方式适用于需要更细粒度控制数据加载的场景,例如在某个特定条件下才加载下一批数据。
self.batch = batch  # 保存当前批次,注意如果是视频,那么则为当前帧数据
path, im, info = batch  # path表示图片或者视频的地址,im当前帧numpy数组,info其他信息。

然后我发现了一个V11的缺陷,就是一些尺寸的图片无法完成检测,我就报错了
但是换了一个图片之后有可以了,估计是模型在cat的时候有地方是不满足的。

Sizes of tensors must match except in dimension 1. Expected size 136 but got size 135 for tensor number 1 in the list.

2数据集使用

在run函数将dataset将数据集转化为一个迭代器。这个self.dataset也是新版本yolo与旧版本最大的区别。

def run() 
...batch = iter(self.dataset)  # 将数据集转化为迭代器

3Debug

class YoloPredictor(BasePredictor, QObject):
。。。
self.yolo_predict = YoloPredictor()  # Createa a Yolo instance
。。。
self.yolo_predict.source = name  #将图片或者视频传入到source中
  • 问题代码1——这里报错——报错expected np.ndarray (got list)
    ultralytics-8.3.28版本batch是3个维度首先无法被解压为5个。
path, im, im0,svid_cap, s  = batch (错误源头)
。。。
  • 因此我将其这么调整
self.batch = batch  # 保存当前批次
print(batch)  # 打印 batch 的内容
print(len(batch))  # 打印 batch 的长度
path, im, im0s = batch  # 从批次中提取路径、图像、原始图像、视频捕获和其他信息
path, im, im0s = batch  # 从批次中提取路径、图像、原始图像、视频捕获和其他信息
vid_cap, s = None, None  # 其他变量设为默认值
  • 然而遇见了这个报错——expected np.ndarray (got list) 这里的im要求输入是图片而不是列表。
 # 预处理图像
with self.dt[0]:im = self.preprocess(im)  # 预处理图像if len(im.shape) == 3:  # 如果图像维度为3,则扩展批次维度im = im[None]  # 扩展为批次维度
  • 于是我调整为
with self.dt[0]:im = self.preprocess(im[count-1])  # 预处理图像if len(im.shape) == 3:  # 如果图像维度为3,则扩展批次维度im = im[None]  # 扩展为批次维度im = im.permute(0, 3, 1, 2)  # 交换维度
  • 有报错为’str’ object has no attribute ‘shape’
pred[:, :4] = ops.scale_boxes(img.shape[2:], pred[:, :4], shape).round()
  • batch = iter(self.dataset) 这个到底有啥作用
  • 报错KeyError(-1),这里的字典没有-1索引?
if isinstance(self.vid_writer[-1], cv2.VideoWriter):
self.vid_writer[-1].release()  # 释放视频写入器

太晚了明天继续debug。

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

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

相关文章

寒假2.8

题解 web:[RoarCTF 2019]Easy Calc 打开,是一个计算界面 看一下源代码,提示设置了WAF,并且有一个calc.php文件 访问一下calc.php文件,得到源码,使用get方式传参赋值给num,设置了黑名单&#x…

pytest测试专题 - 1.2 如何获得美观的测试报告

<< 返回目录 1 pytest测试专题 - 1.2 如何获得美观的测试报告 1.1 背景 虽然pytest命令的报文很详细&#xff0c;用例在执行调试时还算比较方便阅读和提取失败信息&#xff0c; 但对于大量测试用例运行时&#xff0c;可能会存在以下不足 报文被冲掉测试日志没法归档 …

让office集成deepseek,支持office和WPS办公软件!(体验感受)

导读 AIGC:AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 它是一种基于机器学习和自然语言处理的技术&#xff0c;能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、…

QML布局和信号槽

目录 一、定位器&#xff08;Positioners&#xff09; 1.Row&#xff08;行定位器&#xff09; 2.Column&#xff08;列定位器&#xff09; 3.Grid&#xff08;表格定位器&#xff09; 二、Layout布局 1.RowLayout&#xff08;行布局&#xff09; 2.ColumnLayout&#x…

C++ Primer 类型转换

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

.Net使用EF Core框架如何连接Oracle

目录 一、Nutget包添加 二、 配置文件 三、创建实体类 四、创建数据库上下文类 五、将数据库上下文服务注册到容器 六、测试数据库数据 &#xff08;1&#xff09;编写PeopleController &#xff08;2&#xff09;编写People页面 一、Nutget包添加 一定要安装Oracle.Ma…

30~32.ppt

目录 30.导游小姚-介绍首都北京❗ 题目​ 解析 31.小张-旅游产品推广文章 题目 解析 32.小李-水的知识❗ 题目​ 解析 30.导游小姚-介绍首都北京❗ 题目 解析 新建幻灯片-从大纲-重置-检查设计→主题对话框→浏览主题&#xff1a;考生文件夹&#xff08;注意&#x…

2025 年 2 月 TIOBE 指数

2025 年 2 月 TIOBE 指数 二月头条:快,更快,最快! 现在,世界需要每秒处理越来越多的数字,而硬件的发展速度却不够快,程序的速度变得越来越重要。话虽如此,快速编程语言在 TIOBE 指数中取得进展也就不足为奇了。编程语言 C++ 最近攀升至第 2 位,Go 已稳居前 10 名,Ru…

【Flink源码分析】5. Flink1.19源码分析-异步编程(CompletableFuture)

5 CompletableFuture 实现异步编排&#xff1b;获取异步任务执行的结果。 CompletableFuture提供了几十种方法&#xff0c;辅助我们的异步任务场景。这些方法包括创建异步任务、异步任务回调、多个任务组合处理等方面。 5.1 supplyAsync 方法 supplyAsync 执行 Completable…

LabVIEW在呼吸机测试气体容量计算

在呼吸机测试中&#xff0c;精确测量气体容量变化是评估设备性能的关键步骤。通过监测呼吸机气道内的压力变化&#xff0c;并结合流阻和肺顺应性等参数&#xff0c;可以计算出单位时间内的气体容量变化。本案例基于LabVIEW实现该计算过程&#xff0c;以确保测试数据的准确性和一…

Lombok使用指南

引言 lombok作为减少我们代码量的利器&#xff0c;本文将列举常用的几个注解&#xff0c;来帮助减少代码量 注解及其功能 Getter 和 Setter import lombok.Getter; import lombok.Setter;Getter Setter public class Person {private String name;private int age; } …

JAVA学习第一天

String的构造方法-118 String创建对象的特点——119 String字符串的比较——120 字符串的遍历——122 两个函数&#xff1a;length&#xff08;&#xff09;&#xff0c;charAt&#xff08;&#xff09; StringBuilder——127 String的内容是不可变的 StringBuilder的内容是可变…

sqli-lab靶场学习(六)——Less18-22(User-Agent、Referer、Cookie注入)

前言 前面的关卡&#xff0c;都是直接在输入框或者浏览器的地址栏上做文章即可。但本文这几关&#xff0c;需要用工具拦截请求修改请求头部才行。 Less18&#xff08;User-Agent注入&#xff09; 本关的注入点在User-Agent。我们在用户名和密码框中输入admin/admin后&#xf…

Spring依赖注入方式

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…

arcgis界址点编号工具开发原理(西北角顺时针)

arcgis界址点编号工具开发原理&#xff08;西北角顺时针&#xff09; 1、工具实现思路。寻找离包络矩形左顶角最近的点作为起点。如下图&#xff1a;距离包络矩形左顶角最近的点&#xff0c;作为J1点没有任何问题。 问题在于并不是所有的地块&#xff0c;都这么中规中矩、合情…

分布式服务框架 如何设计一个更合理的协议

1、概述 前面我们聊了如何设计一款分布式服务框架的问题&#xff0c;并且编码实现了一个简单的分布式服务框架 cheese, 目前 cheese 基本具备分布式服务框架的基本功能。后面我们又引入了缓存机制&#xff0c;以及使用Socket替代了最开始的 RestTemplate。并且还学习了网络相关…

生信云服务器:让生物信息学分析更高效、更简单【附带西柚云优惠码】

随着生物信息学的快速发展&#xff0c;基因组测序、单细胞分析等复杂任务逐渐成为研究者们的日常工作。然而&#xff0c;个人电脑在处理这些任务时往往面临性能瓶颈&#xff0c;如内存不足、运算速度慢等问题&#xff0c;导致分析任务频繁失败或崩溃。为了解决这一难题&#xf…

[AUTOSAR通信] - PDUR模块解读

点击订阅专栏不迷路 文章目录 一、 PDUR模块概述二、功能描述2.1 发送路由功能2.2 接收路由功能2.3 网关路由功能2.4 路由控制功能 三、配置項介紹3.1. PduRBswModules3.2. PduRGeneral3.3. PduRRoutingTables3.4. PduRRoutingPath3.5. PduRSrcPdu3.6. PduRDestPdu 四、总结 &g…

分治下的快速排序(典型算法思想)—— OJ例题算法解析思路

目录 一、75. 颜色分类 - 力扣(LeetCode) 运行代码: 一、算法核心思想 二、指针语义与分区逻辑 三、操作流程详解 四、数学正确性证明 五、实例推演(数组[2,0,2,1,1,0]) 六、工程实践优势 七、对比传统实现 八、潜在问题与解决方案 九、性能测试数据 十、扩展…

分层耦合 - IOC详解

推荐使用下面三种, 第一种多用于其他类 声明bean的时候&#xff0c;可以通过value属性指定bean的名字&#xff0c;如果没有指定&#xff0c;默认为类名首字母小写。 使用以上四个注解都可以声明bean&#xff0c;但是在springboot集成web开发中&#xff0c;声明控制器bean只能用…