mmdetection框架学习
答疑解惑
配置文件的背后
mmdetection框架通过配置文件就能做到模型搭建, 那么他是如何得知这些模块在哪的呢? 这就涉及到了python的装饰类, 我们会发现很多类似这样的代码
123@MODELS.register_module() # 后续版本貌似检测头主干那些全部用这个了@DATASETS.register_module().....
这个会把定义的模块注册到mmdet框架管理的容器中, 其实就是一个字典, 名字到包名的对应
最后通过懒加载(这里也算不上真正的懒加载, 因为只要使用其中任意一个模块, 就会把所有模块全部导入) 把预先定义好的模块全部加载进去, 这个是mmdet/model/__init__.py
123456789101112131415161718# Copyright (c) OpenMMLab. All rights reserved.from .backbones import * # noqa: F401,F403from .data_preprocessors import * # noqa: F401,F403from .dense_h ...
python额外知识
前言
此篇文章主要记录一些环境问题, pip,conda的使用这些
pip
包安装规则
如果包不存在,则安装符合要求的最新版本, 可以通过下面命令查看此次安装的包的具体包版本, 也能查看当前源有哪些版本
1pip index versions 包名[范围]
如果包存在且符合要求,则不需要重新安装, 如果不符合要求则会删除此版本, 重新安装, 这就回到包不存在的规则
如果安装的包存在其他依赖, 安装依赖的时候也会执行此规则
包安装方式
源码安装: 从源码开始编译构建, 这个比较耗时间而且容易出错, 如果看到pip下载的是压缩包那些文件, 就是源码构建
预构建二进制包安装: 直接安装别人已经编译构建好的二进制文件(.whl格式)
对比项
源码安装
预构建 Wheel
安装速度
慢(需编译)
快(直接安装二进制)
兼容性
高(可适配不同环境)
依赖官方提供的 Wheel
定制性
高(可修改编译选项)
无(固定二进制)
依赖要求
需编译器(如 gcc)
仅需 pip
常见问题
版本冲突问题
第一种: 两个包依赖的共同包版本不一致 通常需要升降级一个包的版本( ...
内网穿透
内网穿透的作用就是将一个局域网机器暴露在公网上, 他的原理就是通过一个公网上的中间服务器接受以及传达信息给局域网机器, 所以需要一台中间服务器, 服务器上需要装好内网穿透的服务端, 局域网机器需要装好内网穿透客户端.
因此内网穿透我们有两种选择:
使用内网穿透服务商, 这样我们不需要自己装备服务器
使用自己的公网服务器
服务商
cpolar
官网
优点: 免费稳定, 能通过在线平台就看到连接到内网机器的ip+端口
缺点: 免费版无法使用固定端口
ChmlFrp
官网
优点: 免费且能固定端口, 也能通过在线平台就能看到内网机器的ip+端口
自建服务端
nps
官网
transformer及其变体学习
显存占用
对于transformer中, 最占用显存的部分就是注意力计算了, 他会产生一个很大的注意力得分矩阵, 这个矩阵形状通常是 ( batch , head, N, N) N代表序列维度
如果我们使用32批次, 一张640 640 的图片, 然后patch选 16 那 N就是1600, head选8, 显存占用就有
132 * 8 * 1600 * 1600 * 4 / 1024 / 1024 / 1024 = 2.44GB
一个注意力分数矩阵就已经2.44G了, 通常encoder和decoder有6层, 这个显存占用就已经很大了
主要减少显存占用的方法:
减小batch
增大patch, 也就可以减少N, 这个是O(N^2)级别的, 降低起来很有效
问题汇总
这个是我学习transformer中的一些疑惑
词嵌入的目的
问: 能否直接将词在词库中的编码直接交给transformer而不使用词嵌入
答:
直接使用单词在词库中的索引数字(即数字ID)作为输入是不可行的,原因有以下几点:
缺乏语义信息:数字ID只是单纯的标识符,不包含任何语义信息。例如,"猫 ...
python场景方案解决
拿到控制台所有输出
我这里是自己解析了命令, 暂时没有找到很好的库, 我这里解析的也不全
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061import osimport sysfrom tqdm import tqdmimport loggingimport atexitclass ParseConsoleStr: def __init__(self): self.buffer = [] self.current_line = "" def parse(self, text): for char in text: if char == "\r": self.current_line = "" # 回车后重置当前行 ...
python常用包学习
Numpy
提取数据
1. 索引
这种方式就跟数组的使用是一模一样的
1234arr = np.array([[1,2,3], [4,5,6], [7,8,9]])arr[0] # [1,2,3]arr[0,0] # [1] 等价于arr[(0,0)]arr[[0,1]] # [[1,2,3],[4,5,6]]
2.切片
其实索引就是一种特殊切片, 我个人觉得可以这么理解
123arr = np.array([[1,2,3], [4,5,6], [7,8,9]])arr[0] # [1,2,3] 等价于 arr[0,:]arr[[0,1]] # [[1,2,3],[4,5,6]] 等价于arr[[0,1], :]
总结
np里面的数组有多少维度, 默认取数据的时候, 就能指定多少维度, 不指定就是全选, 默认维度指定是从左到右
通过这种理解方式, 我们就很容易得知取了数据之后还有多少维度
需要注意的点就是 () 和 [] 的区别, () 就相当于正常取数据里面有个数据就是设置几个维度, 而[]只是设置一个维度
12a[(1,2,3)] => a[1,2,3]a[[1,2,3]] ...
目标检测领域的经典模型
前言
此文是我对目标检测领域各个经典模型的一个总结
Faster RCNN
Fast RCNN 的ROI是通过 SS(选择性搜索)得到的, 他的速度比较慢, 而且是在CPU里面执行的, 基于此, 在Fast RCNN 基础上提出了 RPN(区域建议网络), 直接通过主干网络提取出来的特征生成ROI
RPN
首先对于主干网络使用3x3的卷积进一步的提取特征(特征图大小不变), 然后将特征图分别送入 分类分支(背景还是前景), 回归分支(预测目标框位置)
RPN 里面引入了锚框的概念, 锚框就是以某一个点为中心点, 生成不同大小或者不同比例的框, 为什么引入锚框, 以及有什么用?
引入锚框是为了生成预选框, 这样生成是比SS快的, 我们的特征图中的每个点其实就是一个中心点, 然后将锚框对应特征图区域的特征值送入分类器和回归器得到预选框
锚框其实是使用了我们人的经验, 因为我们知道生活中物体大概都是多大的, 所以我们就可以基于此设计锚框
对于特征图每个点都会根据k个锚框生成k个预测框, 包含4个参数(位置信息), 2个参数(分类信息)
分类器
根据RPN产生的预测框, 生成对应位置的特 ...
yolo框架学习
本文是结合yolov8及其以后的框架做的总结
路径寻找
yolo中我们可以指定一下几个参数路径, 但是有时候他能找到有时候他又找不到, 所以我分析了一下原因, 只有在相对路径的时候才会出现这个问题
有的路径参数有如下几个:(仅讨论相对路径)
模型文件pt
数据集文件yaml
数据集yaml文件中的数据集路径
权重相对路径
模型文件 和 数据集yaml文件 就相当于普通文件没有做特殊处理, 因此文件路径是相对于当前执行目录(工作目录), 但是对于数据集yaml文件他还有一个单独搜索路径在于yolo安装包的cfg/datasets文件夹(我们自己的优先级更高)
数据集yaml文件中的数据集路径是相对于yolo定义的一个json配置记录的地址, 他的配置文件如下, 他默认在/home/DJM/.config/Ultralytics/settings.json
123456789101112131415161718192021{ "settings_version": "0.0.6", "datasets_dir&quo ...
论文阅读方法论
前言
方法
三遍法:
第一遍(海选): 看标题, 摘要, 然后直接跳到结论, 看完这些大概知道文章在讲什么, 然后看看实验和方法部分的图和表, 经过这些步骤就可以判断文章怎么样, 有没有必要继续下去
第二遍: 从头读到尾, 但是没必要在意太多的细节,比如公式证明, 但是 要搞清楚图和表 以及 作者提出了什么方法, 以及他的方法和别人的区别, 对于不懂的地方先做标记,比如他参考的文献你不懂的地方
第三遍: 精读文章, 每一句话在干什么, 即使不看文章, 你也知道这篇文章到底是在干啥了
pytorch学习
nn模块
权重初始化
123456789import torchimport torch.nn as nn# 定义线性层linear_layer = nn.Linear(in_features=10, out_features=5)# 直接赋值给权重和偏置linear_layer.weight.data.fill_(0.01) # 将权重全设置为 0.01linear_layer.bias.data.fill_(0) # 将偏置设置为 0
广播机制
广播机制的核心流程可以概括为:
从右往左逐个对比两个张量的维度。
相等时继续:如果对应维度大小相等,直接匹配。
不相等时判断是否有1:如果不相等,检查其中一个维度是否为1。如果是,则可以广播扩展成相等的维度。
无法匹配时停止:如果对应维度大小不相等,且都不为1,则广播机制无法继续,运算会报错。
缺少的维度补1:如果一个张量维度数量少,从右侧开始自动补充1,以便进行对比。
例如,如果有两个张量:
a 的形状是 (3, 1, 5)
b 的形状是 (4, 5)
按照广播机制,从右往左依次匹配:
最右边的维度 5 匹配。
中 ...