当前位置: 首页 > article >正文

(篇六)基于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。

相关文章:

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

ultralytics-8.3.28版本debug记录 1传入文件 代码太多不粘贴在这里了,完整代码写在了篇三 def open_src_file(self):config_file config/fold.jsonconfig json.load(open(config_file, r, encodingutf-8))open_fold config[open_fold]if not os.path.exists(op…...

NLP Word Embeddings

Word representation One-hot形式 在上一周介绍RNN类模型时,使用了One-hot向量来表示单词的方式。它的缺点是将每个单词视为独立的,算法很难学习到单词之间的关系。 比如下面的例子,即使语言模型已经知道orange juice是常用组合词&#xf…...

基于 FPGA 的嵌入式系统硬件逻辑优化技术探究

在数字化浪潮席卷全球的当下,嵌入式系统已然成为众多领域不可或缺的核心力量。从我们日常使用的智能手机、智能穿戴设备等消费电子产品,到关乎工业生产效率与精度的工业控制系统,再到汽车电子领域的自动驾驶辅助系统以及航空航天领域的飞行器…...

使用HX搭建UNI-APP云开发项目(适合新手小白与想学云开发的宝子)

什么是uni-app云开发 uni-app云开发是uni-app提供的一套后端服务,它可以帮助开发者快速搭建起一个完整的后端服务,包括数据库、云函数、存储等。开发者只需要关注前端页面的开发,后端服务由uni-app云开发提供。 uni-app云开发的优势: 快速搭建后端服务:uni-app云开发提供了…...

sql:时间盲注和boolen盲注

关于时间盲注&#xff0c;boolen盲注的后面几个获取表、列、具体数据的函数补全 时间盲注方法 import time import requests# 获取数据库名 def inject_database(url):dataname for i in range(1, 20):low 32high 128mid (low high) // 2while low < high:payload &q…...

【STM32】ADC|多通道ADC采集

本次实现的是ADC实现数字信号与模拟信号的转化&#xff0c;数字信号时不连续的&#xff0c;模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法&#xff0c;使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时&#xff0c;0~ 3.3v(模拟信…...

arcgis for js实现层叠立体效果

在 Web 开发中&#xff0c;利用 ArcGIS for JS 实现一些炫酷的地图效果能够极大地提升用户体验。本文将详细介绍如何使用 ArcGIS for JS 实现层叠立体效果&#xff0c;并展示最终的效果图。 效果图 实现思路 要实现层叠立体效果&#xff0c;关键在于获取边界图形的坐标&#xf…...

多模态本地部署和ollama部署Llama-Vision实现视觉问答

文章目录 一、模型介绍二、预期用途1. 视觉问答(VQA)与视觉推理2. 文档视觉问答(DocVQA)3. 图像字幕4. 图像-文本检索5. 视觉接地 三、本地部署1. 下载模型2. 模型大小3. 运行代码 四、ollama部署1. 安装ollama2. 安装 Llama 3.2 Vision 模型3. 运行 Llama 3.2-Vision 五、效果…...

【DeepSeek】deepseek可视化部署

目录 1 -> 前文 2 -> 部署可视化界面 1 -> 前文 【DeepSeek】DeepSeek概述 | 本地部署deepseek 通过前文可以将deepseek部署到本地使用&#xff0c;可是每次都需要winR输入cmd调出命令行进入到命令模式&#xff0c;输入命令ollama run deepseek-r1:latest。体验很…...

【Git版本控制器】:第一弹——Git初识,Git安装,创建本地仓库,初始化本地仓库,配置config用户名,邮箱信息

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ 相关笔记&#xff1a; https://blog.csdn.net/dj…...

Fabric.js、leaferjs、pixi.js 库的对比分析

文章目录 一、引言二、参与对比的 canvas 库简介三、性能对比四、易用性对比五、功能特性对比六、综合评价与使用建议七、总结 在前端开发中&#xff0c;canvas 库为实现丰富的图形效果和交互功能提供了强大的支持。本文将对 Fabric.js、leaferjs 和 pixi.js 这三个常见的 canv…...

JVM——堆的回收:引用计数发和可达性分析法、五种对象引用

目录 引用计数法和可达性分析法 引用计数法&#xff1a; 可达性分析算法&#xff1a; 五种对象引用 软引用&#xff1a; 弱引用&#xff1a; 引用计数法和可达性分析法 引用计数法&#xff1a; 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&…...

2.11 sqlite3数据库【数据库的相关操作指令、函数】

练习&#xff1a; 将 epoll 服务器 客户端拿来用 客户端&#xff1a;写一个界面&#xff0c;里面有注册登录 服务器&#xff1a;处理注册和登录逻辑&#xff0c;注册的话将注册的账号密码写入数据库&#xff0c;登录的话查询数据库中是否存在账号&#xff0c;并验证密码是否正确…...

开源模型应用落地-Qwen1.5-MoE-A2.7B-Chat与vllm实现推理加速的正确姿势(一)

一、前言 在人工智能技术蓬勃发展的当下,大语言模型的性能与应用不断突破边界,为我们带来前所未有的体验。Qwen1.5-MoE-A2.7B-Chat 作为一款备受瞩目的大语言模型,以其独特的架构和强大的能力,在自然语言处理领域崭露头角。而 vllm 作为高效的推理库,为模型的部署与推理提…...

相得益彰,Mendix AI connector 秒连DeepSeek ,实现研发制造域场景

在当今快速发展的科技领域&#xff0c;低代码一体化平台已成为企业数字化转型的关键工具&#xff0c;同时&#xff0c;大型语言模型&#xff08;LLM&#xff09;如 DeepSeek 在自动生成代码和提供智能建议方面表现出色。 Mendix 于近期发布的 GenAI 万能连接器&#xff0c;目前…...

英语笔记【一】词性

一、be 动词 be 动词&#xff0c;是英语中的一种词汇用法&#xff0c;一般用来表示“是”的意思&#xff0c;也可表示“成为”的意思。 be动词的用法有多种变化形式。英语的句子必有一个动词。be 动词自然也是动词的一种。 am 用于第一人称单数&#xff1b;is 第三人称单数&a…...

同为科技智能PDU助力Deepseek人工智能和数据交互的快速发展

1 2025开年&#xff0c;人工智能领域迎来了一场前所未有的变革。Deepseek成为代表“东方力量”的开年王炸&#xff0c;不仅在国内掀起了技术热潮&#xff0c;并且在全球范围内引起了高度关注。Deepseek以颠覆性技术突破和现象级应用场景席卷全球&#xff0c;这不仅重塑了产业格…...

.NET Web-静态文件访问目录浏览

一、Web根目录访问 创建wwwroot文件夹app.UseStaticFiles(); // 启⽤静态⽂件中间件url/路径 进行访问 二、Web根目录之外的文件 app.UseStaticFiles(new StaticFileOptions {FileProvider new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRootPath,&qu…...

redis sentinel模式 与 redis 分片集群 配置

Redis 最低为5.0版本&#xff0c;以下为6.2.6版本信息。 模式 高可用性 数据分片 部署复杂度 适用场景 Sentinel 模式 高 无 中等 中小规模&#xff0c;需要高可用性 集群模式 高 支持 复杂 大规模&#xff0c;需要高…...

CentOS安装Docker,Ubuntu安装Docker,Docker解决方案

文章目录 CentOS7安装DockerUbuntu修改Docker镜像源docker设置容器自动启动启动时加--restartalways如果已经过运行的项目docker compose设置容器自启动 docker file修改时区docker在容器执行命令简单粗暴的办法安装curl docker compose命令安装docker compose Docker WEB 图形…...

【php】php json_encode($arr) 和 json_encode($arr, 320) 有什么区别?

在 PHP 中&#xff0c;json_encode() 函数用于将 PHP 变量&#xff08;通常是数组或对象&#xff09;编码为 JSON 格式的字符串。json_encode($arr) 和 json_encode($arr, 320) 的区别主要在于第二个参数&#xff0c;该参数是一个由多个 JSON_* 常量按位或&#xff08;|&#x…...

【CubeMX+STM32】SD卡 U盘文件系统 USB+FATFS

本篇&#xff0c;将使用CubeMXKeil, 创建一个 USBTF卡存储FatFS 的虚拟U盘读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA FatFs USB 三、Keil 编辑代码 四、实验效果 串口助手&#xff0c;实现效果&#xff1a; U盘&#xff0c;识别效果&#xff1a; 一、简述 上…...

node.js+兰空图床实现随机图

之前博客一直用的公共的随机图API&#xff0c;虽然图片的质量都挺不错的&#xff0c;但是稳定性都比较一般&#xff0c;遂打算使用之前部署的兰空图床&#xff0c;自己弄一个随机图 本文章服务器操作基于雨云——新一代云服务提供商的云服务器进行操作&#xff0c;有兴趣的话可…...

【xdoj离散数学上机】T283

递归函数易错&#xff1a; 防止出现递归死循环&#xff01; 题目 题目&#xff1a;求诱导出的等价关系的关系矩阵 问题描述 给定有限集合上二元关系的关系矩阵&#xff0c;求由其诱导出的等价关系的关系矩阵。 输入格式 第一行输入n&#xff0c;表示矩阵为n阶方阵&#xff0c…...

缓存机制与 Redis 在高性能系统中的应用

引言 随着互联网应用日益增长&#xff0c;用户对系统的响应速度和稳定性提出了更高的要求。在高并发、大流量的场景下&#xff0c;数据库的读取压力会急剧上升&#xff0c;导致数据库的响应速度变慢&#xff0c;甚至引发性能瓶颈。为了缓解这一问题&#xff0c;缓存机制成为了…...

C++之2048小游戏 第二期

不是&#xff0c;一天点赞就到15了&#xff1f;&#xff01;好吧&#xff0c;那我更新一下 1. 逻辑 &#xff08;真的有人会看吗&#xff1f;&#xff09; 注&#xff1a;本文1.1章为AI生成&#xff0c;如有错误欢迎在评论其指出&#xff01; 1.1 普通/最初逻辑 这里我们首…...

DeepSeek AI 满血版功能集成到WPS或Microsoft Office中

DeepSeek AI集成到 WPS或Microsoft Office中, 由于deepseek被攻击或者非常繁忙导致超时的服务器&#xff0c;所以可以用硅基流动部署的DeepSeek 。当然用官网的也可以。 使用 OfficeAI 插件集成(wps为例)&#xff1a; 下载并安装 OfficeAI 插件&#xff1a;从可靠的软件下载平台…...

微服务SpringCloud Alibaba组件nacos教程(一)【详解naocs基础使用、服务中心配置、集群配置,附有案例+示例代码】

一.Nacos教程 文章目录 一.Nacos教程1.1 Nacos简介1.2 nacos基本使用直接下载打包服务源码方式启动 1.3 创建nacos客服端1.4 nacos集群配置1.5 nacos配置中心 1.1 Nacos简介 nacos是spring cloud alibaba生态中非常重要的一个组件&#xff0c;它有两个作用&#xff1a; 1:注册…...

2017年上半年软件设计师上午真题知识点整理(附试卷及答案)

以下是2017年上半年软件设计师上午真题的知识点分类整理&#xff0c;涉及定义的详细解释&#xff0c;供背诵记忆。 1. 计算机组成原理 CPU与存储器的访问。 Cache的作用: 提高CPU访问主存数据的速度&#xff0c;减少访问延迟。存储器的层次结构: 包括寄存器、Cache、主存和辅存…...

【MySQL】基础篇

1. MySQL中的NULL值是怎么存放的&#xff1f; MySQL的compact行格式中会用【NULL值列表】来标记值为NULL的列&#xff0c;NULL值不会存储在行格式中的真实数据部分。 NULL值列表会占用1字节空间&#xff0c;当表中所有字段都被定义成NOT NULL&#xff0c;行格式中就不会有NULL值…...