From 085cc7b363b053ef32d51fe6377142177c396141 Mon Sep 17 00:00:00 2001 From: chumingqian <46816091+chumingqian@users.noreply.github.com> Date: Sun, 1 Nov 2020 15:06:39 +0800 Subject: [PATCH 1/2] Update utils.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1:b_temp = (torch.ones(int(2 ** (5 - j) / scale - 1)) * b[i]).long().cuda() 增加了. cuda() 参数, 避免了 find .cpu , .gpu 报错; 2: 不使用了 indice_merge() 函数, 因为原始了 indice[0] 中 有四个变量 , indices[0]: [ [0,0,3] , [1,2,2], [2,2,6] [16,16,24] ] 经过indices_merge() 函数, (2**( 5- j) 之后, 出现[16,16, 832] 会出现 index 832 out of 608 .的错误; 3: 暂时 没有读懂, indices_merge() 函数 为什么 将temp[2] , temp[3] 乘上 (2 ** (5-j) ) 的功能, 这样做的目的是什么。 --- utils/utils.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/utils/utils.py b/utils/utils.py index f582325..18e0163 100644 --- a/utils/utils.py +++ b/utils/utils.py @@ -616,7 +616,8 @@ def fine_grained_imitation_feature_mask(feature_s, feature_t, indices, img_size) for i in range(gj.size()[0]): if 2 ** (5 - j) == scale: break - b_temp = (torch.ones(int(2 ** (5 - j) / scale - 1)) * b[i]).long().cuda() + # first modify + b_temp = (torch.ones(int(2 ** (5 - j) / scale - 1)).cuda() * b[i]).long().cuda() gj_temp = torch.arange(int(gj[i].item()) + 1, int(gj[i].item() + 2 ** (5 - j) / scale)).cuda() gi_temp = torch.arange(int(gi[i].item()) + 1, int(gi[i].item() + 2 ** (5 - j) / scale)).cuda() b = torch.cat((b, b_temp)) @@ -662,13 +663,15 @@ def compute_lost_KD5(model, targets, output_s, output_t, feature_s, feature_t, b if len(feature_t) != len(feature_s): print("feature mismatch!") exit() - merge = indices_merge(indices) + # second, + # merge = indices_merge(indices) for i in range(len(feature_t)): # feature_t[i] = feature_t[i].pow(2).sum(1) feature_t[i] = feature_t[i].abs().sum(1) # feature_s[i] = feature_s[i].pow(2).sum(1) feature_s[i] = feature_s[i].abs().sum(1) - mask = fine_grained_imitation_feature_mask(feature_s[i], feature_t[i], merge, img_size) + # dont use the indices_merge(indices) + mask = fine_grained_imitation_feature_mask(feature_s[i], feature_t[i], indices, img_size) mask = mask.to(targets.device) feature_t[i] = (feature_t[i] * mask).view(batch_size, -1) feature_s[i] = (feature_s[i] * mask).view(batch_size, -1) From fd8214abb052401116d2e50f253c2711df087767 Mon Sep 17 00:00:00 2001 From: chumingqian <46816091+chumingqian@users.noreply.github.com> Date: Wed, 4 Nov 2020 11:56:14 +0800 Subject: [PATCH 2/2] Update utils.py --- utils/utils.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/utils/utils.py b/utils/utils.py index 18e0163..038a737 100644 --- a/utils/utils.py +++ b/utils/utils.py @@ -601,6 +601,21 @@ def indices_merge(indices): return indices_merge +def v4_indices_merge(indices): + indices_merge = [] + + for i in range(len(indices)): + temp = list(indices[i]) + temp[2] = temp[2] * (2 ** (3 + i)) + temp[3] = temp[3] * (2 ** (3 + i)) + indices_merge.append(temp) + return indices_merge + + + + + + def fine_grained_imitation_feature_mask(feature_s, feature_t, indices, img_size): if feature_t.size() != feature_s.size(): print("feature mismatch!") @@ -631,6 +646,41 @@ def fine_grained_imitation_feature_mask(feature_s, feature_t, indices, img_size) return mask + +def v4_fine_grained_imitation_feature_mask(feature_s, feature_t, indices, img_size): + if feature_t.size() != feature_s.size(): + print("feature mismatch!") + exit() + B, Gj, Gi = torch.Tensor(0).long().cuda(), torch.Tensor(0).long().cuda(), torch.Tensor(0).long().cuda() + feature_size = feature_s.size()[1] + scale = img_size / feature_size + for j in range(len(indices)): + if 2 ** (5 - j) < scale: + break + b, _, gj, gi = indices[j] # image, gridy, gridx + gj, gi = (gj / scale).long(), (gi / scale).long() + for i in range(gj.size()[0]): + if 2 ** (3 + j) == scale: + break + # first modify + b_temp = (torch.ones(int(2 ** (3 + j) / scale - 1)).cuda() * b[i]).long().cuda() + gj_temp = torch.arange(int(gj[i].item()) + 1, int(gj[i].item() + 2 ** (3 + j) / scale)).cuda() + gi_temp = torch.arange(int(gi[i].item()) + 1, int(gi[i].item() + 2 ** (3 + j) / scale)).cuda() + b = torch.cat((b, b_temp)) + gj = torch.cat((gj, gj_temp)) + gi = torch.cat((gi, gi_temp)) + B = torch.cat((B, b)) + Gj = torch.cat((Gj, gj)) + Gi = torch.cat((Gi, gi)) + mask = torch.zeros(feature_s.size()) + mask[B, Gj, Gi] = 1 + return mask + + + + + + def compute_lost_KD5(model, targets, output_s, output_t, feature_s, feature_t, batch_size, img_size): T = 3.0 Lambda_cls, Lambda_box, Lambda_feature = 0.1, 0.001, 0.1 @@ -663,15 +713,20 @@ def compute_lost_KD5(model, targets, output_s, output_t, feature_s, feature_t, b if len(feature_t) != len(feature_s): print("feature mismatch!") exit() - # second, - # merge = indices_merge(indices) + # for yolov3 use def indices_merger() + merge = indices_merge(indices) + + # for yolov4 use v4_indices_merge() + #merge = v4_indices_merge(indices) for i in range(len(feature_t)): # feature_t[i] = feature_t[i].pow(2).sum(1) feature_t[i] = feature_t[i].abs().sum(1) # feature_s[i] = feature_s[i].pow(2).sum(1) feature_s[i] = feature_s[i].abs().sum(1) - # dont use the indices_merge(indices) + # for yolov3 mask = fine_grained_imitation_feature_mask(feature_s[i], feature_t[i], indices, img_size) + # for yolov4 + # mask = v4_fine_grained_imitation_feature_mask(feature_s[i], feature_t[i], indices, img_size) mask = mask.to(targets.device) feature_t[i] = (feature_t[i] * mask).view(batch_size, -1) feature_s[i] = (feature_s[i] * mask).view(batch_size, -1)