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

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

Для снижения рисков кибербезопасности был разработан инструмент, позволяющий выявлять случаи фотографирования экранов АРМ с использованием Computer Vision. В качестве языка программирования использовался python. Поиск сотрудников проводился с помощью видеоматериалов, полученных с камер видеонаблюдения. Далее видео нарезалось и получался пул кадров, используемый для дальнейшей обработки. Нарезка осуществлялась с использованием библиотеки OpenCV.

for videoname in inpath:
    inpathfull = os.path.join(dir_path, videoname)
    vidcap = cv2.VideoCapture(inpathfull)
    success, image = vidcap.read()
    i=0
    while vidcap.isOpened() and success:
        cv2.imwrite(outpath+videoname[:-4]+"_"+str(i)+".jpg",image)
        vidcap.set(cv2.CAP_PROP_POS_MSEC,(i*1000*3))
        success, image = vidcap.read()
        i = i + 1
    vidcap.release()

Техническую реализацию можно разбить на 2 основные составляющие:

-детекция объектов (сотрудник, монитор, телефон);

-определить наличие признаков фотографирования экранов АРМ.

Основным инструментом, который использовался для обнаружения объектов (сотрудник, монитор, телефон), стала модель YOLO (разновидность CNN). Ее особенность состоит в том, что сверточная нейронная сеть(CNN) применяется один раз ко всему изображению. За счет это получается значительный выигрыш по времени. При дообучении сети в качестве стартовых весов использовался заранее обученный COCO датасет. Во второй части требовалось определить действия, которые могут быть связаны с фотографированием экрана. Здесь применялась простая математика. Проверялось, находится ли телефон у сотрудника. Использовались координаты сотрудника и телефона, полученные после первой части, затем, через алгебраические преобразования находили пересечения людей с телефоном.

def GetPhoneHumanMapping(boxes, classes, smartphoneLabel, humanLabel):
    smartphoneIndexes = []
    humanIndexes = []
    for i in range(0, len(classes)):
        if classes[i] == smartphoneLabel:
            smartphoneIndexes.append(i)
        if classes[i] == humanLabel:
            humanIndexes.append(i)
    humanPhoneMapping = []
    for phoneIndex in smartphoneIndexes:
        phoneX, phoneY, phoneWidth, phoneHeight = boxes[phoneIndex]
        phoneBox = {
                'x': phoneX,
                'y': phoneY,
                'width': phoneWidth,
                'height': phoneHeight
                }
        for humanIndex in humanIndexes:
            humanX, humanY, humanWidth, humanHeight = boxes[humanIndex]
            humanBox = {
                    'x': humanX,
                    'y': humanY,
                    'width': humanWidth,
                    'height': humanHeight
                    }
            if CheckBoundingBoxEnclosure(phoneBox, humanBox) == True:
                humanPhoneMapping.append({
                        'human': boxes[humanIndex],
                        'phone': boxes[phoneIndex]
                        })
    return humanPhoneMapping

Далее проверялось, можно ли провести направленный отрезок через три объекта (сотрудник, телефон, монитор). Если можно, то кадр помечался как подозрительный. Таким образом, получалась риск-ориентированная выборка для ручного анализа.

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