Аннотация: FocalLoss — это функция потерь, предложенная командой Kaiming в их статье Focal Loss for Dense Object Detection, которая улучшает эффект обнаружения объектов изображения.
Эта статья опубликована в сообществе HUAWEI CLOUD.«Технические галантереи | Лучшее понимание FocalLoss на основе MindSpore», оригинальный автор: chengxiaoli.
Сегодня давайте обновим Focal Loss of Kaiming, Это функция потерь, предложенная командой Kaiming в их статье Focal Loss for Dense Object Detection, Она используется для улучшения эффекта обнаружения объектов изображения. ICCV2017RBG и новая работа Кайминга (АР Вест V.org/PDF/1708.02…).
- сцены, которые будут использоваться
В последнее время я работаю над направлением, связанным с мимикой, количество наборов данных в этой области невелико, и часто возникает дисбаланс между положительными и отрицательными образцами. Вообще говоря, есть два способа решить проблему несбалансированного количества положительных и отрицательных образцов:
1. Стратегия разработки выборки, как правило, повторная выборка небольшого количества сэмплов
2. Расчетная потеря, обычно присваивая веса образцам разных категорий
Я использовал обе стратегии, и эта статья посвящена потере фокуса во второй стратегии.
Анализ диссертации
Мы знаем, что обнаружение объектов обычно делится на две категории в зависимости от процесса. Один из них представляет собой двухэтапные детекторы (такие как очень классический Faster R-CNN, RFCN, для которого требуются алгоритмы обнаружения предложений регионов), а второй — одноэтапные детекторы (такие как SSD, серии YOLO, которые не требуют предложений регионов, алгоритмы обнаружения прямой регрессии). ) ).
Для первого класса алгоритмов может быть достигнута высокая точность, но низкая скорость. Хотя скорость может быть достигнута за счет уменьшения количества предложений или уменьшения разрешения входного изображения, качественного улучшения скорости не происходит.
Для второго типа алгоритма скорость очень высока, но точность не так хороша, как для первого типа.
Таким образом, цель такова: отправной точкой потери фокуса является надежда на то, что одноступенчатый детектор сможетДостижение точности двухкаскадного детектора,в то же времяНе влияет на исходную скорость.
Итак, почему? и результат?
Что является причиной этого? Причина: Дисбаланс классов (положительные и отрицательные образцы несбалансированы), что вызвано несбалансированными категориями образцов.
Мы знаем, что в области обнаружения объектов изображение может генерировать тысячи мест-кандидатов, но только некоторые из них содержат объекты, что приводит к дисбалансу категорий. Итак, каковы последствия классового дисбаланса? Цитируя два следствия исходного текста:
(1)training is inefficient as most locations are easy negatives that contribute nouseful learning signal;
(2) en masse, the easy negatives can overwhelm training and lead to degeneratemodels.
Это означает, что количество отрицательных выборок слишком велико (образцы, принадлежащие к фону), на которые приходится большая часть общих потерь, и большинство из них легко классифицировать, поэтому направление оптимизации модели не то, на что мы надеялись. Таким образом, сеть не может получить полезную информацию и не может точно классифицировать объекты. На самом деле, есть несколько алгоритмов для решения проблемы несбалансированных категорий, таких как OHEM (онлайн-анализ сложных примеров).Основную идею OHEM можно резюмировать в одном предложении исходного текста: В OHEM каждый пример оценивается из-за его потери затем применяется немаксимальное подавление (nms ), и создается мини-пакет с примерами с наибольшими потерями. Хотя алгоритм OHEM увеличивает вес ошибочно классифицированных выборок, алгоритм OHEM игнорирует легко классифицируемые выборки.
Поэтому для проблемы дисбаланса классов автор предлагает новую функцию потерь: Focal Loss, которая модифицирована на основе стандартной кросс-энтропийной потери. Эта функция может заставить модель больше сосредоточиться на трудноклассифицируемых образцах во время обучения за счет уменьшения веса легко классифицируемых образцов. Чтобы доказать эффективность Focal Loss, автор разработал плотный детектор: RetinaNet и использовал обучение Focal Loss во время обучения. Эксперименты показывают, что RetinaNet может не только достигать скорости одноэтапного детектора, но и иметь точность двухэтапного детектора.
Описание формулы
Введение фокусных потерь. Прежде чем вводить фокусные потери, давайте посмотрим на кросс-энтропийные потери. Здесь мы возьмем вторую классификацию в качестве примера. Исходная классификационная потеря представляет собой прямое суммирование кросс-энтропии каждой обучающей выборки, то есть вес каждого образца одинаков. Формула выглядит следующим образом:
Поскольку это бинарная классификация, p представляет вероятность того, что предсказанная выборка принадлежит 1 (диапазон 0-1), y представляет метку, а значение y равно {+1,-1}. Когда реальная метка равна 1, то есть y = 1, если вероятность p = 0,6 выборки x прогнозируется равной 1, то потеря равна -log (0,6).Обратите внимание, что эта потеря больше или равна 0. Если p=0,9, то потери равны -log(0,9), поэтому потери при p=0,6 больше, чем потери при p=0,9, что легко понять. Здесь мы берем для примера только двухклассовую классификацию, а многоклассовую классификацию и так далее используем для удобства, заменяя p на pt, как показано в следующей формуле 2:. Точка здесь — это абсцисса на предыдущем рисунке 1.
Для простоты мы используем p_t для обозначения вероятности того, что образец принадлежит истинному классу. Итак, (1) можно записать так:
Далее мы представим базовое улучшение кросс-энтропии, которое также будет использоваться в качестве основы для эксперимента в этой статье.Поскольку количество положительных и отрицательных выборок одноэтапного детектора сильно различается во время обучения, обычной практикой является предоставление положительных и отрицательных образцов. Вес образца добавляется. Если частота отрицательного образца высока, вес отрицательного образца будет уменьшен. Если количество положительных образцов мало, вес положительный образец будет относительно увеличен. Следовательно, общий вес положительных и отрицательных образцов в общей сумме потерь можно регулировать, устанавливая значение α.
α принимает относительно небольшое значение, чтобы уменьшить вес отрицательных образцов (типа образцов, которых больше).
Очевидно, хотя предыдущая формула 3 может контролировать вес положительных и отрицательных образцов, но не может контролировать вес легко классифицируемых и трудно классифицируемых образцов, поэтому существует FocalLoss, где γ называется параметром фокусировки, γ> =0, называемый коэффициентом модуляции:
Зачем добавлять этот коэффициент модуляции? Цель состоит в том, чтобы уменьшить вес легко классифицируемых образцов, чтобы модель могла больше сосредоточиться на трудноклассифицируемых образцах во время обучения.
Путем экспериментов установлено, что рисунок такой, как показано на рисунке 1, по оси абсцисс — точка, по оси ординат — потеря. CE(pt) представляет собой стандартную формулу кросс-энтропии, а FL(pt) представляет улучшенную кросс-энтропию, используемую для определения фокальных потерь. Синяя кривая с γ=0 на рисунке 1 представляет собой стандартную кросс-энтропийную потерю.
Это не только устраняет дисбаланс положительных и отрицательных образцов, но также решает проблему дисбаланса между простыми и сложными образцами.
в заключении
Авторы называют дисбаланс классов основной причиной, по которой одноэтапные методы не могут превзойти наиболее эффективные двухэтапные методы. Чтобы решить эту проблему, автор предлагает фокальную потерю, которая использует поправочный термин в кросс-энтропии, чтобы сосредоточить обучение на сложных примерах и уменьшить вес большого количества простых негативов. даВ то же время он решает проблему несбалансированных положительных и отрицательных образцов и различения простых и сложных образцов..
Давайте посмотрим на код для реализации Focal Loss на основе MindSpore:
import mindspore
import mindspore.common.dtype as mstype
from mindspore.common.tensor import Tensor
from mindspore.common.parameter import Parameter
from mindspore.ops import operations as P
from mindspore.ops import functional as F
from mindspore import nn
class FocalLoss(_Loss):
def __init__(self, weight=None, gamma=2.0, reduction='mean'):
super(FocalLoss, self).__init__(reduction=reduction)
# 校验gamma,这里的γ称作focusing parameter,γ>=0,称为调制系数
self.gamma = validator.check_value_type("gamma", gamma, [float])
if weight is not None and not isinstance(weight, Tensor):
raise TypeError("The type of weight should be Tensor, but got {}.".format(type(weight)))
self.weight = weight
# 用到的mindspore算子
self.expand_dims = P.ExpandDims()
self.gather_d = P.GatherD()
self.squeeze = P.Squeeze(axis=1)
self.tile = P.Tile()
self.cast = P.Cast()
def construct(self, predict, target):
targets = target
# 对输入进行校验
_check_ndim(predict.ndim, targets.ndim)
_check_channel_and_shape(targets.shape[1], predict.shape[1])
_check_predict_channel(predict.shape[1])
# 将logits和target的形状更改为num_batch * num_class * num_voxels.
if predict.ndim > 2:
predict = predict.view(predict.shape[0], predict.shape[1], -1) # N,C,H,W => N,C,H*W
targets = targets.view(targets.shape[0], targets.shape[1], -1) # N,1,H,W => N,1,H*W or N,C,H*W
else:
predict = self.expand_dims(predict, 2) # N,C => N,C,1
targets = self.expand_dims(targets, 2) # N,1 => N,1,1 or N,C,1
# 计算对数概率
log_probability = nn.LogSoftmax(1)(predict)
# 只保留每个voxel的地面真值类的对数概率值。
if target.shape[1] == 1:
log_probability = self.gather_d(log_probability, 1, self.cast(targets, mindspore.int32))
log_probability = self.squeeze(log_probability)
# 得到概率
probability = F.exp(log_probability)
if self.weight is not None:
convert_weight = self.weight[None, :, None] # C => 1,C,1
convert_weight = self.tile(convert_weight, (targets.shape[0], 1, targets.shape[2])) # 1,C,1 => N,C,H*W
if target.shape[1] == 1:
convert_weight = self.gather_d(convert_weight, 1, self.cast(targets, mindspore.int32)) # selection of the weights => N,1,H*W
convert_weight = self.squeeze(convert_weight) # N,1,H*W => N,H*W
# 将对数概率乘以它们的权重
probability = log_probability * convert_weight
# 计算损失小批量
weight = F.pows(-probability + 1.0, self.gamma)
if target.shape[1] == 1:
loss = (-weight * log_probability).mean(axis=1) # N
else:
loss = (-weight * targets * log_probability).mean(axis=-1) # N,C
return self.get_loss(loss)
Способ применения следующий:
from mindspore.common import dtype as mstype
from mindspore import nn
from mindspore import Tensor
predict = Tensor([[0.8, 1.4], [0.5, 0.9], [1.2, 0.9]], mstype.float32)
target = Tensor([[1], [1], [0]], mstype.int32)
focalloss = nn.FocalLoss(weight=Tensor([1, 2]), gamma=2.0, reduction='mean')
output = focalloss(predict, target)
print(output)
0.33365273
Два важных свойства Focal Loss
1. Когда выборка классифицирована неправильно, pt очень мало, тогда коэффициент модуляции (1-Pt) близок к 1, и на потери не влияет, когда Pt→1, коэффициент (1-Pt) близок к 0, то разделенные веса хорошо классифицированных выборок корректируются вниз. Следовательно, коэффициент модуляции стремится к 1, что означает отсутствие значительных изменений по сравнению с первоначальными потерями. При стремлении pt к 1 (классификация правильная и выборка легко классифицируется) коэффициент модуляции стремится к 0, т. е. вклад в общие потери невелик.
2. Когда γ=0, фокальные потери являются традиционными кросс-энтропийными потерями.При увеличении γ коэффициент модуляции также будет увеличиваться. Параметр фокусировки γ плавно регулирует долю легко разделяемых выборок с уменьшенным весом. Увеличение γ может усилить влияние коэффициента модуляции, и эксперимент показал, что 2 лучше всего подходит для γ. Интуитивно понятно, что коэффициент модуляции уменьшает потери легко разделяемых выборок и расширяет диапазон выборок с низкими потерями. Когда γ является постоянным, например, равным 2, потери простого примера (pt=0,9) в 100+ раз меньше, чем стандартные кросс-энтропийные потери, а когда pt=0,968, они в 1000+ раз меньше, но для сложного примера (pt
Два свойства Focal Loss являются ключевыми.Фактически, это использование подходящей функции для измерения вклада трудноклассифицируемых и легкоклассифицируемых образцов в общие потери.
Официальная информация MindSpore GitHub:GitHub.com/minds пора - ах...
Гостиница:https ://gitee.com/mindspore/mindspore
Нажмите «Подписаться», чтобы впервые узнать о новых технологиях HUAWEI CLOUD~