RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support()
...
The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.
def get_instance(module, name, config, *args):
# GET THE CORRESPONDING CLASS / FCT
return getattr(module, config[name]['type'])(*args, **config[name]['args'])
def data_iter(batch_size, features, labels):
num_examples = len(features)
indices = list(range(num_examples))
random.shuffle(indices) # 样本的读取顺序是随机的
for i in range(0, num_examples, batch_size):
j = torch.LongTensor(indices[i: min(i + batch_size, num_examples)]) # 最后一次可能不足一个batch
yield features.index_select(0, j), labels.index_select(0, j)
附上一位大佬的 yield 教程
import cv2
import numpy as np
import os
def unpickle(file):
import cPickle
with open(file, 'rb') as f:
dict = cPickle.load(f)
return dict
def main(cifar10_data_dir):
for i in range(1, 6):
train_data_file = os.path.join(cifar10_data_dir, 'data_batch_' + str(i))
print(train_data_file)
data = unpickle(train_data_file)
print('unpickle done')
for j in range(10000):
img = np.reshape(data['data'][j], (3, 32, 32))
img = img.transpose(1, 2, 0)
img_name = 'train/' + str(data['labels'][j]) + '_' + str(j + (i - 1)*10000) + '.jpg'
cv2.imwrite(os.path.join(cifar10_data_dir, img_name), img)
test_data_file = os.path.join(cifar10_data_dir, 'test_batch')
data = unpickle(test_data_file)
for i in range(10000):
img = np.reshape(data['data'][i], (3, 32, 32))
img = img.transpose(1, 2, 0)
img_name = 'test/' + str(data['labels'][i]) + '_' + str(i) + '.jpg'
cv2.imwrite(os.path.join(cifar10_data_dir, img_name), img)
if __name__ == "__main__":
main('cifar-10-batches-py')
复制的别人的代码
def show_fashion_mnist(images,labels):
use_svg_display()
_,figs = plt.subplots(1,len(images),figsize=(12,12))
for f,img,lbl in zip(figs,images,labels):
f.imshow(img.view((28,28)).numpy())
f.set_title(lbl)
f.axes.get_xaxis().set_visible(False)
f.axes.get_yaxis().set_visible(False)
plt.show()
xc,yc 中心点坐标
w,h,angle 宽高、角度
def rotatePoint(xc, yc, xp, yp, theta):
xoff = xp - xc
yoff = yp - yc
cosTheta = math.cos(theta)
sinTheta = math.sin(theta)
pResx = cosTheta * xoff + sinTheta * yoff
pResy = - sinTheta * xoff + cosTheta * yoff
return str(int(xc + pResx)), str(int(yc + pResy))
x1, y1 = rotatePoint(x, y, x - w / 2, y - h / 2, -angle)
x2, y2 = rotatePoint(x, y, x + w / 2, y - h / 2, -angle)
x3, y3 = rotatePoint(x, y, x + w / 2, y + h / 2, -angle)
x4, y4 = rotatePoint(x, y, x - w / 2, y + h / 2, -angle)
for i in random.sample(range(111,119),3):
print(i)
遇到了 NotImplementedError 这个东西是啥呢
简单来说,在python中,raise可以实现报出错误的功能,而报出错误的条件是程序员可以自己规定的。在面向对象编程中,如果想在父类中预留一个方法,使该方法在子类中实现。如果子类中没有对该方法进行重写就被调用,则报NotImplementError这个错误
demo如下
class One(object):
def show(self):
raise NotImplementedError
class Two(One):
def show(self):
print('hello world!')
number = Two()
number.show()
One 里的 show 函数,我想在子类中重写,所以在父类中,我声明一下就好了,如果你写子类时忘了重写了,让他报错 NotImplementedError 告诉你,你忘了在子类中实现啦!
parser.add_argument('--num_workers',default=0,type=int)
torch.argmax的dim维度问题
自己看大神的博客吧,叫我也讲不明白,很抽象
torch.argmax中dim详解
x, id1 = F.max_pool2d(x, kernel_size=2, stride=2, return_indices=True)
说下里面的参数 return_indices 指的是,你做 MAX池化 时选择的最大值在原图中的位置(index)
说说语义分割
他是对每个像素点进行分类,所以一般都是最后输出的是一个0,1的特征图,所以你可能会问,那多分类怎么办,多分类的话,他是每个类别都会输出一个0,1的特征图,也就是每一类都给你分一次。
torch 里的 shape 一般都是(batch,C,W,H),batch 是 batch_size,C是通道数,作为最后一层的输出层,他每个类别会输出一个特征图,所以有几个类别,通道数就是几。
python-opencv 的 erode(腐蚀)函数
opencv 更新的真快啊
4.5.4 版的 opencv 用 erode 之前,必须用 cv2.getStructuringElement() 构造他的 kernel,不然报错
启动vscode 发生错误
发现一个小东西
pytorch 保存 模型时
torch.save(model, './model_para.pth') #保存完整的模型结构
torch.save(model.state_dict(), './model_para.pth') #只保存模型的参数
有啥用呢这玩意儿,在你可视化模型结构的时候,最好保存完整结构,不然可视化会很拉跨。
另外推荐一个可视化神器 netron
__call__
函数说明
这个函数可以帮助你理解为什么有些类对象没有调用方法就可以执行某些其成员函数。
该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。
懂了吧,重载()符号。
在 pytorch 中的__call__
里面调用了 forward()函数,所以你在 model = VGG16()
output = model(x)
时,就会自动调用 forward()了
相关博客
梳理一下卷积过程的一些细节
一张图片是三通道的,那么对应的卷积核也是三通道的,一个卷积核是三通道,N 个卷积核就是 N*3 通道。一个卷积核对图片的三个通道做完卷积操作后,输出一个单通道的特征图,N 个卷积核做完卷积操作后输出 N 个特征图。
关于 torch.nn 和 torch.nn.functional 的用法问题
nn.Xxx和nn.functional.xxx的实际功能是相同的,运行效率也近乎相同。
至于喜欢哪一种方式,是个人口味问题,但PyTorch官方推荐:具有学习参数的(例如,conv2d, linear, batch_norm)采用nn.Xxx方式,没有学习参数的(例如,maxpool, loss func, activation func)等根据个人选择使用nn.functional.xxx或者nn.Xxx方式。但关于dropout,个人强烈推荐使用nn.Xxx方式,因为一般情况下只有训练阶段才进行dropout,在eval阶段都不会进行dropout。使用nn.Xxx方式定义dropout,在调用model.eval()之后,model中所有的dropout layer都关闭,但以nn.function.dropout方式定义dropout,在调用model.eval()之后并不能关闭dropout。
__getitem__
函数今天编译 caffe 时遇到问题,先是缺少 protobuf 编译失败,然后开始安装 protobuf,
又遇到 aclocal-1.16: command not found
直接 autoreconf -ivf 这个命令解决,咱也不知道啥原理。
dim 参数
举个例子
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((x,y),dim=0)
torch.cat((x,y),dim=1)
(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 2., 1., 4., 3.],
[ 1., 2., 3., 4.],
[ 4., 3., 2., 1.]]),
tensor([[ 0., 1., 2., 3., 2., 1., 4., 3.],
[ 4., 5., 6., 7., 1., 2., 3., 4.],
[ 8., 9., 10., 11., 4., 3., 2., 1.]]))
dim = 0 是以行为目标进行操作,表现为,两个向量摞在一起。
dim = 1 是以列为目标进行操作,表现为,两个向量并排在一起。
y = torch.tensor([0,3])
y_hat = torch.tensor([[0.1,0.3,0.6,0.9],[0.3,0.2,0.5,0.1]])
y_hat[[0,1],y]
输出为
tensor([0.1000, 0.1000])
说下这里的逻辑
y_hat[[0,1],y] 是从 y_hat 里取值,[0,1] 你要取的第几个数,下标从0开始,这里表示要取两个数,
怎么取呢,根据 y 里面的值来取,把 y 里的值当作下标索引,所以 第一个数为,
y_hat 里的第一个数的第一个数(y_hat[0][0]),这样以此类推
net.apply(Function)
image = torch.Tensor(image).to(device)
数据label = torch.Tensor([int(label)]).to(device)
标签net = Net()
模型net.cuda()
nn.Sequential 的写法
nn.MaxPool2d(kernel_size=2,stride=2,return_indices=False)
nn.functional 的写法
output,id1 = F.max_pool2d(output,kernel_size=2,stride=2,return_indices=True)
把一个多维的张量拉平是一个在神经网络中经常要使用的操作,在pytorch中同样也有许多方法来进行拉平
output = torch.flatten(output,start_dim=1) 转 caffe 时支持这种写法
output = output.view(10,-1)
output = output.reshape(10,-1)
给大家推荐一个pytorch转caffe的框架
推荐理由是,作者人很厉害,也很nice,并且他的框架一直更新维护到现在,其他框架两年前已经没人维护了。
地址在这,他是ubuntu下的,他有自己的caffe,需要编译
F0216 14:08:23.464159 4731 blob.cpp:34] Check failed: shape[i] <= 0x7fffffff / count_ (1280 vs. 951) blob size exceeds INT_MAX
*** Check failure stack trace: ***
@ 0x7f173514b5cd google::LogMessage::Fail()
@ 0x7f173514d433 google::LogMessage::SendToLog()
@ 0x7f173514b15b google::LogMessage::Flush()
@ 0x7f173514de1e google::LogMessageFatal::~LogMessageFatal()
@ 0x7f173580379b caffe::Blob<>::Reshape()
@ 0x7f17358f12a5 caffe::BaseConvolutionLayer<>::Reshape()
@ 0x7f173583f992 caffe::CuDNNConvolutionLayer<>::Reshape()
@ 0x7f17357a2e61 caffe::Net<>::Init()
@ 0x7f17357a46e1 caffe::Net<>::Net()
@ 0x7f17357dec9a caffe::Solver<>::InitTrainNet()
@ 0x7f17357e0007 caffe::Solver<>::Init()
@ 0x7f17357e03aa caffe::Solver<>::Solver()
@ 0x7f1735783a53 caffe::Creator_SGDSolver<>()
@ 0x40afb9 train()
@ 0x4077c8 main
@ 0x7f17338e1840 __libc_start_main
@ 0x408099 _start
@ (nil) (unknown)
已放弃 (核心已转储)
是因为数据大小超出了caffe的最大范围,需要将数据resize一下
from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
ImportError: dynamic module does not define module export function (PyInit__caffe)
网上说因为是python版本问题
I0216 15:01:55.187206 7881 upsample_layer.cpp:27] Params 'pad_out_{}_' are deprecated. Please declare upsample height and width useing the upsample_h, upsample_w parameters.
F0216 15:01:55.187214 7881 upsample_layer.cpp:59] Check failed: bottom[0]->height() == bottom[1]->height() (46 vs. 45)
原因是:
(1)如果输入图像的高和宽不是32的整数倍,需要指定upsample_h, upsample_w的大小,不然会出现维度不一致的错误,原因是upsample需要借助编码过程中pool层的位置信息,例如: pool前特征图大小为45, pool后为23,如果直接对23 unsample, 其大小为46, 而pool产生的位置图大小为45,造成upsample时大小不一致;
(2)指定upsample_h upsample_w的大小时,需要根据编码过程中对应pool特征图的大小,来设定upsample的大小,例如样例proto中输入图像大小为480*360, 以360分析:360—pool1(180)—pool2 (90)—pool3 (45)—pool4(23)—pool5(12), upsample5需要借助pool4位置信息,需要与pool4大小一致,因此upsamle_h=23 ~
原文链接
optimizer_1.step()
scheduler_1.step()
undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE
Google该错误,发现原因是boost_python的版本不匹配,默认python版本为3.5,而boost_python为2.7。
解决方法:
修改 makefile.config 里 72行的
PYTHON_LIBRARIES := boost_python3 python3.6m #改成你自己的python版本
然后你可能会遇到 Cannot find -lboost_python3
请参考这俩链接 链接一
链接二
然后重新编译caffe
torch.manual_seed(SEED) CPU
torch.cuda.manual_seed(SEED) GPU
今天安装Visual_Studio2022,运行项目时报错找不到exe文件,而且四百多个头文件不能导入。
找到了解决办法
链接地址
问题原因是:我为了安装双系统,分了一个硬盘出去,那个盘之前是装Visual_Studio的,所以注册表里的地址需要手动修改。
最近碰到了caffe训练,不收敛的问题,找到一篇博客救了我。是一个batchnormal层的配置问题
链接地址
Pytorch model.load_state_dict()加载模型遇到问题
‘model’ object has no attribute ‘copy’
是因为训练模型时没有用 model.state_dict() 来保存模型
保存和加载方式是对应的
链接地址
今天找到一个vscode写C/C++的教程,很好用。
教程一
教程二
基本教程一就能解决
还是vscode中写C++
在 tasks.json 这个配置文件中
"args": [
"${file}",
"-o", // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
"${fileDirname}/${fileBasenameNoExtension}.exe",
"-g", // 生成和调试有关的信息
"-m64", // 不知为何有时会生成16位程序而无法运行,此条可强制生成64位的
"-Wall", // 开启额外警告
"-static-libgcc", // 静态链接libgcc,一般都会加上
"-fexec-charset=UTF-8", // 生成的程序使用GBK编码,不加这条会导致Win下输出中文乱码;繁体系统改成BIG5
"-D__USE_MINGW_ANSI_STDIO", // 用MinGW写C时留着,否则不需要,用于支持printf的%zd和%Lf等
"-DNDEBUG",
], // 编译的命令,其实相当于VSC帮你在终端中输了这些东西
这个配置可以相当于gcc的编译参数
当你用 #ifndef NDEBUG 这个东西时,可以在这个配置里修改。
C++ 内联函数
内联函数一般作用于简单不复杂的函数中,可以减少运行时间。
内联函数一般定义在头文件中。
用 inline 来定义
今天想训练下segnet,之前已经配置好caffe的训练环境,好久没用了,大概有一个月,今天训练时突然报错说cuda和cudnn相关的lib没有了,不知道为什么。
报错内容
./build/tools/caffe: error while loading shared libraries: libcudart.so.8.0: cannot open shared object file: can not open shared object file: No such file or directory
解决链接
今天在ubuntu上用微信,屏幕中间一直有个黑色的方块,在微信里发一条666的消息就好了,很奇怪。
解决ubuntu使用百度网盘闪退问题:
sudo apt-get install alien
因为缺少依赖,安装即可
今天弄了下在caffe中用 Deconvolution 来替换 upsample ,先了解prototxt中的网络结构的配置含义。
参考链接
找到一个关于 python ctypes 包的资料
链接地址
找到一个 TensorRt的学习资料,trtpy第三方库,是一个开发好的运行环境
链接地址
今天看到了几个语义分割的评价指标,分别是 G,C,Miou,BF
G:global accuracy,测量数据集中所有像素正确分类的百分比
C:class average accuracy,所有类的预测准确度的平均值
mIOU:每一个类的交并比的平均
BF:边界F1测量
平时重装系统会发现 Anaconda 快捷方式没有了。
用这个吧
OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
#解决办法
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
__all__
这个变量a.py
__all__ = ['UNet', 'NestedUNet']
b.py
import archs
ARCH_NAMES = archs.__all__
__all__
是一个字符串list,用来定义模块中对于from XXX import *时要对外导出的符号,即要暴露的借口,但它只对import *起作用,对from XXX import XXX不起作用。
__all__
里面的内容表示对外暴露的内容,其他内容及时你 import 了也找不到。
config = vars(parse_args())
vars 会将命令行参数解析成字典
vars() 函数返回对象的 __dic__ 属性。
__dict__ 属性是包含对象的可变属性的字典。
可以直接获得 parse_args() 字典中的值,也就是我们设置的参数
torch.stack(img,label,result,dim = 0)
找了几篇关于parser.add_argument参数的博客
资料
资料
在看UNet中,看到一个参数 deep_supervision 是深监督的意思,就是在网络的某个部位加入一个辅助的分类器作为一种网络分支来对主干网络进行监督的技巧,用来解决深度神经网络训练梯度消失和收敛速度过慢等问题。
链接资料
item()
链接资料
作用:取出单元素张量的元素值并返回该值,保持原元素类型不变。,即:原张量元素为整形,则返回整形,原张量元素为浮点型则返回浮点型。(就是取里面的值)
tqdm 的一些函数
资料链接
资料链接
pbar = tqdm(total=100)
pbar.set_postfix(‘loss’,‘iou’)
在进度条中可显示信息,如 loss,iou等
pbar.update(1)
进度条显示的百分比
__dict__
今天尝试了pytorch.prune 的剪枝,但是模型并没有变小,网上查是说只是参数的计算变简单了,并没有减少。
if epoch % 2 == 0:
name = [SegNet.encoder.conv1_1,SegNet.encoder.conv1_2,SegNet.encoder.conv2_1,SegNet.encoder.conv2_2,SegNet.encoder.conv3_1,SegNet.encoder.conv3_2,SegNet.encoder.conv3_3,
SegNet.encoder.conv4_1,SegNet.encoder.conv4_2,SegNet.encoder.conv4_3,SegNet.encoder.conv5_1,SegNet.encoder.conv5_2,SegNet.encoder.conv5_3,SegNet.conv6_1,
SegNet.conv6_2,SegNet.conv6_3,SegNet.conv7_1,SegNet.conv7_2,SegNet.conv7_3,SegNet.conv8_1,SegNet.conv8_2,SegNet.conv8_3,SegNet.conv9_1,SegNet.conv9_2,
SegNet.conv10_1,SegNet.conv10_2
]
for i in name:
model_ = i
prune.ln_structured(i,'weight',amount=0.5,n=2,dim=0)
prune.remove(i,'weight')
from __future__ import print_function
有时在代码开头会看到这样一行
from __future__ import print_function
是为了可以兼容不同版本的语言,例如 python2 像 python3 一样使用。
资料链接
import torch
import torch.nn as nn
import numpy as np
# pool of non-square window
## In the simplest case, the output value of the layer
# with input size (N,C,H,W)(N, C, H, W)(N,C,H,W),
# output (N,C,Hout,Wout)(N, C, H_{out}, W_{out})(N,C,Hout,Wout) and kernel_size (kH,kW)(kH, kW)(kH,kW) can be precisely described as:
data = np.arange(64).reshape((8,8))
A = torch.Tensor(data.reshape(1,1,8,8))
print('A=',A)
## MAX POOL
maxpool = nn.MaxPool2d((2, 2), stride=(2, 2),return_indices=True)
B,indices = maxpool(A)
print('B=',B)
## Upsample
Upsample = nn.Upsample(scale_factor=2, mode='bilinear'
## interpolate
x7 = F.interpolate(x6,scale_factor=2,mode='bilinear')
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum = 0.9)
scheduler = lr_scheduler.StepLR(optimizer, step_size = 100, gamma = 0.1)
[..., None]
这种东西。C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\cuda\NLLLoss2d.cu:95: block: [0,0,0], thread: [156,0,0] Assertion `t >=
0 && t < n_classes` failed.
C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\cuda\NLLLoss2d.cu:95: block: [0,0,0], thread: [157,0,0] Assertion `t >=
0 && t < n_classes` failed.
C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\cuda\NLLLoss2d.cu:95: block: [0,0,0], thread: [158,0,0] Assertion `t >=
0 && t < n_classes` failed.
C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\cuda\NLLLoss2d.cu:95: block: [0,0,0], thread: [159,0,0] Assertion `t >=
0 && t < n_classes` failed.
Traceback (most recent call last):
File "d:/code/Image_Segmentation-master/main.py", line 101, in <module>
main(config)
File "d:/code/Image_Segmentation-master/main.py", line 61, in main
solver.train()
File "d:\code\Image_Segmentation-master\solver.py", line 155, in train
loss = self.criterion(SR,GT.long())
File "E:\Anaconda3\envs\segnet\lib\site-packages\torch\nn\modules\module.py", line 1102, in _call_impl
return forward_call(*input, **kwargs)
File "E:\Anaconda3\envs\segnet\lib\site-packages\torch\nn\modules\loss.py", line 1150, in forward
return F.cross_entropy(input, target, weight=self.weight,
File "E:\Anaconda3\envs\segnet\lib\site-packages\torch\nn\functional.py", line 2846, in cross_entropy
return torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index, label_smoothing)
RuntimeError: CUDA error: device-side assert triggered
相关资料先放这里
资料1
资料2
资料3
终于解决了,不太清楚咋解决的,反正有以下几点:
1.类别数量和最后一层输出的数量容易错
2.loss 函数这里,CrossEntropyLoss 的话需要有类别权重这个参数
报错 expected scalar type Long but found Float
出错原因:torch._C.nn.nll_loss(input, target)的target是LongTensor格式,也就是分类的标签要是LongTensor格式,不能是FloatTensor。修改的话data.long()就可以了
并且 CrossEntropyLoss 损失函数中是包含 nll_loss 的,所以原因是一样的。
资料链接
关于 CrossEntropyLoss
资料链接
model = torch.load("float32模型路径")
torch.save(model.half(),"保存路径")
我用segnet试了下,模型变小了,精度下降了。
看 MobileNet 涉及到的东西
Depthwise(DW)卷积与Pointwise(PW)卷积,合起来被称作Depthwise Separable Convolution(参见Google的Xception),该结构和常规卷积操作类似,可用来提取特征,但相比于常规卷积操作,其参数量和运算成本较低。所以在一些轻量级网络中会碰到这种结构如MobileNet。
RuntimeError: shape '[2, 416, 416]' is invalid for input of size 173056
刚开始我以为是显存问题,后来仔细一看发现其实是你的数据总量除不尽你的 batch_size ,比如我一共2119张图,batch_size=2,最后一个epoch会剩一个,所以报错,我记得在torch.utils.data.Dataloader 中好像有一个参数,可以忽略除不尽那些,就解决了。但我太懒了,没改,哈哈~
nn.Module里面关于参数有两个很重要的属性named_parameters()和parameters(),前者给出网络层的名字和参数的迭代器,而后者仅仅是参数的迭代器。
os.system('cat A > B')
这个语句的意思是将B文件接到A文件上,os.system() 作用是执行windows的命令语句 cat A > B 在windows中就是将两个文件相连接。
np.inf 表示+∞,是没有确切的数值的,类型为浮点型
cv2.split() 拆分通道
cv2.merge() 合并通道
import cv2
img = cv2.imread('test.jpg') #opencv读取图像文件
b, g ,r =cv2.split(img) #顺序是b,g,r,不是r,g,b
merged = cv2.merge([b,g,r])
cv2.imshow('image',img)
cv2.imshow("Blue 1", b)
cv2.imshow("Green 1", g)
cv2.imshow("Red 1", r)
cv2.imshow("merged 1", merged)
cv2.waitKey(0) #一定要加cv2.waitKey(0),要不然会报错
import numpy as np
# 一维矩阵
x= np.arange(12)
print(np.clip(x,3,8))
# 多维矩阵
y= np.arange(12).reshape(3,4)
print(np.clip(y,3,8))
安装 Scalabel 标签工具
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
原因是因为没有 Microsoft Visual C++ 需要去这里下载安装 https://visualstudio.microsoft.com/visual-cpp-build-tools/
RLE 格式
RLE,Run-Length Encoding,变动长度编码算法,是一种对于二值图像的编码方法,以不同码字来表示连续的黑、白像素数. RLE 是计算连续出现的资料长度再进行压缩,是一种简单的非破坏性资料压缩法,且压缩和解压缩都非常快.
很多分割数据集为了节省空间,标注文件采用了 RLE 格式,比如 COCO 等. 但在分割类模型学习与训练中,往往采用的是 png 格式的数据作为标注.
资料链接
autoware 卸载
sudo apt autoremove
平时写代码路径问题会很麻烦,有一个包 Path 可以让你的路径高效、好看
链接地址
import torch
a = torch.one([3,3])
a = a[None]
print(a.shape)
# a = a[None] 可以升维,多的维度为1
from pathlib import Path
img_root = Path(cfg.DATASET.DATAROOT)
self.img_root = img_root /‘train’
self.img_root = self.img_root.iterdir()
这里的 / 的意思是在目录 img_root 后边拼接一个 train
属于 Path 的目录,可以用 iterdir() 遍历目录里的文件
ubuntu中加入 sudo 权限
修改 /etc/sudoers 文件
在 #User privilege specification
下按照 root ALL=(ALL:ALL) ALL 格式写自己的
例:cc ALL=(ALL:ALL) ALL
all() 这个函数是,用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。
一个非常好的 lambda 博客
lambda
一个 @staticmethod 和 @classmethod 的博客
链接资料
RGB2BGR
color_seg = color_seg[..., ::-1]
训练数据预加载,可提高训练速度
使用 prefetch_generator 库在后台加载下一 batch 的数据。
安装:
pip install prefetch_generator
使用:
from torch.utils.data import DataLoader
from prefetch_generator import BackgroundGenerator
class DataLoaderX(DataLoader):
def __iter__(self):
return BackgroundGenerator(super().__iter__())
然后用 DataLoaderX 替换原本的 DataLoader。
提速原因:
原本 PyTorch 默认的 DataLoader 会创建一些 worker 线程来预读取新的数据,但是除非这些线程的数据全部都被清空,这些线程才会读下一批数据。
使用 prefetch_generator,我们可以保证线程不会等待,每个线程都总有至少一个数据在加载。
今天跑 monodepth2 遇到几个报错
1.从 pytorch 官网下载 resnet 遇到 url 报错
解决方案
接着又报错,ImportError: DLL load failed while importing _ssl: 找不到指定的模块。
解决方案
2.Error loading “D:\Anaconda3\envs\segnet\lib\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll” or one of its dependencies.
解决方案 将 num_works 改成 0,因为我是windows
#! /usr/bin/env python
支持全局快门的相机,每一行同时开始曝光,同时结束曝光,曝光完成后,数据开始逐行读出。
支持卷帘式快门的相机,第一行曝光结束后,立即开始读出数据,数据完全读出后, 下一行开始读出数据。
全局快门同时曝光传感器网格中的所有像素,因此最终数字图像的每个像素都是在同一时刻捕获的。这意味着不会发生由于使用卷帘快门而导致的移动物体/场景的图像失真。全局快门传感器通常比卷帘快门传感器尺寸更大、更感光。然而,全局快门传感器更昂贵,且最大帧率可能低于类似的卷帘快门传感器,特别是具有高分辨率的传感器。
卷帘快门的第一行和最后一行像素的捕获之间存在时间差。这意味着在组装整个图像时,场景中快速移动的对象可能会失真或模糊。
成本上,全局快门相机比卷帘相机更贵。
使用上,全局快门适合高速产线,卷帘快门适合缓慢产线。
————————————————
版权声明:本文为CSDN博主「脆皮茄条」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43917589/article/details/125279598
在做numpy的矩阵操作时,报错
TypeError: ufunc ‘bitwise_and‘ not supported for the input types, and the inputs could not be safely
if语句中&连接符前后的两个条件需用括号括起来。
threeD_mask = (0.55 > threeD[:,:,1]/1000.0) & (threeD[:,:,1]/1000.0 > -1.0)