Время прочтения: 3 мин.

Идея состояла в том, чтобы разделить видео на отдельные кадры и с помощью искусственного интеллекта находить на изображении экраны активных мониторов, а также сотрудников. Если человека за рабочим местом не находится – можно отдавать изображение на проверку аудитору.

Существует множество различных архитектур сверточных нейронных сетей для решения этой задачи. Наиболее удачным решением нам показалось использовать архитектуру U-Net на базе класса моделей EfficientNet. U-Net обеспечивает неплохой баланс между скоростью обработки изображения и качеством работы модели.

Инференс другой популярной архитектуры Mask R-CNN занимает в 5 раз больше времени, при этом ее качество лишь немного выше. Единственным недостатком U-NET является неспособность различить границы двух объектов при их наложении друг на друга, что для нашей задачи не представляет никакой проблемы.

EfficientNet – класс моделей сверточных нейронных сетей, разработанный в прошлом году путем балансирования глубины сети, количества каналов и разрешения изображения. На момент появления она показывала наилучшее качество классификации на открытых данных ImageNet, включающего более 10 млн. изображений, размеченных на более чем 20 тыс. классов.

Для раскадровки видео использованы возможности популярной библиотеки OpenCV для python.

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

Для разметки использован замечательный легковесный инструмент VGG Image Annotator, который позволяет непосредственно в окне браузера загрузить в проект список изображений и предоставляет удобный интерфейс для выделения границ различных объектов с указанием метки их класса. Данная работа довольно проста и не требует специфической квалификации, поэтому была распределена на целую команду аудиторов, чтобы закончить ее в разумный срок. На рисунке № 1 представлен пример размеченного изображения.

Рисунок 1

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

def get_training_augmentation():
    train_transform = [
        albu.Resize(HEIGHT, WIDTH),
        albu.HorizontalFlip(p=0.5),
        albu.ShiftScaleRotate(scale_limit=0.5, rotate_limit=0, shift_limit=0.1, p=0.1, border_mode=1),
        albu.IAAAdditiveGaussianNoise(p=0.1),
        albu.IAAPerspective(p=0.3),
        albu.OneOf(
            [
                albu.CLAHE(p=1),
                albu.RandomBrightness(p=1),
                albu.RandomGamma(p=1),
            ],
            p=0.25,
        ),

        albu.OneOf(
            [
                albu.IAASharpen(p=1),
                albu.Blur(blur_limit=3, p=1),
                albu.MotionBlur(blur_limit=3, p=1),
            ],
            p=0.25,
        ),

        albu.CropNonEmptyMaskIfExists(HEIGHT, WIDTH, p = 0.05),
    ]
    return albu.Compose(train_transform)

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

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