Розбий моноліт! Kuberton — хакатон для DevOps-ів & Python, Java, Ruby, GO розробників. 1-2 Dec
×Закрыть

DOU Labs: как в GlobalLogic определяют рак кожи по фотографии

В рубрике DOU Labs мы приглашаем IT-компании делиться опытом собственных интересных разработок и внутренних технологических инициатив. Вопросы и заявки на участие присылайте на editors@dou.ua.

Статья создана в соавторстве с Владиславом Колбасиным (Lead Software Engineer, Consultant, GlobalLogic) и Игорем Манжосом (Consultant, GlobalLogic).

Несколько лет назад в харьковском офисе GlobalLogic был создан инновационный инкубатор BrainMade — для развития практики в BigData, Industrial, IoT, Augmented Reality, Machine Learning и других технологиях. Здесь все созданные нами Proof-of-Concepts (PoCs) получают свое продолжение и возможность практической реализации. Так была создана умная железная дорога и климатическая система с дополненной реальностью Meteologic.

Идея BrainMade — не только использовать инновационные наработки инкубатора для развития коммерческих проектов для наших клиентов, но и создавать решения, которые были бы полезны и презентабельны сами по себе.

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

Идея проекта

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

Выбор был не случаен: медицина входит в ключевые компетенции нашего центра разработки в Харькове, мы уже реализовали несколько проектов по обработке изображений; подобные задачи стояли и со стороны наших клиентов (но обычно такие разработки закрыты по условиям контрактов). А тут — и медицинская тематика, и интересная задача, и полностью наш проект, наработками которого мы можем делиться!

В переводе на английский «родинка» — «nevus». Так мы и назвали наш проект.

Команда Nevus

Предшественники

Тема диагностики меланомы путем визуального анализа кожного покрова не нова. Еще до старта нашего проекта существовало множество научных работ по этой теме. Самые фундаментальные — исследования в Стэнфорде, а также проект из Республики Беларусь с грантом от Европейского Союза на около 1 млн евро.

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

Изучив опыт предшественников, мы поняли, что обладаем достаточной экспертизой для создания нового решения, которое будет быстрее в разработке и удобнее для пользователя. Кроме того, мы решили расширить аудиторию проекта: от «домашних пользователей» — пациентов без какого-либо опыта и знаний в медицине — до специалистов, которые будут использовать приложение для предварительной диагностики потенциальных заболеваний. Детали смотрите ниже.

Именно в этом ключе мы и начали работу над проектом.

Задачи проекта

Точность

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

Родинка (nevus): пигментированное образование на коже; может окрашиваться в различные цвета: коричневый, черный, красный, фиолетовый и другие. Большинство родимых пятен безопасны, но под воздействием внешних факторов (ультрафиолетового излучения, травм и др.), родинка может переродиться в меланому.

Меланома (melanoma): злокачественная опухоль кожи. Ответная реакция организма на меланому очень слаба вплоть до ее отсутствия. Меланома может стремительно прогрессировать, поэтому так важно ее раннее выявление.

Себорейный кератоз (seborrheic keratosis): доброкачественная опухоль кожи. Встречается довольно часто на коже груди, лица, шеи, рук. Не перерождается в злокачественную опухоль, хотя некоторые врачи считают, что в очень редких случаях это все же возможно.

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

Простота использования

Нашей целью стало создание системы быстрой проверки родинок без специального оборудования — с помощью современного мобильного телефона.

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

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

Реализация проекта

В проекте были задействованы два разработчика, использовались технологии: TensorFlow, Angular, Node.js, Nginx.

Загрузка фото

В настоящий момент проект выполнен в виде сайта, где можно получить диагноз, загрузив фото родинки:

Обработка данных

Каждый случай — это фотография родинки и мета-информация: название, описание и существующий диагноз (если он известен).

Алгоритм анализирует входное изображение в несколько этапов. Вначале выделяет родинку из фона, создавая маску изображения:

Отделенная от фона родинка передается на обработку в нейронную сеть Inception V3. Эта сеть содержит 311 слоев и около 25 миллионов параметров.

В результате работы сеть возвращает набор вероятностей: риск меланомы, «риск» родинки или риск безвредного, но нежелательного себорейного кератоза.

Пользователь — доктор

Пользователь-врач может указать в форме уже известный диагноз для конкретного случая.

Например, ниже доктор отметил, что данная родинка — просто родинка, выбрав значение «Nevus» в выпадающем списке «Labeled by Doctor as:», значение по умолчанию — «Unknown»:

Вся информация, включая автоматический диагноз и его верификацию (о ней — ниже), отображена на панели для данного случая:

Галерея

В галерее можно увидеть все случаи, отфильтровать их по диагнозу, дате и названию:

О каждом случае можно узнать некоторые дополнительные сведения, например, какая маска была для него сгенерирована:

Алгоритм определения диагноза

Задача постановки диагноза сводится к подсчету рисков и выбору из них максимального значения.

Рассмотрим случай, описанный следующими вероятностями:

  • Melanoma Risk: 0.4052
  • Seborrheic keratosis Risk: 0
  • Simple nevus: 0.5948

Из этого Nevus делает вывод, что перед нами — обычная родинка, то есть «Simple nevus». Ее вероятность равна 0.5948, что больше двух других вероятностей (0.4052 для меланомы и 0 для кератоза).

Под заголовком «Probably it is a» отображается вывод, в нашем случае — «Nevus».

Сбор базы данных

Здесь мы столкнулись с проблемой: зачастую за качественно размеченные базы медицинских изображений надо платить. Стэнфордский набор данных из около 100 тыс. картинок публично не доступен. Мы взяли за основу ISDIS + несколько дополнительных баз. Было много работы с исследованием изображений и данных, их подготовкой, сегментацией и разметкой.

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

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

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

Работа с данными

Обучение

Непросто перечислить различные варианты построения моделей. Мы проверили разные архитектуры нейронных сетей, от простых сверточных до сложных многослойных сетей. Для повышения эффективности использовали методику передачи обучения «transfer learning» — когда знания, полученные при решении одной проблемы, применяются к другой проблеме, связанной с первой:

  1. Брали сеть, уже обученную для классификации изображений из набора ImageNet.
  2. Отбрасывали последний слой этой сети, ответственный за окончательные предсказания, и добавляли новый слой для решения нашей задачи.
  3. Несколько начальных слоев «замораживали» (их веса не изменялись).

В итоге мы пришли к сети «Inception-v3», с приблизительно половиной замороженных слоев и парой дополнительных полносвязных слоев.

Тестирование модели

Важные метрики медицинского теста — это специфичность (она же точность, precision, specificity) и чувствительность (она же recall, sensitivity). Эти метрики вычисляются по следующему алгоритму: тест на меланому классифицирует каждый случай как имеющий меланому (положительный результат) или не имеющий ее (результат отрицательный). Возможны четыре исхода:

  • Истинный положительный результат, true positive: тест показал меланому, и она действительно есть.
  • Истинный отрицательный результат, true negative: тест показал отсутствие меланомы, и ее действительно нет.
  • Ложный отрицательный результат, false negative: тест показал отсутствие меланомы, а на самом деле она есть.
  • Ложный положительный результат, false positive: тест показал меланому, а на самом деле ее нет.

Эти исходы можно представить в виде «матрицы неточностей» (confusion matrix):

Специфичность и чувствительность — это статистические показатели эффективности теста, вычисляемые по формулам:

Специфичность = количество истинных отрицательных результатов ÷ (количество истинных отрицательных результатов + количество ложных положительных результатов)

Чувствительность = количество истинных положительных результатов ÷ (количество истинных положительных результатов + количество ложных отрицательных результатов)

Идеальный тест получает 100% по обеим метрикам.

Сравним результаты

По сравнению со Стэнфордом, где над проектом работали 26 профессиональных врачей, наши ресурсы были довольно скромны. Мы оценивали нашу модель, сортируя все собранные изображения (около 10 000) на тренировочный и тестовый наборы. При этом мы учитывали указанное ранее хеширование для предотвращения повторений одинаковых изображений в обоих наборах.

В результате на тестовом датасете получилось решение с такими метриками:

  • Precision (Specificity) = 0.8238
  • Recall (Sensitivity) = 0.8044
  • F1 score = 0.8138
  • Accuracy = 0.89

Хороший ли это результат? Уверены — это достаточно неплохой результат. Напрямую сравнить точность полученной модели и других моделей, например, модели Стэнфорда, невозможно: там использовались другие данные и в большем объеме, а также другие процедуры проверки качества модели.

Например, согласно этой статье, исследователи получили:

  • Precision (Specificity) = 0.713
  • Recall (Sensitivity) = 0.866

Как видим, у нас Recall чуть хуже, но Precision — чуть лучше.

Матрица неточностей Nevus

Полные данные о распределении классов и предсказанных значениях в валидационной выборке приведены в матрице неточностей:

True/PredictedMelanomaNevusKeratosis
Melanoma54919326
Nevus162338434
Keratosis3743244

Нормализованная матрица:

True/PredictedMelanomaNevusKeratosis
Melanoma0.71480.25130.0339
Nevus0.04530.94530.0095
Keratosis0.11420.13270.7531

Результаты проекта

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

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

Будем рады вашим отзывам и предложениям в комментариях к статье!

LinkedIn

26 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

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

Нахер не надо. Просто откалибруй камеру.

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

Дякую за відгук! Ми намагаємося описати алгоритм якомога детальніше, але щоб не перевантажувати допис, що вже й так є занадто довгим (на наш погляд).

Тут є декілька цікавих аспектів;
1. З однієї сторони, основний алгоритм Inception V3 вже описаний.
2. З іншої сторони — є думка, що справа не в алгоритмі.
3. Свою частину алгоритму, яка є досить невеликою, ми оглядово описали в дописі.
4. Але при цьому самі автори нейронних мереж не завжди розуміють, як саме вони працюють )

Ваш відгук наводить мене на думку, що нам все ж варто окремий допис присвятити алгоритмам. Спробуємо описати не гірше, ніж булочки =)

4. Але при цьому самі автори нейронних мереж не завжди розуміють, як саме вони працюють )

Эту сказку можно часто повторять, но она так и остается сказкой. Обычно прекрасно понимают как и почему она работает, но не часто расписывают так, что любой понял.

Уровень средней дипломной работы. На мой взгляд, во-первых, не стоит брать настолько серьёзные темы «на поиграться», а во-вторых, без обратной связи от пользователей или хотя бы peer-review такой опыт в датасаенсе/IR бесмысленнен. «Нам кажется, что оно вроде как нормально распознает» на тех крошечных выборках, которые мы подготовили. А реальную ценность имеет опыт, когда «нам казалось, а оно нет, а потом мы вроде переделали, а оно нет, а потом мы ещё 5 раз и оно вроде бы наконец»

Спасибо за отзыв. Дело в том, что подовляющее большинство реальных проектов, а особенно с медицинскими компаниями (а медицина — традиционно специализация харьковского офиса), закрыты требованиями NDA. Например мой текущий проект с крупной медкомпанией, где у нас используются очень интересные RNN и достаточно продвинутый NLP, мы никак не можем показать, хотя он одновзначно выходит за рамки средней дипломной работы.
Приходится в свободное время играть вот с такими Pet solution, но тут и интереснее, мы не рагламентированы сроками, скоупом от заказчика. Так что исселедовать как это развернуть Serverless на lambda нам никто не запрещает. А это уже реальный челенж, когда надо все впихнуть в AWS lambda с ограничениме в 250 мегабайт

Я не до конца понял, что же вы продаете, экспертизу в IR или в DevOps? Последнее можно как-то без псевдомедицины продемонстрировать

Конечно можно, у нас очень много проектов. В этом акцент на ML, но что мешает и с оптимизацией клауда поиграть?

Поделитесь ссылкой на сайт!
И когда будет доступна публичная бета приложения ну или его релиз ?

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

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

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

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

Не совсем понятны выводы, данные, если смотреть конфюжин матрицу, очень четко говорят, что например родинки очень хорошо определяются и обычно ошибок очень мало. Меланома с данным трешхолдом будет в 75% диагностироваться, в 25% больше может быть вероятность родинки, но тут опять таки, если мы хотим избежать ошибок 2 рода, мы можем играть этим порогом.

я правильно розумію?
у випадку меланоми існує 25% ймовірності що система її не розпізнає?...

Чувствительность = количество истинных положительных результатов ÷ (количество истинных положительных результатов × количество ложных отрицательных результатов)

Наверно, не умножение, а сложение?

Дякую, це важливий коментар, виправляємо опечатку!

чуваки, ви мегакруті! <3

Крутая штука! Радуют такие проекты :) Давно хочу у всей семьи проверить родинки)

Как видим, у нас Recall чуть лучше, но Precision — чуть хуже.

А не наоборот? По приведенным в статье данным выходит vice versa.

Ви знайшли це! Фіксимо )

Чисто теоретически, и что вы будете делать, получив результат «вероятность меланомы 6%» — а это, судя по всему, наименьшая из возможных вероятностей для в принципе любой картинки ?

Для меня это будет пре-валидация, сейчас идти на осмотр или чуть позже, когда полегче со временем будет. Пока эмпирически вероятность от 15-20% заставит меня/семью побеспокоиться и пойти на реальный осмотр побыстрее.

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

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

Подписаться на комментарии