Обнаружение объектов Fastai SSD в наборе данных Pascal 2007. Повышение точности обнаружения (точность класса) - PullRequest
0 голосов
/ 02 мая 2020

Я пытался повысить точность обнаружения объектов SSD с помощью Fastai v1 в наборе Pascal VO C 2007. Я обнаружил, что даже после примерно 20 эпох точность классификации не достигает тех уровней, которых удалось достичь многим ноутбукам. Мне удалось получить лучшую точность классификации при приближении к проблеме с подходом YOLO (не v3), где последний линейный слой содержит класс и активацию регрессии.

Некоторые проблемы, с которыми я столкнулся, пытаясь это сделать, были

  1. Обычный подход к обучению последнего слоя, за которым следовали последние 2 слоя, приводил к сильному переоснащению, и все было предсказано как категория person однако точность ограничивающей рамки была довольно хорошей.
  2. Когда я попытался начать, тренируя все слои одновременно, я достиг немного лучшей точности, когда некоторые классы были правильно классифицированы более последовательно.

Некоторые из вещей, которые я пробовал в своих записных книжках, (https://github.com/sidravic/SSD_ObjectDetection_2/blob/master/train/MultiLabelObjectDetection_LargerAnchors-Updated-Hyperparams.ipynb)

  1. Использование более высоких выпадений до 0.58
  2. Softmax вместо сигмоида для вычисления порога.
  3. Снижение потерь с использованием mean вместо sum (я понимаю, что это не имеет ничего общего с фактическим прогнозом)

Некоторые из вопросов, которые я здесь задаю, в чем разница между использованием self.oconv1.bias.data.zero_().add_(bias) против bias=True в Conv2D

Я понимаю, что смещение является аддитивным компонентом, но почему его обычно не используют в слое Conv2d, установив bias=True. Когда кто-то решит проигнорировать это?

lass OutConv(nn.Module):
    def __init__(self, k, nin, num_classes, bias):
        super().__init__()
        self.k = k
        self.oconv1 = nn.Conv2d(in_channels=nin, out_channels=((num_classes) * k), kernel_size=3, padding=1)
        self.oconv2 = nn.Conv2d(nin, 4*k, 3, padding=1)
        self.oconv1.bias.data.zero_().add_(bias)

    def forward(self, x):        
        return [flatten_conv(self.oconv1(x), self.k), 
                flatten_conv(self.oconv2(x), self.k)]

Я включил все свои попытки как отдельные записные книжки, которые доступны здесь https://github.com/sidravic/SSD_ObjectDetection_2/tree/master/train

Я ищу для предложений / отзывов о том, как повысить точность классификации. Спасибо

...