Рассказываем, как Технологика и стартап цифровой медицины запустили мобильное приложение, которое при помощи ИИ анализирует цвета медицинских тест-полосок и трактует результаты показателей мочи. Идея и челлендж проекта Как всё устроено внутри Челендж #1: гистограмма vs. регрессия Решение #1 Челендж #2: неоновый сложный Решение #2 Челендж #3: поговорим о личных границах Решение #3 Челендж #4: в свете софитов Решение #4 Планы на будущее Результаты  Уже давно существуют домашние тесты мочи в виде тест-полосок. Индикаторные полоски предназначены для качественного и полуколичественного определения ряда показателей в моче (таких как глюкоза, белок, pH и другие). Результат определяется “на глазок” — человек сам должен сравнить тест-полоску с эталонными цветами. Идея использовать ИИ в процессе определения цвета возникла у одного из стартапов, с которым мы работали. Решение может может помочь человеку различить близкие друг другу цвета и оттенки, более того, такой ИИ-ассистент будет незаменим для пациентов, испытывающих затруднения в определении того или иного цвета. Однако при анализе фотографий нейросетью следует учитывать определенный нюанс — цвет тестовых полосок на снимках может варьироваться в зависимости от условий освещения и спецификаций камеры, включая настройки и постобработку. Даже незначительное изменение оттенков в реагентных зонах способно серьезно искажать результаты анализа. Эту задачу нам и было необходимо решить в первую очередь. Поскольку задача заключается в идентификации цветов, необходимо провести сравнение стандартного образца с цветами, полученными в ходе анализа. Правильное сравнение возможно только после калибровки цветов. Как мы уже отмечали, оттенки на снимке могут изменяться из-за различных факторов, включая освещение, объекты, находящиеся рядом в кадре, а также заводские и пользовательские настройки камеры. Мы разбили проект на ключевые этапы; одним из которых была калибровка цветов, требующий предварительной подготовки, также были использованы ArUco-маркеры: Обнаружение маркеров ArUco на входном изображении. Обрезка изображения и коррекция перспективы по обнаруженным маркерам aruco. Цветовая калибровка изображения. Поиск контуров квадратов для каждого реагента. Сопоставление цвета в квадрате с возможными цветами для данного реагента. Тестирование и исправление ошибок. Наиболее сложной подзадачей оказалась калибровка изображения по заданным калибровочным цветам. Типичным решением подобных задач является нахождения расстояния между двумя цветами. Мы подобрали несколько методов калибровки цветов и создали для этого типовые синтетические тесты. Зная реальные значения реагентов с тестовых изображений, мы можем сравнить их со значениями, выдаваемыми алгоритмом, и рассчитать точность. Мы решили протестировать 2 метода сравнения цветов: Калибровка по совпадению гистограмм — это подгонка гистограммы рассматриваемого изображения к гистограмме эталонного изображения. В нашем случае эталоном является калибровочная карта. Калибровка с помощью регрессии. Гистограмма представляет собой распределение пикселей с различной яркостью для каждого из каналов RGB. Таким образом, подгоняя гистограмму под референсную, мы делаем цвета более похожими на референсные. Метод калибровки по совпадению гистограмм дал неудовлетворительные результаты. На рисунке ниже показано исходное изображение (слева) и сфотографированная карта после калибровки (справа). Видно, что светлые оттенки (цвета, выделенные красным) осветлены, в результате чего невозможно правильно определить соответствующие значения реагентов. Поэтому мы применили регрессию по методу наименьших квадратов (Partial least squares regression, PLS regression). Метод заключается в подгонке RGB-значений калибровочных цветов с фотографии к заданным RGB-значениям этих цветов. Другими словами, этот метод находит, как преобразовать изображение, чтобы RGB-значения калибровочных цветов соответствовали заданным значениям. Результат калибровки этим методом дал удовлетворительные результаты — все значения реагентов были определены правильно, точность определения составила 90%. Мы также попробовали заменить PLS-регрессию интерполяцией с помощью кубического сплайна, который также подгоняет RGB-значения калибровочных цветов из фотографии с заданными значениями. Однако результат оказался хуже, поэтому мы решили вернуться к PLS-регрессии. При анализе калибровки изображений методом PLS-регрессии выяснилось, что камеры мобильных телефонов часто плохо передают некоторые оттенки цветов. К проблемным цветам относятся неоновые оттенки (голубой, ярко-зеленый, светло-зеленый, ярко-розовый) и светло-розовые оттенки для кальция. Кроме того, эти цвета плохо калибруются, так как на калибровочной карте нет аналогичных оттенков. После проведенного анализа было принято решение о замене калибровочной карты: Во-первых, мы заменили цвета, которые не встречаются среди наших цветов реагентов, на цвета, значения которых сложно определить. Во-вторых, мы решили добавить третий ряд, в котором разместили цвета некоторых реагентов: Белок, Микроальбумин, Кальций. Точность определения цветов при использовании новой калибровочной карты составила 97% на синтетических данных.   К слову о синтетических данных, так как на этапе разработки решения не было достаточного количества реальных примеров тестов, мы самостоятельно подготовили некоторое количество синтетических данных и распечатали их для обучения модели. Когда синтетические тесты оказались позади, мы приступили к тестам на реальных данных. Здесь встретились следующие особенности: Реальные тест-полоски имеют объем, текстуру и иногда блики. В то время как синтетические тесты - нет. Синтетические данные напечатаны на черном фоне, а у реальных тест-полосок квадраты находятся на белом фоне, поэтому контраст между некоторыми цветными светлыми квадратами и фоном очень низкий. В связи с этими особенностями потребовалось доработать часть модели, отвечающую за поиск, распознавание, либо определение границ цветных квадратов на тестовой полоске. На синтетических данных мы осуществляли поиск контуров (через библиотеку OpenCV). Метод заключается в том, что мы преобразуем изображение в градации серого. Затем применяем бинаризацию к полутоновому изображению: все оттенки ниже порогового значения становятся черными, все оттенки выше этого значения — белыми. И после — находим контуры объектов. Однако этот метод не дает положительного результата на тест-полоске, поскольку, как уже отмечалось, поверхность цветного квадрата неровная, а контраст между квадратами и пробелами недостаточен. Было решено опробовать другие методы: Заранее фиксировали координаты квадратов — метод не подошел, поскольку фотография может иметь определенную перспективу, а значит, размеры квадратов и расстояний между ними искажены. Определяли цветные квадраты по гистограмме насыщенности — также не подошёл, поскольку некоторые светлые квадраты гораздо светлее, чем промежутки между ними.Это не позволяет алгоритму правильно определить расстояния. Кроме того, видны тени от квадратов. Это также затрудняет корректное определение расстояний. Определяли цветные квадратов с помощью дисперсии — в этом методе перебираются разные значения расстояния между квадратами и размерами квадратов. Для каждой пары значений находится дисперсия. Если суммарная (по всем квадратам) дисперсия маленькая, значит перепад цвета внутри квадратов небольшой, то есть мы нашли оптимальные положения квадратов. Дисперсия показывала, насколько сильно RGB-значения цветов в полученном квадрате отличаются от среднего RGB-значения в этом квадрате. Данный метод мы и выбрали для определения рамок реагентных квадратов. На изображениях без вспышки алгоритм показал точность 75%. На изображениях со вспышкой точность алгоритма составила 85-90%. Наиболее часто ошибочно определяемыми реагентами являются креатинин и показатель удельного веса. Чтобы повысить точность результатов и снять ошибки, вызванные неточной калибровкой цвета из-за присутствия теней, падающих на калибровочный фон, мы предупреждаем пользователя перед съемкой, что стоит включить вспышку для улучшения качества фотографии. Для того чтобы сравнить цвета с тест-полоски с эталонными, мы переводили их RGB-значения в LAB-значения, и затем сравнивали между собой LAB-значения. LAB — это цветовое пространство, в котором изменение цвета более линейно с точки зрения человеческого восприятия по сравнению с RGB-цветами. То есть, одно и то же изменение значений цвета в разных областях цветового пространства вызывает одинаковое ощущение изменения цвета для человеческого глаза. Анализируя результаты на изображениях со вспышкой, мы заметили, что значения некоторых реагентов плохо определяются обеими метриками: и LAB, и RGB. Например, таков креатинин. Мы попробовали использовать яркость в качестве метрики для креатинина и оказалось, что яркость лучше определяет значение для этого реагента во многих тестах. Таким образом, идея совершенствования алгоритма заключается в выборе оптимальной метрики для каждого реагента: RGB, HSV, HSL (или просто третьей составляющей яркости), LAB, CMYK. А для такой настройки нашей модели компьютерного зрения требуется большой объем данных: различные случаи со всем многообразием возможных цветов для каждого реагента. К сожалению, такие данные тяжело достать. Поскольку редко встречаются пациенты, у которых были бы сильные отклонения от нормальных значений, причем по всем показателям. В основном у всех людей значения в пределах, либо рядом с нормой. Поэтому нужно ждать какое-то время, чтобы у заказчика набралось достаточно таких "сложных" случаев.    Разработанная нами модель была успешно внедрена в мобильное приложение. Приложение сейчас тестируется клиентом на ограниченной аудитории. Мы добились достаточно высокой точности распознавания в 85-90%, учитывая все сложности, с которыми столкнулись в процессе работы над проектом. Теперь у наших ai-специалистов появилась более глубокая экспертиза в области распознавания цветов. И особенно приятно было поработать на таком прикладном медицинском проекте, как анализ тест-полосок. Спасибо за внимание! Оставайтесь на связи, впереди еще много интересных кейсов из области машинлёнинга и искусственного интеллекта.    Разрабатываем цифровые сервисы для бизнеса