|
|
|
|
|
""" |
|
@Author : Qingping Zheng |
|
@Contact : [email protected] |
|
@File : util.py |
|
@Time : 10/01/21 00:00 PM |
|
@Desc : |
|
@License : Licensed under the Apache License, Version 2.0 (the "License"); |
|
@Copyright : Copyright 2022 The Authors. All Rights Reserved. |
|
""" |
|
from __future__ import absolute_import |
|
from __future__ import division |
|
from __future__ import print_function |
|
|
|
import torch.nn as nn |
|
|
|
from inplace_abn import InPlaceABNSync |
|
|
|
|
|
class Bottleneck(nn.Module): |
|
expansion = 4 |
|
def __init__(self, inplanes, planes, stride=1, abn=InPlaceABNSync, dilation=1, downsample=None, fist_dilation=1, multi_grid=1): |
|
super(Bottleneck, self).__init__() |
|
self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) |
|
self.bn1 = abn(planes) |
|
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, |
|
padding=dilation*multi_grid, dilation=dilation*multi_grid, bias=False) |
|
self.bn2 = abn(planes) |
|
self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) |
|
self.bn3 = abn(planes * 4) |
|
self.relu = nn.ReLU(inplace=False) |
|
self.relu_inplace = nn.ReLU(inplace=True) |
|
self.downsample = downsample |
|
self.dilation = dilation |
|
self.stride = stride |
|
|
|
def forward(self, x): |
|
residual = x |
|
|
|
out = self.conv1(x) |
|
out = self.bn1(out) |
|
out = self.relu(out) |
|
|
|
out = self.conv2(out) |
|
out = self.bn2(out) |
|
out = self.relu(out) |
|
|
|
out = self.conv3(out) |
|
out = self.bn3(out) |
|
|
|
if self.downsample is not None: |
|
residual = self.downsample(x) |
|
|
|
out = out + residual |
|
out = self.relu_inplace(out) |
|
|
|
return out |
|
|