Skip to content

Commit 46cced4

Browse files
committed
apm for cqu_bpdd
1 parent 9e9738d commit 46cced4

3 files changed

Lines changed: 70 additions & 37 deletions

File tree

bpdd_apm_run.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
'''
44
Author : LiAo
55
Date : 2022-07-12 21:55:46
6-
LastEditTime : 2022-07-16 23:38:18
6+
LastEditTime : 2022-07-17 15:39:52
77
LastAuthor : LiAo
88
Description : Please add file description
99
'''
@@ -18,7 +18,7 @@
1818
utils.setup_seed(123)
1919
parser = argparse.ArgumentParser()
2020
# 网络模型参数
21-
parser.add_argument('--backbone', type=str, default='tf_efficientnetv2_b3')
21+
parser.add_argument('--backbone', type=str, default='tf_efficientnet_b3')
2222
parser.add_argument('--backbone_pretrain', type=bool, default=True)
2323
parser.add_argument('--pool', type=bool, default=True)
2424
parser.add_argument('--pool_size', type=tuple, default=(300, 300))
@@ -29,13 +29,13 @@
2929
parser.add_argument('--num_classes', type=int, default=7)
3030

3131
# 训练epoch
32-
parser.add_argument('--epoch', type=int, default=300)
32+
parser.add_argument('--epoch', type=int, default=200)
3333
parser.add_argument('--epoch_offset', type=int, default=0)
3434
# 超参数, 依据显存设置
3535
parser.add_argument('--batch_size', type=int,
3636
default=32, help='decide by GPU RAM')
3737
# 学习率参数
38-
parser.add_argument('--lr', type=float, default=0.01)
38+
parser.add_argument('--lr', type=float, default=0.005)
3939
# used for RangeLars
4040
parser.add_argument('--lrf', type=float, default=0.005)
4141
parser.add_argument('--ann_start', type=float, default=0.5)

bpdd_src/apm.py

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
'''
44
Author : LiAo
55
Date : 2022-07-05 19:45:12
6-
LastEditTime : 2022-07-16 23:41:05
6+
LastEditTime : 2022-07-17 15:55:17
77
LastAuthor : LiAo
88
Description : Please add file description
99
'''
@@ -189,21 +189,22 @@ class APM(nn.Module):
189189

190190
def __init__(self, in_chs: int, out_chs: int):
191191
super(APM, self).__init__()
192-
self.conv_blocks_1 = ConvBlock(in_chs, 8, kernel_size=13, stride=3, padding=1, dilation=1,
192+
self.conv_blocks_1 = ConvBlock(in_chs, 4, kernel_size=13, stride=2, padding=1, dilation=1,
193193
norm_layer=nn.BatchNorm2d, act_layer=nn.SiLU, pool_layer=nn.MaxPool2d(3, stride=1))
194-
self.conv_blocks_2 = ConvBlock(8, 32, kernel_size=3, stride=1, padding=1, dilation=1,
195-
norm_layer=nn.BatchNorm2d, act_layer=nn.SiLU, pool_layer=nn.AvgPool2d(3, stride=1))
196-
self.conv_blocks_3 = ConvBlock(32, 64, kernel_size=3, stride=1, padding=1, dilation=1,
194+
self.conv_blocks_2 = ConvBlock(4, 16, kernel_size=5, stride=2, padding=1, dilation=1,
197195
norm_layer=nn.BatchNorm2d, act_layer=nn.SiLU, pool_layer=nn.MaxPool2d(3, stride=1))
198-
self.res_blocks_1 = Residual(64, 64, kernel_size=[3, 3], stride=[1, 1], padding=[1, 1],
196+
self.conv_blocks_3 = ConvBlock(16, 32, kernel_size=3, stride=1, padding=1, dilation=1,
197+
norm_layer=nn.BatchNorm2d, act_layer=nn.SiLU, pool_layer=nn.MaxPool2d(3, stride=1))
198+
self.res_blocks_1 = Residual(32, 32, kernel_size=[3, 3], stride=[1, 1], padding=[1, 1],
199199
downsample=False)
200-
self.res_blocks_2 = Residual(64, 64, kernel_size=[3, 3], stride=[1, 1], padding=[1, 1],
200+
self.res_blocks_2 = Residual(32, 32, kernel_size=[3, 3], stride=[1, 1], padding=[1, 1],
201201
downsample=False)
202-
self.cbam_blocks = CBAM(64)
203-
self.conv_blocks_4 = ConvBlock(64, 16, kernel_size=3, stride=1, padding=1, dilation=1,
204-
norm_layer=nn.BatchNorm2d, act_layer=nn.SiLU, pool_layer=None)
205-
self.conv_blocks_5 = ConvBlock(16, out_chs, kernel_size=3, stride=1, padding=1, dilation=1,
206-
norm_layer=nn.BatchNorm2d, act_layer=nn.SiLU, pool_layer=None)
202+
# self.res_blocks_2 = nn.Identity()
203+
self.cbam_blocks = CBAM(32)
204+
self.conv_blocks_4 = ConvBlock(32, 8, kernel_size=3, stride=1, padding=1, dilation=1,
205+
norm_layer=nn.BatchNorm2d, act_layer=nn.SiLU, pool_layer=nn.MaxPool2d(3, stride=1))
206+
self.conv_blocks_5 = ConvBlock(8, out_chs, kernel_size=3, stride=1, padding=1, dilation=1,
207+
norm_layer=nn.BatchNorm2d, act_layer=nn.SiLU, pool_layer=nn.MaxPool2d(3, stride=1))
207208

208209
def forward(self, x):
209210
x = self.conv_blocks_1(x)
@@ -241,10 +242,10 @@ def __init__(self, backbone='tf_efficientnetv2_b0', pretrain=True, num_classes=7
241242
self.pool_upsample = nn.Upsample(size=pool_size, mode=pool_type)
242243

243244
def forward(self, x):
244-
x = self.apm(x)
245+
apm_x = self.apm(x)
245246
x_upsample = self.pool_upsample(x)
246-
x_max = self.max_pool(x)
247-
x_avg = self.avg_pool(x)
247+
x_max = self.max_pool(apm_x)
248+
x_avg = self.avg_pool(apm_x)
248249
x = torch.concat([x_upsample, x_avg, x_max], dim=1)
249250
x = self.backbone(x)
250251
x = self.dropout(self.classifier(x))
@@ -264,6 +265,27 @@ def test_apm():
264265

265266

266267
def test_model_modify():
267-
net = MultiClassification(backbone='tf_efficientnetv2_b3',
268+
net = MultiClassification(backbone='tf_efficientnet_b3',
268269
pretrain=True, num_classes=3)
269270
print(net)
271+
272+
273+
def test_model_repvgg():
274+
input = torch.randn(1, 3, 224, 224)
275+
from thop import profile, clever_format
276+
net = timm.create_model(model_name='repvgg_b0',
277+
pretrained=True, num_classes=3)
278+
print(net)
279+
macs, params = profile(net, inputs=(input, ))
280+
macs, params = clever_format([macs, params], "%.4f")
281+
print(macs)
282+
print(params)
283+
# repvgg_b0
284+
# 3.3960G
285+
# 14.5056M
286+
# tf_efficientnetv2_b3
287+
# 1.5538G
288+
# 12.7488M
289+
# tf_efficientnet_b3
290+
# 990.3157M
291+
# 10.6707M

bpdd_src/apm_train.py

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
'''
44
Author : LiAo
55
Date : 2022-07-05 20:08:25
6-
LastEditTime : 2022-07-16 23:37:58
6+
LastEditTime : 2022-07-17 15:23:13
77
LastAuthor : LiAo
88
Description : Please add file description
99
'''
@@ -29,14 +29,25 @@
2929
def main(args):
3030
device = torch.device(args.device if torch.cuda.is_available() else 'cpu')
3131
# 定义数据预处理
32-
data_transform = transforms.Compose([
33-
utils.SelfCLAHE(clip_limit=2.0, tile_grid_size=(32, 32)),
34-
transforms.RandomHorizontalFlip(),
35-
transforms.RandomVerticalFlip(),
36-
transforms.RandomPerspective(),
37-
transforms.ToTensor()
38-
# transforms.Normalize([0.414289], [0.215069])
39-
])
32+
# data_transform = transforms.Compose([
33+
# # utils.SelfCLAHE(clip_limit=2.0, tile_grid_size=(32, 32)),
34+
# transforms.RandomHorizontalFlip(),
35+
# transforms.RandomVerticalFlip(),
36+
# transforms.RandomPerspective(),
37+
# transforms.ToTensor(),
38+
# transforms.Normalize([0.414289], [0.215069])
39+
# ])
40+
data_transform = {
41+
'train': transforms.Compose([
42+
transforms.RandomHorizontalFlip(),
43+
transforms.RandomVerticalFlip(),
44+
transforms.ToTensor(),
45+
transforms.Normalize([0.414289], [0.215069])
46+
]),
47+
'test': transforms.Compose([
48+
transforms.ToTensor(),
49+
transforms.Normalize([0.414289], [0.215069])
50+
])}
4051
# log是tensorboard的记录路径
4152
utils.path_exist(args.log_path)
4253
writer = SummaryWriter(log_dir=args.log_path)
@@ -53,12 +64,12 @@ def main(args):
5364
test_result_pd = pd.read_csv(test_result_path) if os.path.exists(
5465
test_result_path) else pd.DataFrame()
5566
# 训练集和测试集的路径
56-
trian_path = os.path.join(args.dataset, 'train')
57-
test_path = os.path.join(args.dataset, 'test')
67+
trian_path = os.path.join(args.dataset, 'test')
68+
test_path = os.path.join(args.dataset, 'train')
5869
trainset = torchvision.datasets.ImageFolder(
59-
root=trian_path, transform=data_transform, loader=utils.gray_loader)
70+
root=trian_path, transform=data_transform['train'], loader=utils.gray_loader)
6071
testset = torchvision.datasets.ImageFolder(
61-
root=test_path, transform=data_transform, loader=utils.gray_loader)
72+
root=test_path, transform=data_transform['test'], loader=utils.gray_loader)
6273
# 类别的标签, test时保存结果需要对应各个类别
6374
classes = trainset.classes
6475
train_loader = DataLoader(dataset=trainset, batch_size=batch_size, shuffle=True,
@@ -103,7 +114,7 @@ def new_module():
103114
# (1 - args.lrf) + args.lrf # cosine
104115
# scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf)
105116
scheduler = lr_scheduler.CosineAnnealingLR(
106-
optimizer, T_max=args.epoch)
117+
optimizer, T_max=int(1.5 * args.epoch))
107118
# scheduler = lr_scheduler.StepLR(
108119
# optimizer=optimizer, step_size=20, gamma=0.5)
109120
# def lf(x):
@@ -115,8 +126,8 @@ def new_module():
115126
# 设置loss function
116127
# loss_function = nn.CrossEntropyLoss() if loss_weights is None else nn.CrossEntropyLoss(
117128
# weight=torch.tensor(loss_weights))
118-
# loss_function = utils.FocalLoss(gamma=8, reduction='sum')
119-
loss_function = torch.nn.CrossEntropyLoss()
129+
loss_function = utils.FocalLoss(gamma=8, reduction='mean')
130+
# loss_function = torch.nn.CrossEntropyLoss()
120131
for epoch in range(epoch_offset, epoch_offset + args.epoch):
121132
# train
122133
train_loss, train_acc = train_utils.train_one_epoch(
@@ -135,7 +146,7 @@ def new_module():
135146
loss_function=loss_function)
136147
# 学习率的调整
137148
# scheduler.step(test_loss)
138-
if (epoch * 1.0 - epoch_offset) / args.epoch > 0.5:
149+
if (epoch * 1.0 - epoch_offset) / args.epoch > 0.25:
139150
scheduler.step()
140151

141152
# 保存测试集的测试结果

0 commit comments

Comments
 (0)