Время прочтения: 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
Далее проверялось, можно ли провести направленный отрезок через три объекта (сотрудник, телефон, монитор). Если можно, то кадр помечался как подозрительный. Таким образом, получалась риск-ориентированная выборка для ручного анализа.
Разработка показала свою эффективность, хотя всегда есть место совершенствованию. Например, можно еще дообучить алгоритм на своих данных, что позволит повысить точность работы модели и сократить объем итоговой риск-ориентированной выборки.