Использование mmdetection2.0 для реализации SOLOV2 — совершенно новой структуры сегментации экземпляров.
Эта статья была первоначально написана г-ном Лином, пожалуйста, укажите источник для перепечатки.Приглашаем вас присоединиться к группе обмена QQ, состоящей из инженеров-алгоритмов первой линии, таких как Tencent и Ali: 1037662480
Недавно автор выполнял некоторые операции по сегментации экземпляров для tensorrt и обнаружил, что для многих двухэтапных алгоритмов сегментации экземпляров очень проблематично переключиться на другую платформу вывода, главным образом потому, что есть некоторые операции RPN, даже для таких моделей, как CenterMask. , также необходимо сначала получить коробку, а затем пройти ROIAlign и ROIPool, чтобы получить требуемую маску.Этот процесс не только сложен для расчета, но и трудно экспортировать в нужный нам формат модели.Например, ONNX не поддерживает в нем множество операций. Когда я увидел этот график, я обнаружил, что SOLOV2 работает примерно так же, как maskrcnn, с вдвое меньшей скоростью вывода и превосходит BlendMask по скорости и точности. Сегодня мы будем использовать версию mmdetection 2.0 для реализации SOLOV2.
В настоящее время проблемы и недостатки многих алгоритмов сегментации экземпляров в основном заключаются в следующем:
- Скорость слишком медленная, например, Maskrcnn, хотя он и известен, но все же очень сложно развернуть его в реальном времени;
- Точности не хватает.Например, Yolact, даже Yolact++, его точность можно только назвать неудовлетворительной.Даже MaskRCNN не может сравниться по силе сегментации.Независимо от того, насколько быстра скорость, он будет ограничивать свои сценарии использования;
- Алгоритмы типа BlendMask и CenterMask похожи, они построены на основе FCOS, и разницы по сути нет, он по-прежнему похож на общий процесс MaskRCNN, но изменился детектор, который по-прежнему очень проблематичен для развертывания.
Конечно, проблема, которую предстоит решить в этой статье, связана не с проблемой развертывания, а с тем, чтобы сообщить вам, что у нас есть более быстрая и точная модель, и развертывание может быть относительно лучше. Итак, первый шаг — использовать Python для создания волны?
SOLOV2
Для серии алгоритмов SOLO конкретные входы и выходы не будут повторяться. Сначала поставим индекс сравнения:
Для V2 самым большим изменением может быть эта голова динамической маски:
class SOLOV2Head:
....
def forward(self, feats, eval=False):
new_feats = self.split_feats(feats)
featmap_sizes = [featmap.size()[-2:] for featmap in new_feats]
upsampled_size = (feats[0].shape[-2], feats[0].shape[-3])
kernel_pred, cate_pred = multi_apply(self.forward_single, new_feats,
list(range(len(self.seg_num_grids))),
eval=eval)
# add coord for p5
x_range = torch.linspace(-1, 1, feats[-2].shape[-1], device=feats[-2].device)
y_range = torch.linspace(-1, 1, feats[-2].shape[-2], device=feats[-2].device)
y, x = torch.meshgrid(y_range, x_range)
y = y.expand([feats[-2].shape[0], 1, -1, -1])
x = x.expand([feats[-2].shape[0], 1, -1, -1])
coord_feat = torch.cat([x, y], 1)
feature_add_all_level = self.feature_convs[0](feats[0])
for i in range(1,3):
feature_add_all_level = feature_add_all_level + self.feature_convs[i](feats[i])
feature_add_all_level = feature_add_all_level + self.feature_convs[3](torch.cat([feats[3],coord_feat],1))
feature_pred = self.solo_mask(feature_add_all_level)
N, c, h, w = feature_pred.shape
feature_pred = feature_pred.view(-1, h, w).unsqueeze(0)
ins_pred = []
for i in range(5):
kernel = kernel_pred[i].permute(0,2,3,1).contiguous().view(-1,c).unsqueeze(-1).unsqueeze(-1)
ins_i = F.conv2d(feature_pred, kernel, groups=N).view(N,self.seg_num_grids[i]**2, h,w)
if not eval:
ins_i = F.interpolate(ins_i, size=(featmap_sizes[i][0]*2,featmap_sizes[i][1]*2), mode='bilinear')
if eval:
ins_i=ins_i.sigmoid()
ins_pred.append(ins_i)
return ins_pred, cate_pred
Для головы маски это, вероятно, может быть достигнуто (код предоставлен @Epiphqny).
Solov2 в документе может достичь наивысшего AP 42,6, и мы можем фактически обучить его до уровня, близкого к 40 AP, что значительно превосходит другие методы сегментации экземпляров той же магистрали.
Results
Мы перенесли код на последнюю версию 2.0 mmdetection для некоторых SOLO с открытым исходным кодом. Последние результаты тестов таковы:
В целом эффект довольно хороший. Мы развернули код на платформе Shenli. Если вас интересует сегментация экземпляров, вы можете скачать наш код и запустить его. В то же время я надеюсь, что вы сможете присоединиться к нашему сообществу, чтобы обсудить и обменяться самыми передовыми технологиями компьютерного зрения. вопросы.
Мана Любовь. Коды Таланта/Любви_ достойный...
Если вы хотите изучить искусственный интеллект и больше заинтересованы в передовых технологиях искусственного интеллекта, вы можете присоединиться к нашей планете знаний, чтобы получать самую первую информацию, передовые академические тенденции, отраслевые новости и многое другое! Ваша поддержка побудит нас создавать чаще, и мы поможем вам начать более глубокое обучение!