Проект находится по адресу: https://gitee.com/windandwine/YOLO_v3_tensorflow При использовании материала указывайте источник
Проект реализует алгоритм детекции объектов YOLO v3 с помощью TensorFlow (Python) и может выполнять детекцию следующих 80 классов объектов на изображениях, папках с изображениями, камерах и видео.
{
"person", "bicycle", "car", "motorbike", "airplane", "bus", "train", "truck",
"boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench",
"bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra",
"giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
"skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove",
"skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup",
"fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange",
"broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "sofa",
"potted plant", "bed", "dining table", "toilet", "television", "laptop",
"mouse", "remote", "keyboard", "cell phone", "microwave oven", "toaster",
"sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
"hair dryer", "toothbrush"
}
Модель обучена на данных COCO для YOLO v3.
Если вы хотите скачать веса GitHub, нажмите здесь.
Если вы хотите скачать веса официального сайта, нажмите здесь.
Если вы хотите прочитать статью, нажмите здесь.# 2. YOLOv3
Архитектура переработана, где серый цвет представляет собой Darknet-53. В коде также присутствует yolo_block, показанный на схеме в розовом цвете. Выход yolo_block направляется как вперед, так и на выход; более подробную информацию можно получить из кода.
Существуют два модуля: DBL и Resn.
DarkNet-53 не использует слои Pooling и Fully Connected, вместо этого применяются сверточные слои с большим шагом (>1) для замены пулинга (вниз), что позволяет предотвратить потерю полезной информации, особенно важна эта особенность при работе с маленькими объектами.
V3 также использует BN (batch normalization). Активационной функцией является Leaky ReLU. Большинство conv слоёв используют комбинацию (conv + BN + Leaky ReLU), что и является базовым блоком v3, называемым DBL.
V3 объединяет в себе ResNet (residual network), что позволяет объединять информацию с низкого уровня и высокого уровня, предотвращает потерю полезной информации и одновременно предотвращает исчезновение градиентов при обучении глубоких сетей. Базовым блоком Res является ResNet.
Как показано на схеме, структура представлена следующим образом: (zero pooling + DBL + Res × n).
$$ 3 \times (4 + 1 + 80) = 255 $$# Три. Запуск
Проект требует установки tensorflow, opencv-python, numpy.
Параметры прогнозирования находятся в ./settings/predict_args.py
, их можно изменить по необходимости. Либо просто запустите скрипт для ввода параметров.
В директории имеется файл test.py
, который может использоваться для тестирования видео или изображений.
def main():
parser = argparse.ArgumentParser(description='YOLO V3 обнаружение файла')
parser.add_argument('--detect_object', default='img', type=str, help='Объект для обнаружения - img или video')
parser.add_argument('--input_image', default='', type=str, help='Путь к изображению')
parser.add_argument('--input_video', default='', type=str, help='Путь к видео')
parser.add_argument('--use_letterbox_resize', type=lambda x: (str(x).lower() == 'true'), default=True, help='Использование letterbox')
args = parser.parse_args()
# Обнаружение изображения
if args.detect_object == 'img':
img_origin = cv2.imread(args.input_image) # Исходное изображение
if img_origin is None:
raise Exception('Файл изображения не найден!')
img_detect(args)
# Обнаружение видео
elif args.detect_object == 'video':
vid = cv2.VideoCapture(args.input_video)
if not vid.isOpened():
raise Exception('Файл видео не найден!')
video_detect(args)
Файлы списка txt датасета содержат информацию о картинках, включая bbox и категории. Каждая строка имеет следующий формат:
line_idx File_name file_w file_h label x1 y1 w1 h1 label x2 y2 w2 h2 ...
При необходимости можно обратиться к ./convert/convert_annotation_file.py
для изменения других форматов в требуемые проекту.### 2.2 Настройка
Параметры обучения находятся в ./setting/train_args.py
, их следует изменять по мере необходимости.
Основной функцией входа является func
, которая находится в ./train.py
и может быть запущена напрямую.
Обучение с использованием набора данных WIDER Face приводит к ошибкам из-за наличия рамок аннотаций с шириной или высотой, равной нулю, при fine-tuning важно быть осторожным с данными.
Многие уловки v3 были заимствованы из v2, такие как BN, multi-scale, объединение характеристик и так далее.
По сравнению с v1, v2 внёс batch normalization, что повысило mAP на 2%.
Batch normalization, также известный как BN, представляет собой предварительную обработку данных, которая увеличивает скорость обучения и повышает качество обучения. BN основан на этом подходе, нормализуя входные данные каждого уровня.
Этот метод был создан на основе следующего контекста:1. Распределение входных данных каждого уровня нейронной сети постоянно меняется; стандартизация выходов верхних уровней помогает выравнять распределение входных данных, тем самым ускоряя обучение; возможно использование больших значений скорости обучения и затухания, не беспокоясь о начальных параметрах, BN всегда быстро сходится, что делает его спасением для настроителей. 2. Нормализация входных данных снижает вероятность достижения активационной функцией состояния насыщения в определённом диапазоне входных данных, что позволяет избежать проблемы исчезновения градиента; пример: (0.95^{64} \approx 0.0375) При накоплении вычислений происходит отклонение данных от центра, что приводит к увеличению или уменьшению ошибки. 3. Нормализация входных данных эквивалентна регуляризации образцов, что в некоторой степени может заменить Dropout; Пропускание Dropout теперь можно игнорировать, автоматизация работает во всю мощь.### 1.2 Процесс
Нормализация производится после конволюционного пулинга и перед активационной функцией, каждый выход данных нормируется до среднего значения 0 и дисперсии 1. $$ \begin{aligned} & \color{red}{\widehat{x}^{(k)} =\frac{x^{(k)}-\mathrm{E}[x^{(k)}]}{\sqrt{\mathrm{Var}[x^{(k)}]}}} \\ & \color{red}{y^{(k)} =\gamma^{(k)} \widehat{x}^{(k)} + \beta^{(k)}} \\ \end{aligned} $$ Первая часть представляет собой нормализацию внутри пакета, где E — это среднее значение пакета, а Var — дисперсия, пакет данных приближенно представляет собой общую картину.
Вторая часть включает дополнительные параметры γ и β, которые представляют масштаб и смещение соответственно. Простое нормирование аналогично использованию лишь линейной части аппроксимации активационной функции, что разрушает первоначальное распределение данных и снижает способность модели к представлению информации. Эти параметры должны быть обучены.
тонкая настройка: При предварительной подготовке сначала используются изображения размером 224x224 для обучения собственной сети извлечения признаков (160 эпох), эта часть называется классификацией, затем входные изображения масштабируются до размера 448x448, и происходит дальнейшая настройка сети (10 эпох) с использованием набора данных для детектирования, это часть называется детекцией.Этот подход повышает mAP на 4%.
В версии v1 всего 98 bbox, используя полносвязный слой для прямого прогнозирования координат bbox, потеряется много пространственной информации, что делает прогноз менее точным.
В версии v2 удаляются полносвязный слой Fc и последний пулинг из версии v1, чтобы последние свёрточные слои содержали более высокоразрешающие признаки, а затем сеть уменьшается, заменяя 448x448 на 416x416.
Размер ввода 416x416 позволяет получить карту признаков размером 13x13, карта признаков имеет нечётные размеры ширины и высоты, каждый блок карты при разбиении на ячейки имеет только один центральный блок (Центральная Ячейка). Объекты на изображении склонны появляться в центре, если есть только одна центральная ячейка, то это способствует прогнозированию этих объектов.
Используются anchor boxes, предсказывается смещение и уверенность anchor boxes вместо прямого прогнозирования координат, свёрточный слой использует 32 значения для выборочной фотографии, если использовать метод FSRCNN с 3 группами по 9 значений, то каждая ячейка может предсказать 9 anchor boxes, всего получается 13x13x9=1521 anchor box. В YOLO v2 метод определения anchor boxes - кластеризация по размерам, в каждой ячейке выбирается 5 anchor boxes.Для v1 это ( S^2 \times (B \times 5 + C) = 7 \times 7 \times (2 \times 5 + 10) ), а для v2 это ( S^2 \times K \times (5 + C) = 13 \times 13 \times 5 \times (5 + 20) ).
Где ( K ) — количество предсказываемых anchor box в каждой ячейке (по умолчанию ( K = 5 )), в скобках 5 — это уверенность (4 параметра) и 20 классовых вероятностей.
( mAP_4 ) снижается на 0.2%, но recall (полнота) увеличивается на 7%, разрешение feature map повышено, что помогает компенсировать недостаток YOLO в детектировании маленьких объектов.
В Faster R-CNN размеры anchor boxes задаются заранее, если они хорошо совпадают, то результат будет более точным.
В YOLO v2 используется метод k-means для обучения anchor boxes, автоматически находятся лучшие значения ширины и высоты для инициализации. K-means использует функцию евклидового расстояния. Большие anchor boxes по сравнению с малыми anchor boxes могут приводить к большему количеству ошибок, что может вызвать отклонение результатов кластеризации. Цель кластеризации — найти более точные начальные параметры anchor box, независимо от размера box, то есть увеличить значение IOU. YOLO v2 использует значение IOU в качестве критерия оценки, то есть K-means использует следующую функцию расстояния (меру):
$$
d(\text{box}, \text{centroid}) = 1 - \text{IoU}(\text{box}, \text{centroid})
$$
Как показано на рисунке, серые и фиолетовые цвета представляют два различных набора данных. После анализа результатов кластеризации и сопоставления сложности модели с значением IoU YOLO v2 был выбран K=5, то есть пять различных размеров рамок для прогнозирования локализации.Справа показаны начальные anchor box для прогнозирования пешеходов, а также вручную установленные Anchor Box, различия между которыми значительны. Узкие высокие рамки преобладают над широкими длинными, положение от центра отклонено (более соответствует характеристикам пешеходов).
IoU среднего значения для генерируемых Cluster'ами YOLO v2 пяти anchor'ов составляет 61%, тогда как модель FSRCNN с девятью anchor box'ами имеет IoU среднего значения 60,9%. Хотя количество anchor'ов меньше, но результаты примерно одинаковы, что делает YOLO v2 более эффективной.
YOLO v2 использует идеи Faster R-CNN, однако прямое прогнозирование bbox может вызвать нестабильность модели, так как центральная точка может находиться в любом месте, что приведёт к колебанию процесса регрессии.
Теперь используются смещения предсказаний для положительных anchor и GT (смещение и масштабный коэффициент): $$ \begin{aligned} & t_{x} = (x - x_{a}) / w_{a} \\ & t_{y} = (y - y_{a}) / h_{a} \\ & t_{w} = \log \left( \frac{w}{w_{a}} \right) \\ & t_{h} = \log \left( \frac{h}{h_{a}} \right) \end{aligned} $$ YOLO v2 использует строгие ограничения при прогнозировании параметров bbox.
На рисунке пунктирная черная рамка представляет собой anchor box, а синий — bbox. Ширина и высота прогнозируемого bbox (bx, by) и (bw, bh) вычисляются следующим образом:
$$
\begin{aligned}
& b_x = \sigma(t_x) + c_x \\
& b_y = \sigma(t_y) + c_y \\
& b_w = p_w e^{t_w} \\
& b_h = p_h e^{t_h}
\end{aligned}
$$
где ширина и высота anchor box равняются ( p_w ), ( p_h ). Каждый bbox имеет четыре параметра ((t_x, t_y, t_w, t_h)), координаты центра клетки ((c_x, c_y)), (\sigma) — сигмоидальная активационная функция, которая ограничивает значение функции в диапазоне (0, 1).Кратко говоря, ((b_x, b_y)) — это прогнозируемое положение bbox относительно anchor box в близлежащей клетке, основанное на предсказаниях ((t_x, t_y)). Этот подход значительно ограничивает прогнозирование значений ((t_x, t_y)) для bbox, расположенных на большом расстоянии.
Объединение пунктов 5 и 6 увеличивает mAP на 5%.
Детализированные характеристики (объединение характеристик), YOLO v2 добавляет переходный слой (Pass-through Layer: Route + Reorg), соединяющий высокоуровневые низкочастотные характеристики с низкоуровневыми высокочастотными, объединённые на разных каналах, для последующего детектирования. Конкретная операция заключается в получении карты признаков размером 26x26 с предыдущего слоя, соединение её с конечной картой признаков размером 13x13, после чего данные передаются в детектор для анализа. Полносвязный слой (Fully Connected layer) детектора выполняет роль объединения глобальных признаков, что повышает способность сети к распознаванию маленьких объектов.
Увеличивает mAP на 1%.
Многошкальное обучение, чтобы адаптироваться к различным масштабам задач распознавания, v2 использует динамически меняющиеся размеры входных изображений во время fine-tuning на наборе данных для обучения. Каждые 10 батчей тренировочных данных, сеть случайным образом выбирает другой размер входного изображения.v2 использует размеры, кратные 32, то есть {320, 352, ..., 608}, как размеры входных изображений (сеть автоматически изменяет размеры и продолжает процесс обучения).
Эта хитрость позволяет сети достигать хороших результатов на различных размерах входных данных, обеспечивая одно и то же сетевое решение для разных разрешений. Большие изображения обрабатываются медленнее, а маленькие — быстрее, что в целом повышает точность. Поэтому многошкальное обучение можно считать достижением баланса между скоростью и точностью.
Увеличивает mAP на 1%.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )