Введение в отслеживание метрик

При разработке мультисистемы наблюдения за объектами важно разработать метод, чтобы оценить его производительность против доступной основной истины. Эта основная истина обычно доступна от среды симуляции или при помощи методов как экстракция основной истины с помощью руководства или автоматизированной маркировки на записанных данных. Хотя возможно качественно оценить алгоритм отслеживания с помощью инструментов визуализации, подход обычно не масштабируем. Этот пример вводит различные инструменты количественного анализа в Sensor Fusion and Tracking Toolbox™ для оценки производительности средства отслеживания. Вы будете также использовать некоторые общие события как ложные дорожки, подкачки дорожки, с которыми и т.д. сталкиваются при отслеживании нескольких объектов изучить сильные места и ограничения этих инструментов.

Присвоение и ошибочные метрики

Общий рабочий процесс для оценки мультиобъектного средства отслеживания в присутствии основной истины может быть разделен на 2 основных шага. Во-первых, дорожки присвоены истинам с помощью алгоритма присвоения. Во-вторых, с помощью вычисленного присвоения в качестве входа, точность оценки состояния для каждой дорожки вычисляется. На каждом шаге могут быть получены некоторые ключевые метрики для производительности средства отслеживания. В Sensor Fusion and Tracking Toolbox™ метрики, соответствующие этим двум шагам, называют как метрики присвоения и ошибочные метрики соответственно.

Метрики присвоения оценивают характеристики средства отслеживания, заканчивающегося из-за неправильного присвоения данных о датчике к дорожкам из-за неоднозначности, пропущенных целей или присутствия ложных предупреждений. Неправильное присвоение данных о датчике может привести к событиям как свопинг дорожек между целями, созданием избыточных дорожек для цели, отбрасывания истинной целевой дорожки и создания ложной дорожки. С другой стороны, ошибочные метрики обеспечивают оценку оценки состояния или точности уровня объектов средства отслеживания. Даже когда средство отслеживания делает хорошее задание в присвоении, погрешности на уровне дорожки могут произойти из-за шума в измерениях, а также погрешностей в моделировании модели движения цели и модели измерения датчика.

Дорожки и определение истин

Метрики присвоения используют закрытый жадный подход ближайшего соседа, который позволяет присвоения дорожки many-one, что означает, что несколько дорожек могут быть присвоены той же истине. На каждом шаге метрики стремятся присваивать дорожки истинам при составлении их присвоения в предыдущем временном шаге. Это помогает метрикам присвоения классифицировать дорожки в определенные категории на основе текущих, а также предыдущих присвоений. Категории, используемые метриками присвоения в дорожках, описаны в изображениях ниже.

Метрики присвоений также представляют истины как различные категории "целей" с точки зрения средства отслеживания. Это помогает метрикам присвоения записать события, такие как установление дорожки и целевой пропуск. Установление и события пропуска показывают в изображении ниже.

Путем классификации дорожек и истин в несколько категорий, метрики присвоения выводят совокупный анализ производительности средства отслеживания. Метрики также предоставляют подробную информацию об информации о присвоении для каждой истины и дорожки. Кроме того, результаты присвоения на каждом шаге от метрик присвоения могут также использоваться, чтобы оценить ошибочные метрики. Ошибочные метрики выводят совокупный анализ точности средства отслеживания в оценке состояния. Подобно метрикам присвоения ошибочные метрики также предоставляют подробную информацию для каждой дорожки и истины.

Затем вы изучите, как использовать присвоение и ошибочные метрики в MATLAB.

Вычислите и анализируйте метрики

Чтобы использовать метрики присвоения, вы создаете trackAssignmentMetric Система object™. Вы также задаете свойства объекта с помощью пар "имя-значение", чтобы сконфигурировать метрику для различных приложений. В этом примере вы задаете расстояние присвоения и расхождения как абсолютную погрешность в положении между дорожкой и истиной. Вы также задаете пороги расстояния для присвоения и расхождения дорожки.

assignmentMetrics = trackAssignmentMetrics(...
    'AssignmentDistance','posabserr',...
    'DivergenceDistance','posabserr',...
    'DivergenceThreshold',1,...
    'AssignmentThreshold',0.85)
assignmentMetrics = 
  trackAssignmentMetrics with properties:

    DistanceFunctionFormat: 'built-in'
               MotionModel: 'constvel'
       AssignmentThreshold: 0.8500
       DivergenceThreshold: 1
        AssignmentDistance: 'posabserr'
        DivergenceDistance: 'posabserr'

Чтобы использовать ошибочные метрики, вы создаете trackErrorMetrics Системный объект. Поскольку никакие пары "имя-значение" не обеспечиваются, значения по умолчанию используются. В этом примере цели приняты, чтобы быть прослеженными с помощью модели постоянной скорости.

errorMetrics = trackErrorMetrics
errorMetrics = 
  trackErrorMetrics with properties:

    ErrorFunctionFormat: 'built-in'
            MotionModel: 'constvel'

Присвоение и ошибочные метрики управляются симулированными дорожками и истинами при помощи класса помощника, helperMetricEvaluationScenarios. Объект этого класса выводит список дорожек и истин на каждом временном шаге.

trackTruthSimulator = helperMetricEvaluationScenarios;

Вы также визуализируете результаты присвоения и ошибочных метрик с помощью класса помощника под названием helperMetricEvaluationDisplay. Эти классы помощника включены с примером в той же рабочей папке как этот скрипт.

display = helperMetricEvaluationDisplay(...
    'PlotTrackClassification',true,...
    'PlotTruthClassification',true,...
    'PlotTrackErrors',false,...
    'PlotTruthErrors',false,...
    'PlotAssignments',true,...
    'RecordGIF',true,...
    'ErrorToPlot','posRMS');

Вы генерируете список дорожек и истин каждый раз и запускаете присвоение и ошибочные метрики с помощью следующего рабочего процесса.

% Time stamps at which the metrics are updated
timeStamps = 0:0.1:10;
n = numel(timeStamps);

% Initialization of recorded variables
posRMSE = zeros(n,1);
velRMSE = zeros(n,1);
posANEES = zeros(n,1);
velANEES = zeros(n,1);
truthError = cell(n,1);
trackError = cell(n,1);

% Loop over time stamps
for i = 1 : n
    % Current time
    time = timeStamps(i);
    
    % Generate tracks and truths using simulation
    [tracks, truths] = trackTruthSimulator(time);
    
    % You provide the tracks and truths as input to the assignment metrics.
    % This outputs a cumulative summary from all the tracks and the truths.
    [trackAssignmentSummary(i), truthAssignmentSummary(i)] = assignmentMetrics(tracks, truths); %#ok<SAGROW> 
    
    % For detailed assignment information about each track, you use the
    % trackMetricsTable method.
    trackTable = trackMetricsTable(assignmentMetrics);
    
    % Similarly, for detailed assignment information about each truth, you
    % use the truthMetricsTable method.
    truthTable = truthMetricsTable(assignmentMetrics);
    
    % For running error metrics, you obtain the current assignment of
    % tracks to truths using the currentAssignment method.
    [assignedTrackIDs, assignedTruthIDs] = currentAssignment(assignmentMetrics);
    
    % The current assignment information as well as the list of tracks and
    % truths at the current time can then be passed as an input to the
    % error metrics.
    [posRMSE(i),velRMSE(i),posANEES(i),velANEES(i)] = errorMetrics(tracks, assignedTrackIDs, truths, assignedTruthIDs);
    
    % For detailed error information about each record truth and track, you
    % use the cumulative metric methods on the error metrics.
    trackError{i} = cumulativeTrackMetrics(errorMetrics);
    truthError{i} = cumulativeTruthMetrics(errorMetrics);
    
    display(tracks, truths, assignedTrackIDs, assignedTruthIDs, trackTable, truthTable);
end

Анализируйте метрики присвоения

Анимация ниже показов визуальное представление метрик присвоения. В начале и P1 и P2 не имели никаких связанных дорожек из-за задержки установления. Поэтому они были оба категоризированы как пропущенные цели. Приблизительно X = 5 метров, P1 не был прослежен для нескольких временных шагов. Заметьте что метрики присвоения выходные параметры P2 как пропущенная цель в это время. Когда дорожки подкачали между P1 и P2, они были первоначально объявлены расходящиеся, когда они переместились из порогов расхождения. После нескольких временных шагов дорожки достигли логического элемента присвоения новых истин и стали связанными к новой истине.

Визуализация метрики для каждой дорожки и истины может помочь в более легком понимании различных событий. Однако это может стать подавляющим для большого количества дорожек и истин. Альтернативный подход должен использовать итоговый выход метрик присвоения. Эти выходные параметры предоставляют полные сводные данные метрик присвоения до шага текущего времени. Поля и значения метрических сводных данных присвоения в конце симуляции показывают ниже.

disp(trackAssignmentSummary(end));
           TotalNumTracks: 5
           NumFalseTracks: 1
             MaxSwapCount: 1
           TotalSwapCount: 2
       MaxDivergenceCount: 1
     TotalDivergenceCount: 3
      MaxDivergenceLength: 7
    TotalDivergenceLength: 17
       MaxRedundancyCount: 1
     TotalRedundancyCount: 1
      MaxRedundancyLength: 34
    TotalRedundancyLength: 34
disp(truthAssignmentSummary(end));
              TotalNumTruths: 2
            NumMissingTruths: 0
      MaxEstablishmentLength: 5
    TotalEstablishmentLength: 10
               MaxBreakCount: 2
             TotalBreakCount: 4
              MaxBreakLength: 9
            TotalBreakLength: 9

Путем получения сводных данных присвоения на каждом шаге можно также построить совокупный анализ. Следующие графики показывают подмножество полей и для дорожки и для сводных данных присвоения истины.

helperPlotStructArray(display,trackAssignmentSummary);

helperPlotStructArray(display,truthAssignmentSummary);

Анализируйте ошибочные метрики

Подобно метрикам присвоения ошибочные метрики могут также вычисляться и визуализироваться на дорожку и истину. Поля ошибки оценки для каждой дорожки и истины в конце симуляции показывают ниже. Каждое из этих полей представляет совокупную ошибку по каждой дорожке и истине.

Ошибка оценки для каждой дорожки

disp(trackError{end});
    TrackID    posRMS      velRMS     posANEES    velANEES 
    _______    _______    ________    ________    _________

       1       0.72278     0.87884     0.52241      0.77236
       2       0.16032    0.083823    0.025702    0.0070263
       3       0.52898      1.3192     0.27982       1.7403
       4       0.74411       2.112     0.55369       4.4604

Ошибка оценки для каждой истины

disp(truthError{end});
    TruthID    posRMS     velRMS    posANEES    velANEES
    _______    _______    ______    ________    ________

       1       0.52259    1.3918     0.2731      1.9372 
       2       0.58988     1.259    0.34795      1.5851 

Путем записи ошибок в каждый такт можно также построить ошибку по сравнению со временем для каждой дорожки и истины. Следующие графики показывают ошибку RMS в положении для каждой дорожки и истины. После того, как дорожка удалена, ошибка в ее оценке остается постоянной. Заметьте, что в первой половине симуляции, ошибка в оценке T3 выше, чем тот из T4, потому что траектория T3 не совпадала с траекторией P2 отлично. Также заметьте отбрасывание по ошибке для оценки T3 в первой половине, когда это медленно сходилось к истинной позиции. Во время события подкачки дорожки. ошибка в оценке и T3 и T4, увеличенного до их переключенных присвоений.

% A utility to plot the table array. 'posRMS' is the field to plot
helperPlotTableArray(display,trackError,'posRMS');

Ошибка в оценке каждой истины является просто накоплением ошибки оценки всех дорожек, присвоенных ему. Когда P2 был присвоен избыточная дорожка около 8-го такта симуляции, ее ошибка оценки перешла. Как избыточная дорожка P2, к которому приближаются, ошибочные уменьшения, но снова увеличивается когда ее связанная отличенная дорожка.

helperPlotTableArray(display,truthError,'posRMS');

Для большого количества дорожек и истин, можно также использовать совокупные ошибочные метрики во всех присвоенных дорожках в течение их жизненного цикла. Заметьте увеличение по ошибке, когда дорожки подкачали (около 80-го шага). Также заметьте меньший пик вокруг 25-го временного шага, когда T1, отклоненный от его присвоенной истины P2 и, настигла избыточная дорожка T3.

f = figure('Units','normalized','Position',[0.1 0.1 0.6 0.6]);
ax = axes(f);

subplot(2,2,1)
plot(posRMSE,'LineWidth',2);
xlabel('Time step');
ylabel('RMS Error in Position (m)');
grid('on');

subplot(2,2,2)
plot(velRMSE,'LineWidth',2);
xlabel('Time step');
ylabel('RMS Error in Velocity (m/s)');
grid('on');

subplot(2,2,3)
plot(posANEES,'LineWidth',2);
xlabel('Time step');
ylabel('Average Normalized Error in Position');
grid('on');

subplot(2,2,4)
plot(velANEES,'LineWidth',2);
xlabel('Time step');
ylabel('Average Normalized Error in Velocity');
grid('on');

sgtitle('Cumulative errors for all tracks','FontWeight','bold');

Суммирование метрик как баллы

Общий пример использования для оценки производительности мультиобъектного средства отслеживания должен настроить свои параметры. Это обычно делается путем объединения метрик в одну величину затрат, которая может служить функцией для алгоритма оптимизации. Присвоение и ошибочные метрики обеспечивают несколько различных мер эффективности (MoEs) и могут быть объединены первым выбором самых соответствующих метрик и затем выполнением взвешенной комбинации в зависимости от приложения. Выбор правильного MoEs, а также их комбинации в один счет может быть сложным. Как альтернатива этому подходу, можно использовать Оптимальное Присвоение SubPattern (OSPA) [1] метрика и Обобщенное Оптимальное Присвоение SubPattern (GOSPA) [2] метрика. И OSPA и метрика GOSPA оценивают производительность мультиобъектного средства отслеживания путем объединения обоих присвоений, а также точности оценки состояния в одну величину затрат. Затем вы будете учиться о OSPA и метрике GOSPA и рабочем процессе вычислять эти метрики в MATLAB.

Метрика OSPA

Метрика OSPA может быть рассмотрена как статистическое расстояние между несколькими дорожками и истинами. Чтобы вычислить метрику OSPA, алгоритм сначала присваивает существующие дорожки и истины друг другу использующему алгоритм Глобального самого близкого соседа (GNN). Если присвоение вычисляется, метрика делит общее расстояние на два субкомпонента - локализация и несоответствие кардинальности. Компонент локализации фиксирует ошибки, следующие из точности оценки состояния, в то время как компонент несоответствия кардинальности получает эффект избыточных дорожек, ложных дорожек и пропущенных истин. Традиционная метрика OSPA не учитывает временную историю дорожек, т.е. присвоения от предыдущего шага не влияют на метрику на текущем шаге. Поэтому эффекты как переключатели дорожки не получены в традиционной метрике OSPA. Чтобы обойти это, новый субкомпонент был введен для OSPA, названного компонентом "маркировки" [3]. Комбинация традиционного OSPA с "маркировкой" компонента иногда упоминается как "OSPA для Дорожек" (OSPA-T) или Помечена-OSPA (LOSPA) [4].

Чтобы использовать метрику OSPA в MATLAB, вы используете trackOSPAMetric Системный объект. Можно переключиться от OSPA до Помеченного-OSPA путем обеспечения ненулевого ценного LabelingError свойство. Чтобы изучить, как каждый субкомпонент вычисляется, обратитесь к разделу "Algorithms" trackOSPAMetric.

ospaMetric = trackOSPAMetric('Distance','posabserr',...
    'CutoffDistance',1,...
    'LabelingError',0.25);

Затем вы запускаете тот же сценарий и вычисляете метрику OSPA на каждом временном шаге.

timeStamps = 0:0.1:10;
n = numel(timeStamps);

% Scene simulation
trackTruthSimulator = helperMetricEvaluationScenarios;

% Initialize variables
ospa = zeros(n,1);
locComponent = zeros(n,1);
cardComponent = zeros(n,1);
labelingComponent = zeros(n,1);

% Loop over time stamps
for i = 1:numel(timeStamps)
    time = timeStamps(i);
    
    % Track and truth
    [tracks, truths] = trackTruthSimulator(time);
    
    % Call the System object as a function and record OSPA and all 3 components
    [ospa(i),locComponent(i),cardComponent(i),labelingComponent(i)] = ospaMetric(tracks, truths);
end

Анализируйте метрику OSPA

figure('Units','normalized','Position',[0.1 0.1 0.6 0.6]);

subplot(2,1,1);
plot(ospa,'LineWidth',2);
xlabel('Time step');
ylabel('Cost');
title('OSPA');
grid('on');

subplot(2,1,2);
plot([locComponent cardComponent labelingComponent],'LineWidth',2);
xlabel('Time step');
ylabel('Component Cost');
title('OSPA Components');
legend('Localization','Cardinality-mismatch','Labeling');
grid('on');

Заметьте корреляцию между метрическими и различными событиями OSPA в сценарии. OSPA высок первоначально из-за задержки установления. После установления OSPA остается все еще относительно высоким из-за присутствия избыточной дорожки. После того, как избыточная дорожка была удалена, OSPA спал до нижнего значения. Вокруг 50-го временного шага OSPA получил значение как истину, P1 был пропущен. Заметьте, что, в то время как метрика OSPA получает все эти события правильно путем введения более высокого значения, она не предоставляет более прекрасную подробную информацию о каждой истине и дорожке и точности в их оценке. Единственная информация, доступная от OSPA, через ее компоненты. Более высокий компонент локализации указывает, что присвоенные дорожки не оценивают состояние истин правильно. Этот компонент локализации вычисляется с помощью того же типа расстояния как присвоение. Более высокий компонент кардинальности указывает на присутствие пропущенных целей и ложных или избыточных дорожек. Более высокая ошибка маркировки указывает, что дорожки не помечены правильно, который указывает, что дорожки сопоставлены к их самым близким доступным истинам.

Метрика GOSPA

Использованный для расчета GOSPA подхода похож на метрику OSPA. Используя немного отличающуюся математическую формулировку, метрика GOSPA дополнительно вычисляет субкомпоненты, такие как "пропущенный целевой компонент", и "ложь отслеживает компонент". Подобно традиционному OSPA GOSPA также не учитывает временную историю дорожек. Однако метрика, похожая на Помеченный-OSPA, может быть достигнута путем добавления переключающегося компонента [5]. Переключающийся компонент получает эффект переключающихся присвоений между истинами. Каждое изменение присвоения для истины оштрафовано, будучи категоризированным как полупереключатель или полный переключатель. Полупереключатель относится к событию, когда истина переключает присвоение от дорожки до того, чтобы быть неприсвоенным или наоборот. Полный переключатель относится к событию, когда истина переключает присвоение от одной дорожки до другого.

Чтобы использовать метрику GOSPA в MATLAB, вы создаете trackGOSPAMetric Системный объект. Чтобы составлять переключение дорожки, вы вводите положительное значение для SwitchingPenalty.

gospaMetric = trackGOSPAMetric('Distance','posabserr',...
    'CutoffDistance',1,...
    'SwitchingPenalty',0.25);

Затем вы запускаете тот же сценарий и вычисляете метрику GOSPA на каждом временном шаге.

timeStamps = 0:0.1:10;
n = numel(timeStamps);
trackTruthSimulator = helperMetricEvaluationScenarios;

% Initialize variables
labeledGospa = zeros(n,1);
traditionalGospa = zeros(n,1);
locComponent = zeros(n,1);
missedTargetComponent = zeros(n,1);
falseTrackComponent = zeros(n,1);
switchingComponent = zeros(n,1);

% Loop over time stamps
for i = 1:numel(timeStamps)
    time = timeStamps(i);
    
    % Track and truth
    [tracks, truths] = trackTruthSimulator(time);
    
    % Call the System object as a function and get all 4 components
    [labeledGospa(i),traditionalGospa(i),switchingComponent(i),locComponent(i),missedTargetComponent(i),falseTrackComponent(i)] = gospaMetric(tracks, truths);
end

Анализ результатов

figure('Units','normalized','Position',[0.1 0.1 0.6 0.6]);

subplot(2,1,1);
plot(labeledGospa,'LineWidth',2);
xlabel('Time step');
ylabel('Cost');
title('GOSPA');
grid('on');

subplot(2,1,2);
plot([locComponent missedTargetComponent falseTrackComponent switchingComponent],'LineWidth',2);
xlabel('Time step');
ylabel('Component Cost');
title('GOSPA Components');
legend('Localization','Missed Target','False Track','Switching');
grid('on');

Заметьте, что метрика GOSPA также получает эффект различных событий во время сценария, похожего на метрику OSPA. В отличие от OSPA, это также предоставляет информацию, если метрика происходит выше из-за ложных дорожек или пропущенных целей. Заметьте, что пик пропущен целевой компонент вокруг 50-го временного шага. Этот пик обозначает событие, когда P1 был пропущен для нескольких шагов. Пик около 80-го такта в пропущенном целевом компоненте обозначает событие, когда дорожки подкачали. Задержка между расхождением и переназначением привела к пропущенным целям, а также ложной дорожке компоненты.

Peaks в компоненте переключения дорожки обозначает различные события. Первый пик составляет истины, переключающиеся от неприсвоенного до присвоенного. Второй пик составляет переключение дорожек на P2. Третий и четвертый пик получает ту истину, P1 был неприсвоенным и затем присвоен другой дорожке соответственно. Последние два peaks составляют неприсвоение истины и затем переназначение.

Подобно OSPA GOSPA также не предоставляет подробную информацию о каждой дорожке и истине. Информация от GOSPA доступна через ее компоненты. Как имя утверждает, более высокий пропущенный целевой компонент обозначает, что цели не прослеживаются, и более высокий ложный компонент дорожки обозначает присутствие ложных дорожек. Более высокий штраф переключения обозначает события как установление, подкачки дорожки и пропущенные дорожки. Подразделение компонентов, чтобы включать пропущенные цели и ложные дорожки помогает в изменении правильного параметра средства отслеживания. Например, если ложные дорожки создаются, стандартное решение должно попытаться увеличить порог для подтверждения дорожки.

Сводные данные

В этом примере вы изучили приблизительно три различных инструмента, чтобы анализировать производительность мультисистемы наблюдения за объектами. Вы также учились о рабочем процессе в MATLAB использовать эти метрики. Вы также склонились о типе информации, которую они предоставляют и как это может анализироваться. Инструменты, описанные в этом примере, гибки и могут быть настроены для различных приложений и примеров использования. Существуют "встроенные" опции, доступные на всех инструментах, чтобы задать различные типы расстояний, которые будут использоваться в метрике. Например, абсолютная погрешность в положении или скорости или нормированной ошибке в положении или скорости. Можно также задать три различных модели движения для дорожек: постоянная скорость, постоянная угловая скорость вращения и постоянное ускорение. Эти "встроенные" функциональности поддерживают дорожки в форме objectTrack и истины, сгенерированные симуляциями сценария с помощью trackingScenario. Если формат дорожек и истин для вашего приложения отличается, можно предварительно обработать их, чтобы преобразовать их. Это позволяет вам использовать всю "встроенную" функциональность метрик. В качестве альтернативы можно задать пользовательскую функцию расстояния между дорожкой и истиной. Это позволяет вам управлять расстоянием, а также форматом каждой дорожки и истины. Чтобы переключиться между пользовательской и встроенной функциональностью для OSPA и метрикой GOSPA, задайте Distance как 'custom'. Чтобы переключиться между пользовательской и встроенной функциональностью для присвоения и ошибочными метриками, измените DistanceFunctionFormat и ErrorFunctionFormat к 'custom'для присвоения и ошибочных метрик соответственно.

Ссылки

[1] Schuhmacher, Доминик, Ba-Tuong Vo и Ba-Ngu Vo. "Сопоставимая метрика для оценки результатов деятельности мультиобъектных фильтров". Транзакции IEEE на обработке сигналов 56.8 (2008): 3447-3457.

[2] Rahmathullah, Абу Сэджана, Анхель Ф. Гарсия-Фернандес и Леннарт Свенсон. "Обобщенная оптимальная метрика присвоения подшаблона". 2 017 20-х Международных конференций по вопросам информационного Fusion (Fusion). IEEE, 2017.

[3] Ristic, Бранко, и др. "Метрика для оценки результатов деятельности мультицелевых алгоритмов отслеживания". Транзакции IEEE на Обработке сигналов 59.7 (2011): 3452-3457.

[4] Малер, Рональд ПС. Усовершенствования в статистическом мультицелевом мультиисточником информационном сплаве. Дом Artech, 2014.

[5] Rahmathullah, Абу Сэджана, Анхель Ф. Гарсия-Фернандес и Леннарт Свенсон. "Метрика на пробеле конечных множеств траекторий для оценки мультицелевых алгоритмов отслеживания". arXiv предварительно распечатывают arXiv:1605.01177 (2016).

Для просмотра документации необходимо авторизоваться на сайте