Вступление


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

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

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

Формализация задачи


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

Для наглядности приведем примеры фотографий (на снимках сотрудники банка):

image
Рис 1. Фото с точки продажи

image
Рис 2. Фото с соцсетей

image
Рис 3. Фото паспорта

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

А) Сегментация


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

Минусы:

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

Было решено вернуться к этому методу только в случае отказа от альтернативных вариантов. Спойлер: не вернулись.

Б) Сравнение с другими фото в той же точке продажи


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

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

Минусы:

  • Несбалансированная выборка.
  • Сервис будет долго работать, если в точке продажи много фотографий.
  • При появлении новой точки продажи нужно переобучать модель.

Несмотря на минусы, мы реализовали модель из статьи, использовав блоки нейросетей VGG-16 и ResNet-50. И… получили процент правильных ответов не сильно выше 50% в обоих случаях :(

В) Классификация!


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

Подготовка данных


В датасете изображений из соцсетей с помощью библиотеки Dlib выбрали только те фото, на которых есть люди.

Снимки паспортов необходимо было по-разному обрезать, оставив только лицо. Тут на помощь снова пришла Dlib. Принцип работы получился таким: нашли с помощью этой библиотеки координаты лица -> обрезали фото паспорта, оставляя лицо.

В каждом из 3 классов оставили по 40 000 фото. Не забыли и про аугментацию данных

Модель


Использовали ResNet-50. Решали проблему как задачу многоклассовой классификации с непересекающимися классами. То есть считали, что фото может принадлежать только одному классу.

model = keras.applications.resnet50.ResNet50()
model.layers.pop()
for layer in model.layers:
    layer.trainable=True
last = model.layers[-1].output
x = Dense(3, activation="softmax")(last)
resnet50_1 = Model(model.input, x)
resnet50_1.compile(optimizer=Adam(lr=0.00001), loss='categorical_crossentropy', metrics=[ 'accuracy'])

Результаты


В тестовой выборке оставили 24 000 картинок, то есть 20%. Матрица ошибок выглядела следующим образом:

image
social net — соцсети;
passport — паспорта;
pos-credit – точки продаж-партнеры, которые осуществляют кредитование.

Общий процент ошибок – 1,6 %, для фотографий с точек продаж – 1,2 %. Большая часть ошибочно определенных снимков – похожие на два класса одновременно изображения. Например, почти все неверно определенные фотографии из класса pos-credit были сделаны в неудачных ракурсах (на фоне белой стены, видно только лицо). Поэтому они были похожи еще и на фото из класса social net. Такие фотографии имели низкую максимальную вероятность.
Мы добавили порог для максимальной вероятности. Если итоговое значение оказывается выше – мы доверяем классификатору, ниже – отправляем картинку на ручную проверку.

В итоге, результат работы сервиса для фотографии

image

выглядит следующим образом:

image

Итоги


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

Комментарии (14)


  1. foxyrus
    18.12.2018 22:51
    +2

    А нельзя ли было повысить точность, например, анализом метаданных снимка: отсутствие наличие exif, разрешение фото, отсутствие меток фоторедактора, наличие GPS данных (если фото с телефона) и тд?


    1. alex_minochkina Автор
      18.12.2018 23:49

      Метаданные анализируем в первую очередь. Если с ними что-то не так, то отправляем фото на ручную проверку. Если все в порядке, то уже используем нейросети


  1. Waik
    19.12.2018 07:26

    А были еще идеи решить данную проблему, расскажите о них? Как вообще реализована загрузка фото? Может стоит проверять не только результат работы(фотографию) а поработать над самим процессом (момент создания фото/загрузки). Например сделать утилиту(функционал в ЛК) что позволит работать только с веб-камерой и будет клеить некий уникальный Watermark? В общем убрать саму возможность загрузки RandomName.jpg.


    1. angel_zar
      19.12.2018 07:29

      Что помешает сделать фото фотографии?


      1. Waik
        19.12.2018 07:42

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


        1. Tsui_Hark
          19.12.2018 12:58

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


    1. Tsui_Hark
      19.12.2018 12:50

      Конечно, мы думали о работе над самим процессом. Просто проблема в том, что мы не всегда можем над ним работать) Например, если брокер, в котором сотрудники заполняют заявки — внешний, то мы можем лишь высказывать пожелания по его работе(мы же просто один из банков-потребителей), а реализация будет зависеть от желания торговой сети, которая управляет брокером.
      В итоге обычно проще реализовать проверки на своей стороне; управлять ими в таком случае намного удобнее и быстрее.


  1. postgres
    19.12.2018 15:19

    Что мешает требовать фотографировать клиентов с какой нибудь табличкой, листочком с кодом, договором, в опеределенном ракурсе и т.д.?


    1. alex_minochkina Автор
      19.12.2018 16:01

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


      1. postgres
        19.12.2018 17:11

        Понятно, потеряете партнеров со своими «хотелками»…
        Но, если установка каких-либо дополнительных требований к фото может помочь то:
        В итоге, другие банки ищут/не_ищут свой способ борьбы с этой проблемой, вместо объединения усилий?:)


        1. NikTrub
          20.12.2018 12:34
          +1

          Но, если установка каких-либо дополнительных требований к фото может помочь то

          Можно еще давать клиенту табличу «Я дур.. беру кредит на дорогой телефон», надевать на клиента шапочку из фольги, поставив его на одну ногу.
          Причем на государственном уровне внести требование.
          Тогда можно усложнить жизнь мошенникам, и помочь человеку одуматься перед тем как влезать в долги


    1. NikTrub
      20.12.2018 01:09

      Когда я получал Тинькоф карту, меня как раз сфотографировали с документами и с определенным ракурсом


  1. AC130
    19.12.2018 20:52
    +1

    Что если обманщик сфотографирует пустой фон в точке продаж, возьмёт фото из соцсети/паспорта, вырежет человека и вставит в фон? Какой результат выдаст нейросеть?


    1. NikTrub
      20.12.2018 12:47
      +1

      тоже интересно
      Статья конечно крутая, но обработкой фото сейчас уже никого не удивить

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

      Правда? это же печально, что уже подметили все комментаторы

      В современном мире фотография становится таким себе доказательством
      Инструментов обработки масса, фотки люди сами выкладывают

      Да и при оформлении sim-ки в салоне партнера можно скоммунздить все паспортные данные и оформить заявку
      А сфоткать под предлогом теста камеры супер-нового телефона.