时间:8.3~8.31
理论上来说,InverseForm所依赖的网络是STN的逆操作
根据以上PR,确定要改的文件是:
源码中最重要的几个文件:
2021年论文刚发布的时候很多issue是回复了,后面的就没有什么回复了。。。还是有一些是有价值的信息。
Design question #6
b_gt
是通过对真实seg图像进行sobel处理得到,而b_pred
不是通过类似方式,即对预测seg图像进行sobel处理得到?y_pred
送入一个boundary head
来生成b_pred
。Questions about the test dataset #5
edge_gts = inputs['edge']
是怎么得到的y_gt
中提取的,可以在gt map上使用sobel/laplacian,然后再threshold得到一个二值图。Training the Inverseform Net on custom dataset #7
b_gt
(边界map),你是如何在ImageNet上训练IF module的呢Two confusions about the code #1
Confuse about predict scales and shifts and the loss #9
InverseTransform2D
的代码中,有mean_square_inverse_loss = (((distance_coeffs*distance_coeffs).sum(dim=1))**0.5).mean()
,这会让4个值都朝着向0的方向优化。访问:https://cloud.blsc.cn,直接使用用户名密码无法成功登录,需要关注北京超级云计算中心
,微信扫码登录,在微信的页面里填写邮件里给的用户和密码。
然后就可以看到控制台了,在资源管理
->SSH直连管理
中配置密钥或者密码
配置好之后,复制下面给的ssh命令,
可以视情况选择接入网络
,我用Hong Kong
不行,但是用Zhongwei
可以
直接用vscode登录,打开文件夹,或者用MobaXTerm等你习惯的终端连接软件去ssh连接,输入密码就行(默认用户名已经@在了ssh命令中,你只需要输入你上面创建的密码的值即可)
配置python环境
# 查看可用软件
> module avail
[scw6886@ln01 run]$ module avail
------------------------------------------------------------- /data/apps_4090/modulefiles -------------------------------------------------------------
alphafold/2.3.1 gdb/7.6.1 openblas/0.3.22
amber/22_ambertools23 go/1.18.2 opencv/3.4.16
anaconda/2020.11 gromacs/2022.5_nompi_cuda11.8 opencv/4.5.5
anaconda/2021.05 hdf5/1.12.1 OpenMMLab/MMDetection3.1.0_py38
anaconda/2022.10 hwloc/2.1.0 OpenMMLab/MMDetection_base_py38
arias/1.36.0 intel/parallelstudio/2017.1.5 openmpi/4.1.1
blas/3.10.0 intel/parallelstudio/2019.3.0 openmpi/4.1.5_gcc11.2_ucx1.14.1_cuda11.8
cmake/3.22.0 intel/parallelstudio/2021.1.1 openmpi/4.1.5_ucx1.14.1_nvhpc23.5_cuda12.1
complier/gcc/12.2.0 jupyter/lab p7zip/16.02
cuda/11.7 jupyter/notebook p7zip/21.02
cuda/11.8 lapack/3.10.1 plumed/2.7.2
cuda/12.1 libevent/2.1.12 pmix/3.2.2
cuda/12.2 namd/2.14-verbs-linux-x86_64-gcc-smp-CUDA pnetcdf/1.12.2/openmpi_gcc9.3
cudnn/8.2.1_cuda11.x namd/2.15_2022-07-21_multicore_CUDA qflow/1.0
cudnn/8.5.0_cuda11.x namd/3.0b3_multicore_CUDA rar/611
cudnn/8.6.0_cuda11.x nccl/2.11.4-1_RTX4090-cuda11.8 relion/3.0.8
cudnn/8.7.0_cuda11.x nccl/2.18.1-1_RTX4090-cuda11.8 relion/3.1.3
cudnn/8.9.3.28_cuda12.x netcdf-c/4.8.1/openmpi_gcc9.3 singularity/2.6.0
dos2unix/6.0.3 nvhpc/nvhpc/23.7 singularity/3.10.0
fftw/3.3.9 nvhpc/nvhpc-byo-compiler/22.11 singularity/3.9.9
fftw/3.3.9-ompi-float nvhpc/nvhpc-byo-compiler/23.5 tensorboard/2.3.0
gcc/11.2 nvhpc/nvhpc-byo-compiler/23.7 ucx/1.14.1_gcc11.2_cuda11.8
gcc/5.4 nvhpc/nvhpc-hpcx/23.7 ucx/1.14.1_nvhpc23.5_cuda12.1
gcc/6.3 nvhpc/nvhpc-hpcx-cuda12/23.7 ucx/1.8
gcc/7.3 nvhpc/nvhpc-nompi/22.11 ucx/1.9
gcc/8.3 nvhpc/nvhpc-nompi/23.5 xesces/3.2.0
gcc/9.3 nvhpc/nvhpc-nompi/23.7 zlib/1.2.11
该有的基本都有,还算比较全,
module load anaconda/2021.05
# anaconda/2022.10 这个版本会报错
conda init
source ~/.bashrc
~/.bashrc
脚本
~/.bashrc
或者提交脚本中vim ~/.bashrc
module load anaconda/2021.05
module load jupyter/lab
module load jupyter/notebook
module load cuda/11.8
module load cudnn/8.7.0_cuda11.x
module load gcc/8.3
# 根据自己的module avail中显示的cuda版本,找对应的pytorch版本
# https://pytorch.org/get-started/previous-versions/
conda create -n mmseg python=3.8
conda activate mmseg
# 安装torch
pip3 install torch==2.0.0+cu118 torchvision==0.15.1+cu118 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118
>|█████▏ | 369.2 MB 607 kB/s eta 0:52:05
|████████████████▍ | 1160.7 MB 31.4 MB/s eta 0:00:36
# 下载速度很好!
# 安装mmseg需要的包
pip3 install openmim
pip3 install mmengine
# mmcv需要编译,需要gcc 5.4+的版本 module load gcc/8.3
pip3 install mmcv
# 安装之后确认下版本
pip show mmcv # Version: 2.0.1
pip show mmengine # Version: 0.8.4
# 还可以看见安装位置:
Location: /data/run01/scw6886/.local/lib/python3.7/site-packages
# 运行期间的,所以会话关闭之后就会消失。。
.bashrc
文件中,可以启动时执行命令,关于这个文件的作用,可以自行搜索。
pip3 install torch==2.0.0+cu118 torchvision==0.15.1+cu118 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118
pip3 install openmim
pip3 install mmengine
pip3 install mmcv
不要在此目录下安装软件及存放文件
,默认配额为1GB~/run
用于存放计算所需或者访问频次较高的数据,读写性能较好,请将计算时需要使用的数据存储到该目录下并在此目录进行计算参考:
# fetch,把upstream上最新的所有内容都拉到本地
# 但是注意,需要保证本地没有什么冲突,当前处在任意分支都没问题
git fetch upstream
然后就可以基于远程最新的dev-1.x
来创建自己的开发分支了
git checkout -b SupportInverseFormLoss upstream/dev-1.x
根据:https://github.com/Qualcomm-AI-research/InverseForm
参考:
主要参考的两个已有的loss是:
1. 网络作为损失函数
2. XXX.cuda()
3. XX_loss类的参数与config文件的对应关系
如下例子所示,损失函数的参数就是config文件中部分的参数
class CrossEntropyLoss(nn.Module):
def __init__(self,
use_sigmoid=False,
use_mask=False,
reduction='mean',
class_weight=None,
loss_weight=1.0,
loss_name='loss_ce',
avg_non_ignore=False):
loss_decode=dict( # Config of loss function for the decode_head.
type='CrossEntropyLoss', # Type of loss used for segmentation.
use_sigmoid=False, # Whether use sigmoid activation for segmentation.
loss_weight=1.0)), # Loss weight of decode_head.
4. 函数的一些默认值设置
Cityscapes
数据集,所以基本都是针对这个数据集进行的设置5. upper_bound参数
@manager.LOSSES.add_component
class RelaxBoundaryLoss(nn.Layer):
"""
Implements the ohem cross entropy loss function.
Args:
border (int, optional): The value of border to relax. Default: 1.
calculate_weights (bool, optional): Whether to calculate weights for every classes. Default: False.
upper_bound (float, optional): The upper bound of weights if calculating weights for every classes. Default: 1.0.
ignore_index (int64): Specifies a target value that is ignored
and does not contribute to the input gradient. Default: 255.
"""
def __init__(self,
border=1,
calculate_weights=False,
upper_bound=1.0,
ignore_index=255):
super(RelaxBoundaryLoss, self).__init__()
self.border = border
self.calculate_weights = calculate_weights
self.upper_bound = upper_bound
self.ignore_index = ignore_index
self.EPS = 1e-5
def calculate_weights(self, label):
hist = paddle.sum(label, axis=(1, 2)) * 1.0 / label.sum()
hist = ((hist != 0) * self.upper_bound * (1 - hist)) + 1
6. torch.where()
https://pytorch.org/docs/stable/generated/torch.where.html
torch.where(edge.max(1)[0] > 0.8, target, filler)
>>> x = torch.randn(3, 2)
>>> y = torch.ones(3, 2)
>>> x
tensor([[-0.4620, 0.3139],
[ 0.3898, -0.7197],
[ 0.0478, -0.1657]])
>>> torch.where(x > 0, 1.0, 0.0)
tensor([[0., 1.],
[1., 0.],
[1., 0.]])
>>> torch.where(x > 0, x, y) # 满足条件的就用x的值,不满足的就用y的值
tensor([[ 1.0000, 0.3139],
[ 0.3898, 1.0000],
[ 0.0478, 1.0000]])
7. 预测的分割边界图来源- b p r e d b_{pred} bpred来源
论文中提到:
我们工作的主要不同点在于:推理时候不会引入额外开销,下面这个框架图已经很明显了说明问题了
8. 如何把InverseForm插入现有网络
HRnet+OCR
9. 单元测试
10. 实现多头
11. bce2d和boundary_loss
有些写法上的区别:(重点关注,continuous的问题)
12. ImageBasedCrossEntropyLoss2d
ImageBasedCrossEntropyLoss2d
class ImageBasedCrossEntropyLoss2d
,
Traceback (most recent call last):
File "../tests/test_models/test_losses/test_inverseform_loss.py", line 9, in
from mmseg.models.losses import InverseFormLoss
ImportError: cannot import name 'InverseFormLoss' from 'mmseg.models.losses' (mmsegmentation/mmseg/models/losses/__init__.py)
from mmseg.models.losses import InverseFormLoss
这句其实是引用的当前python环境中已经安装的mmsegmation
其实是旧的,是之前安装的版本,不是你自己改动过的版本。pip uninstall mmsegmentation
。mmsegmentation
的文件夹的路径添加到python的系统路径中,具体如下:import sys
sys.path.append('yourDir/mmsegmentation')
# 一定要确定是把这个目录添加到系统目录之后,再去import刚刚ImportError的内容
# 或者你可以直接把这个路径写到python的系统路径中,上面这种方式只是运行时生效
from mmseg.models.losses import InverseFormLoss
我用的:
import sys
sys.path.append('/Users/huangshan/Documents/DailyStudy/mmsegmentation')
print(sys.path)
if __name__ == "__main__":
test_inverseform_loss()
根据pytest.raises Failed: DID NOT RAISE with try/except,只需要在模型加载的时候torch.load(path, map_location='cpu')
,用map_location
指明是cpu就行
# Test loss forward with pred.shape!=target.shape
pred_wrong = torch.zeros(2, 1, 4, 4)
target_wrong = torch.zeros(3, 1, 4, 4)
with pytest.raises(AssertionError):
loss = loss_class(pred_wrong, target_wrong)
print(loss)
这个pytest.raises(AssertionError)
本身就是判断如果错了,会不会报错出来,所以with
里面是可以抛出错误的代码
https://docs.readthedocs.io/en/stable/config-file/v2.html#build-os
提交PR在测试的时候,第一次遇到构建文档报错。。。
这次写注释的时候,唯一的一个异常,就是某行超过72个字符的时候,把and
换成了&
,然后就出现了上面这个错误。。
改了之后,就没有了。
但是没有找到相关的资料,不确定真的是因为这个&
符号,还是说可能刚刚测试环境坏了