Различные сценарии приложений для обнаружения целей имеют разные трудности обнаружения, например, небольшие цели, несколько масштабов и сложный фон. Затененные объекты по-прежнему являются проблемой, с которой сталкиваются самые совершенные детекторы объектов. В этой статье делается попытка решить трудности обнаружения, вызванные взаимным перекрытием тестируемых целей. Для перекрытия лица используется метод, называемый. SEAM
Модуль внимания и введена потеря отталкивания для решения этой проблемы.,введено разделениеи Модуль повышения внимания для улучшенияNeck
Отзывчивость закрытых граней после выходной части слоя。
То есть перекрытие между разными лицами и перекрытие лиц другими объектами. Первое делает точность обнаружения более точной. NMS
Порог очень чувствителен, что приводит к пропущенным обнаружениям. Авторы используют потерю отталкивания для обнаружения лиц, что наказывает блоки прогнозирования за перемещение к другим реальным целям и требует, чтобы каждый блок прогнозирования держался подальше от других блоков прогнозирования с другими указанными целями, чтобы результаты обнаружения были правильными. NMS
Не слишком чувствителен. Последнее приводит к исчезновению особенностей и неточному позиционированию, поэтому проектируется модуль внимания. SEAM
улучшить изучение черт лица.
Основным методом решения многомасштабной проблемы является построение пирамиды, объединяющей многомасштабные черты лица. Например, в YOLOv5
середина,FPN
слитый P3
、P4
и P5
характеристики слоя. Но для небольших целей,Информация легко теряется после нескольких слоев свертки.,Сохраняется мало информации о пикселях,даже на мелководьеP3
То же самое касается слоев。поэтому,Улучшение разрешения карт объектов, несомненно, полезно для обнаружения небольших целей.
RepGT Loss
Функция состоит в том, чтобы сделать текущую ограничивающую рамку как можно дальше от окружающей среды.ground truth box
。 где-то здесьground truth box
означает, кромеbounding box
Вне самого объекта, который будет возвращен,с человеческим лицомIoU
Самая большая лицевая этикетка。
modules.py
середина:Основной код:
class SEAM(nn.Module):
def __init__(self, c1, c2, n, reduction=16):
super(SEAM, self).__init__()
if c1 != c2:
c2 = c1
self.DCovN = nn.Sequential(
# nn.Conv2d(c1, c2, kernel_size=3, stride=1, padding=1, groups=c1),
# nn.GELU(),
# nn.BatchNorm2d(c2),
*[nn.Sequential(
Residual(nn.Sequential(
nn.Conv2d(in_channels=c2, out_channels=c2, kernel_size=3, stride=1, padding=1, groups=c2),
nn.GELU(),
nn.BatchNorm2d(c2)
)),
nn.Conv2d(in_channels=c2, out_channels=c2, kernel_size=1, stride=1, padding=0, groups=1),
nn.GELU(),
nn.BatchNorm2d(c2)
) for i in range(n)]
)
self.avg_pool = torch.nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(c2, c2 // reduction, bias=False),
nn.ReLU(inplace=True),
nn.Linear(c2 // reduction, c2, bias=False),
nn.Sigmoid()
)
self._initialize_weights()
# self.initialize_layer(self.avg_pool)
self.initialize_layer(self.fc)
def forward(self, x):
b, c, _, _ = x.size()
y = self.DCovN(x)
y = self.avg_pool(y).view(b, c)
y = self.fc(y).view(b, c, 1, 1)
y = torch.exp(y)
return x * y.expand_as(x)
def _initialize_weights(self):
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.xavier_uniform_(m.weight, gain=1)
elif isinstance(m, nn.BatchNorm2d):
nn.init.constant_(m.weight, 1)
nn.init.constant_(m.bias, 0)
def initialize_layer(self, layer):
if isinstance(layer, (nn.Conv2d, nn.Linear)):
torch.nn.init.normal_(layer.weight, mean=0., std=0.001)
if layer.bias is not None:
torch.nn.init.constant_(layer.bias, 0)
def DcovN(c1, c2, depth, kernel_size=3, patch_size=3):
dcovn = nn.Sequential(
nn.Conv2d(c1, c2, kernel_size=patch_size, stride=patch_size),
nn.SiLU(),
nn.BatchNorm2d(c2),
*[nn.Sequential(
Residual(nn.Sequential(
nn.Conv2d(in_channels=c2, out_channels=c2, kernel_size=kernel_size, stride=1, padding=1, groups=c2),
nn.SiLU(),
nn.BatchNorm2d(c2)
)),
nn.Conv2d(in_channels=c2, out_channels=c2, kernel_size=1, stride=1, padding=0, groups=1),
nn.SiLU(),
nn.BatchNorm2d(c2)
) for i in range(depth)]
)
return dcovn
class MultiSEAM(nn.Module):
def __init__(self, c1, c2, depth, kernel_size=3, patch_size=[3, 5, 7], reduction=16):
super(MultiSEAM, self).__init__()
if c1 != c2:
c2 = c1
self.DCovN0 = DcovN(c1, c2, depth, kernel_size=kernel_size, patch_size=patch_size[0])
self.DCovN1 = DcovN(c1, c2, depth, kernel_size=kernel_size, patch_size=patch_size[1])
self.DCovN2 = DcovN(c1, c2, depth, kernel_size=kernel_size, patch_size=patch_size[2])
self.avg_pool = torch.nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(c2, c2 // reduction, bias=False),
nn.ReLU(inplace=True),
nn.Linear(c2 // reduction, c2, bias=False),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.size()
y0 = self.DCovN0(x)
y1 = self.DCovN1(x)
y2 = self.DCovN2(x)
y0 = self.avg_pool(y0).view(b, c)
y1 = self.avg_pool(y1).view(b, c)
y2 = self.avg_pool(y2).view(b, c)
y4 = self.avg_pool(x).view(b, c)
y = (y0 + y1 + y2 + y4) / 4
y = self.fc(y).view(b, c, 1, 1)
y = torch.exp(y)
return x * y.expand_as(x)
от CSDN AI маленький монстр http://cv2023.blog.csdn.net