为ONNX设置动态输入
在使用torch自带的方法将训练好的权重文件转换成onnx格式时,输入的张量可以是静态的,也可以通过一些设置修改成动态的。 静态:在导出onnx时传入输入尺寸,在之后的预测过程中也必须使用相同尺寸的输入。 这种方法对于像分割检测这种任务不太友好,我们希望模型能够自适应输入尺寸,所以需要设置成动态输入形式。 设置方法也很方便,只需在导出时传入dynamic_axes,指定要动态输入的维度即可。 123456789101112131415161718192021222324252627282930313233343536373839404142434445import argparseimport osimport numpy as npimport timeimport cv2from modeling.deeplab import *from dataloaders import custom_transforms as trfrom PIL import Imagefrom torchvision import transformsfrom dataloaders.utils...
VIT如何处理不同尺寸的输入图片?
假设vit的输入图片尺寸是224,将图片分为固定大小的patch,patch大小为patch_size=16x16 则每张图像会生成224x224/16x16=14*14=196个patch, 每个patch的长度是16*16*3=768 这里还需要加上一个特殊字符cls,因此最终的维度是197x768 相当于NLP中一个句子有197个单词,每个单词的embedding dim是768 现在,保持patch size不变,将输入图片尺寸改成288*288 当输入图片尺寸发生变化时,由于每个 patch 的尺寸固定,图片切分出的 patch 数就会发生变化。表现在上述特征图中,就是特征图的尺寸发生了变化。这样一来,我们原本位置编码图的尺寸就和图像特征图的尺寸对不上了,无法进行后续的计算。 找到了问题所在,解决的方法也就顺理成章了。位置编码代表的是 patch 所在位置的附加信息,那么如果和图像特征图的尺寸不匹配,只需要使用双三次插值法(Bicubic)对位置编码图进行插值缩放,缩放到与图像特征图一致的尺寸,就同样可以表现每个...
Kaggle-GI-Tract竞赛-EDA
每个case都对应若干Day的若干个scan得到的slices,在train.csv中,每个case-Day-slice占3行,分别对应3个类别(大肠、小肠、胃)的标注信息 因此,在制作每一个case-Day-slice的mask时(制作1D数据),这三行分别作为mask的一个通道,因此mask是3个通道的: 1234567891011def id2mask(id_): idf = df[df['id']==id_] wh = idf[['height','width']].iloc[0] shape = (wh.height, wh.width, 3) mask = np.zeros(shape, dtype=np.uint8) for i, class_ in enumerate(['large_bowel', 'small_bowel', 'stomach']): cdf =...
权重衰减和L2正则化
权重衰减是在更新模型的参数时,对当前参数乘以一个系数,公式如下: 而L2正则化是在损失函数后面加一项约束,如下: 在使用SGD作为优化器,且满足$\lambda’=\frac{\lambda}{\alpha}$时,权重衰减和L2正则化等价,证明如下: 参考: [1] https://blog.csdn.net/weixin_41803874/article/details/108730883 [2] https://zhuanlan.zhihu.com/p/498372080 [3] https://arxiv.org/pdf/1711.05101.pdf
标签平滑的PyTorch实现
解决过拟合的手段有很多,比如early stopping, dropout, weight regularization,然而,这些手段无法解决模型对于标签过度自信的问题:在标签有误时,容易导致模型学习到错误的内容。 在普通的交叉熵函数中,只有预测正确的类别才会对损失作出贡献。标签平滑的思想是对标签target的onehot形式进行改造,使其取值不再是非0即1,这样,预测错误的类别也会对损失作出较小的贡献,从而迫使模型进一步学习不同类别之间的区别,避免了模型的过度自信。 使用标签平滑,只需对标签target进行变换即可,其余部分和交叉熵的计算方式是一样的,平滑后的标签如下: $$y_{ls}=(1-\alpha)*y_{onehot}+\frac{\alpha}K$$ 其中,K是类别数,$\alpha$是平滑系数,$y_{onehot}$是原始标签的onehot结果。 标签平滑的PyTorch代码实现如下: 12345678910111213141516171819import torchimport torch.nn.functional as Fdef...
鲸鱼和海豚识别竞赛解析:上分思路
数据backfin:只保留目标的背鳍特征(通过检测的方法得到的),有点类似人脸关键点的作用。 数据增强使用: 颜色增强: random_hue random_saturation random_contrast random_brightness 几何增强: random_flip_left_right 离线增强: 使用显著性目标检测去掉背景,得到无背景(背景变为白色)图片。统计这些图片中白色背景占比,并将占比低于某个阈值的图片取出来,添加到训练集中。 模型 EfficientNet-B5/6/7 效果相比ConvNext和SwinTransformer要好一些,且b7>b6=b5...
PyTorch中的collate_fn有什么作用?
在使用PyTorch创建自定义数据集时,通常是先使用数据和标签定义一个DataSet类,然后将其传入DataLoader,这样就定义好了一个数据加载器。 对于一些简单的任务,以上操作已经足够了。但有些时候,还需要自定义DataLoader类中的collate_fn方法。 DataSet类中定义了获取单个样本的方法(自定义__getitem__),DataLoader类中定义了获取一个batch个样本的方法(相当于多次执行__getitem__),将这一个batch的样本数据传入DataLOader类中的collate_fn方法,使用collate_fn中定义的逻辑对着一个batch的样本数据做进一步的处理。 下面以目标检测为例,进一步解释自定义collate_fn的必要性。 假设batch...
鲸鱼和海豚识别竞赛解析:验证&预测代码
本文的目标是对整个验证和预测的过程进行梳理,至于其中出现的一些概念,比如GeM Pooling,ArcFace等,将在后续出一篇文章进行介绍。 导入所需库12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849import osimport gcimport cv2import mathimport copyimport timeimport random# For data manipulationimport numpy as npimport pandas as pd# Pytorch Importsimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom torch.utils.data import Dataset, DataLoaderfrom torch.cuda import amp# Utilsimport joblibfrom tqdm import...
鲸鱼和海豚识别竞赛解析:训练代码
在上一篇文章中,我们已经介绍了赛题背景,目标任务,数据集格式以及评估指标,现在,来看看如何使用所给数据训练一个模型,来识别每张图片所对应的individual_id。 本文的目标是对整个训练过程进行梳理,至于其中出现的一些概念,比如GeM Pooling,ArcFace等,将在后续出一篇文章进行介绍。 导入所需库1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import osimport gcimport cv2import mathimport copyimport timeimport random# For data manipulatiimport numpy as npimport pandas as pd# Pytorch Importsimport torchimport torch.nn as nnimport torch.optim as optimimport torch.nn.functional as Ffrom...










