Как использовать InsightFace для обучения распознаванию лиц?

алгоритм

Что такое InsightFace

InsightFaceЭто набор инструментов, связанных с обнаружением и распознаванием лиц. уже упакованоPython Package, который работает из коробки. Его верхний интерфейс может напрямую выполнять распознавание лиц, определение пола и т. д. Базовая реализация на самом деле представляет собой различные модели, которые были обучены.

OneFlowПредставленная модель является одним из бэкендов проекта InsightFace.

Для отображения эффекта рассуждения InsightFace вы можете обратиться к проекту на облачной платформе OneFlow.Демонстрация системы разрешений распознавания лиц.

Этот проект в основном знакомит с принципами и техническими приемами, относящимися к сверхкрупномасштабному обучению распознаванию лиц.

Как использовать предмет

Во-первых, нужноЗарегистрируйте учетную запись на облачной платформе OneFlow,Входитьэтот проекти "Вилка". Затем нажмите «Выполнить», подключите контейнер и выполните следующую команду.

cd /workspace && bash ./train_graph_distributed.sh

Будет вывод, аналогичный следующему, в том числе:

  • Базовая конфигурация для обучения
Training: 2021-12-14 14:49:44,690-rank_id: 0
Training: 2021-12-14 14:49:44,720-: loss                     cosface
Training: 2021-12-14 14:49:44,720-: network                  r50
Training: 2021-12-14 14:49:44,720-: resume                   False
Training: 2021-12-14 14:49:44,720-: output                   model
Training: 2021-12-14 14:49:44,720-: dataset                  ms1m-retinaface-t1
Training: 2021-12-14 14:49:44,720-: embedding_size           512
Training: 2021-12-14 14:49:44,721-: fp16                     True
Training: 2021-12-14 14:49:44,721-: model_parallel           True
Training: 2021-12-14 14:49:44,721-: sample_rate              0.1
Training: 2021-12-14 14:49:44,721-: partial_fc               0
Training: 2021-12-14 14:49:44,721-: graph                    True
Training: 2021-12-14 14:49:44,721-: synthetic                False
Training: 2021-12-14 14:49:44,721-: scale_grad               False
Training: 2021-12-14 14:49:44,721-: momentum                 0.9
Training: 2021-12-14 14:49:44,721-: weight_decay             0.0005
Training: 2021-12-14 14:49:44,722-: batch_size               128
Training: 2021-12-14 14:49:44,722-: lr                       0.1
Training: 2021-12-14 14:49:44,722-: val_image_num            {'lfw': 12000, 'cfp_fp': 14000, 'agedb_30': 12000}
Training: 2021-12-14 14:49:44,722-: ofrecord_path            /dataset/18fad635/v1/ofrecord
Training: 2021-12-14 14:49:44,722-: num_classes              93432
Training: 2021-12-14 14:49:44,722-: num_image                5179510
Training: 2021-12-14 14:49:44,722-: num_epoch                25
Training: 2021-12-14 14:49:44,722-: warmup_epoch             -1
Training: 2021-12-14 14:49:44,722-: decay_epoch              [10, 16, 22]
Training: 2021-12-14 14:49:44,723-: val_targets              ['lfw', 'cfp_fp', 'agedb_30']
Training: 2021-12-14 14:49:44,723-: ofrecord_part_num        32
  • Загрузка журнала данных набора проверки
Training: 2021-12-14 14:49:50,124-loading bin:0
Training: 2021-12-14 14:49:51,372-loading bin:1000
Training: 2021-12-14 14:49:52,649-loading bin:2000
Training: 2021-12-14 14:50:17,039-loading bin:9000
Training: 2021-12-14 14:50:18,300-loading bin:10000
Training: 2021-12-14 14:50:19,576-loading bin:11000
Training: 2021-12-14 14:50:20,839-loading bin:12000
Training: 2021-12-14 14:50:22,099-loading bin:13000
Training: 2021-12-14 14:50:23,353-oneflow.Size([14000, 3, 112, 112])
Training: 2021-12-14 14:50:23,709-loading bin:0
Training: 2021-12-14 14:50:24,991-loading bin:1000
Training: 2021-12-14 14:50:26,292-loading bin:2000
Training: 2021-12-14 14:50:27,590-loading bin:3000
Training: 2021-12-14 14:50:28,886-loading bin:4000
Training: 2021-12-14 14:50:30,174-loading bin:5000
Training: 2021-12-14 14:50:31,463-loading bin:6000
Training: 2021-12-14 14:50:32,744-loading bin:7000
Training: 2021-12-14 14:50:34,029-loading bin:8000
Training: 2021-12-14 14:50:35,315-loading bin:9000
Training: 2021-12-14 14:50:36,593-loading bin:10000
Training: 2021-12-14 14:50:37,867-loading bin:11000
Training: 2021-12-14 14:50:39,144-oneflow.Size([12000, 3, 112, 112])
  • Основная информация во время тренировки (скорость, изменение потерь, предполагаемое оставшееся время и т. д.)
Training: 2021-12-14 14:51:02,452-Speed 883.82 samples/sec   Loss 52.6974   LearningRate 0.1000   Epoch: 0   Global Step: 100   Required: 202 hours
Training: 2021-12-14 14:51:09,722-Speed 880.33 samples/sec   Loss 53.4146   LearningRate 0.1000   Epoch: 0   Global Step: 150   Required: 149 hours
Training: 2021-12-14 14:51:16,968-Speed 883.24 samples/sec   Loss 51.8446   LearningRate 0.1000   Epoch: 0   Global Step: 200   Required: 122 hours
Training: 2021-12-14 14:51:24,237-Speed 880.57 samples/sec   Loss 50.9537   LearningRate 0.1000   Epoch: 0   Global Step: 250   Required: 106 hours
Training: 2021-12-14 14:51:31,526-Speed 877.99 samples/sec   Loss 50.5335   LearningRate 0.1000   Epoch: 0   Global Step: 300   Required: 95 hours
Training: 2021-12-14 14:51:38,831-Speed 876.17 samples/sec   Loss 49.6624   LearningRate 0.1000   Epoch: 0   Global Step: 350   Required: 87 hours
Training: 2021-12-14 14:51:46,151-Speed 874.42 samples/sec   Loss 48.9462   LearningRate 0.1000   Epoch: 0   Global Step: 400   Required: 82 hours
Training: 2021-12-14 14:51:53,476-Speed 873.76 samples/sec   Loss 48.3082   LearningRate 0.1000   Epoch: 0   Global Step: 450   Required: 77 hours
Training: 2021-12-14 14:52:00,810-Speed 872.72 samples/sec   Loss 48.0000   LearningRate 0.1000   Epoch: 0   Global Step: 500   Required: 73 hours

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

Технологическая эволюция обучения распознаванию лиц

В области глубокого обучения одной из самых обсуждаемых историй является то, что Хитон продержался десятилетиями в холодный период нейронных сетей.Наконец, в 2012 году он привел своих учеников к участию в конкурсе по распознаванию изображений Imagnet с AlexNet, и выиграл чемпионат одним махом, а показатель точности на несколько процентных пунктов выше, чем у его сверстников, что открыло эру глубокого обучения.

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

Распознавание лиц на основе глубокого обучения, также с 2014 г.DeepID(CVPR 2014) Внедрение сверточных нейронных сетей в алгоритмы распознавания лиц к 2019 г.InsightFace, в основном зрелые.

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

В моделях распознавания лиц в основном используются сверточные нейронные сети, особенно ResNet, появившийся в 2015 г., который имеет очень хорошие показатели в области изображений, поэтому в последние годы не так много инноваций в моделях распознавания лиц, которые в основном основаны на том Интегральная нейронная сеть. Инновация технологии распознавания лиц — это, в значительной степени, инновация функции потерь.

из общегоSoftmax Lossк тому, который используется InsightFaceArcFace Loss, процесс эволюции показан на следующем рисунке:

image.png

В этом проекте в основном реализованы два наиболее часто используемых косфейса и аркфейса.loss, код выглядит следующим образом, нативный интерфейс oneflow позволяет пользователю удобно устанавливать m1, m2 и m3:

# loss
if cfg.loss == "cosface":
    self.margin_softmax = flow.nn.CombinedMarginLoss(1, 0., 0.4).to("cuda")
else:
    self.margin_softmax = flow.nn.CombinedMarginLoss(1, 0.5, 0.).to("cuda")

Его соответствующая математическая формула:

image.png

Как OneFlow просто и элегантно решает сверхкрупномасштабную задачу обучения распознаванию лиц

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

Для общих стратегий распределенного обучения и связанных с ними базовых знаний вы можете обратиться кРаспространенные распределенные параллельные стратегии

Характеристики обучающей модели для сверхкрупномасштабного распознавания лиц:

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

Такие характеристики делают его не подходящим ни для чистого параллелизма данных, ни для чистого параллелизма моделей, но подходящим для использования гибридного параллелизма: сверточная сеть в качестве экстрактора признаков использует параллелизм данных, а полносвязный слой использует параллелизм моделей, поэтому эффективность самая высокая. oneflow восстанавливает поддержку необработанного интерфейсаPartial FC, что может дополнительно уменьшить объем вычислений полностью подключенного слоя и значительно сократить использование памяти. Параллельный Softmax, реализованный с помощью однопотоковой оптимизации, может еще больше ускорить скорость обучения.Представлен принцип реализации:Как реализовать эффективное ядро ​​Softmax CUDA.

Соответствующие реализации в этом проекте:

#function.py line :118
self.backbone = backbone.to_consistent(placement=placement, sbp=flow.sbp.broadcast)

Приведенный выше код позволяет сверточной сети в качестве средства извлечения признаков проводить параллельное обучение данных.

#function.py line :110~117
if cfg.model_parallel:
    input_size = cfg.embedding_size
    output_size = int(cfg.num_classes/world_size)
    self.fc = FC7(input_size, output_size, cfg, partial_fc=cfg.partial_fc).to_consistent(
    placement=placement, sbp=flow.sbp.split(0))
else:
    self.fc = FC7(cfg.embedding_size, cfg.num_classes, cfg).to_consistent(
    placement=placement, sbp=flow.sbp.broadcast)

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

Другие коммуникации, планирование, синхронизация и т. д. передаются OneFlow для эффективного выполнения.

Для получения более подробной информации см. наш официальный учебник:InsightFace от бронзы до короля