Как мы бактерии измеряли
Всем привет! Мы компания Nord Clan, занимаемся разработкой ПО на основе технологий машинного зрения.
В этой статье мы хотим рассказать вам об одном интересном продукте, который мы разрабатывали для иностранного клиента, работающего в области лабораторной медицины.
Чтобы лучше прочувствовать крутость продукта, давайте окунемся в мир конечного пользователя. Вы - лаборант, который занимается определением антибиотикорезистентности, то есть измеряете динамику роста конкретного микроорганизма в присутствии стандартной концентрации антибиотиков в модельных условиях.
Для таких исследований используются чашка Петри с питательной средой внутри, суспензия микроорганизмов и бумажные диски, пропитанные концентрацией антибиотика. Чашка с дисками помещается в инкубатор примерно на сутки. После этого производятся замеры диаметров окружностей, который образуются (или нет) вокруг диска с антибиотиком.
Благодаря таким замерам делается вывод об эффективности антибиотика (чем больше диаметр окружности) относительно микроорганизма.
Таких чашек Петри может быть до 100 штук в день для одного лаборанта!
Итак, в начале нашей разработки мы имеем следующий показатель эффективности: измерение диаметров и запись показателей занимает около 2 минут. Посмотрим, как он изменится с помощью нашего продукта.
Приступаем к разработке
Срок разработки по запросу клиента должен был составить два месяца. Поэтому мы составили список фич, которые должны войти в MVP версию:
- распознавание диаметра окружности
- распознавание названия антибиотика по тексту на таблетке
- калибровка изображения для точности измерений до 1 мм
- распознавание при съемке с ракурсов от 90° до 80°
Разработка алгоритмов распознавания была направлена на достижение этих целей.
Мы начали с того, что стали изучать существующие технологии.
Задача 1. Распознавание окружности
Для начала мы стали анализировать готовые технологии. Мы моделировали распознавание кругов при помощи адаптивной бинаризации и выравнивания яркости изображения (т.е. преобразование в черно-белый вариант), преобразования Хафа (Hough Circle). Эти технологии не показали высоких результатов, т.к. круги низкоконтрастные и отделять пиксели круга от фона и различных шумов (тени, блики, посторонние объекты) сохраняя точность измерений практически невозможно. Нами также рассматривался вариант использования нейронной сети для обработки изображений. Но в данном случае, использование геометрических методов должно обеспечить большую точность поскольку форма объектов заранее известна.
После серии экспериментов мы разработали собственный метод определения окружностей. В нашем случае в центре круга находилась высококонтрастная таблетка, которую легко выделить, применяя технологию Blob Detector. Затем окружности выделялись с помощью анализа интенсивности градиентов изображения вокруг ее центра. Граница зоны задержки роста бактерии в области действия антибиотика находилась методом относительной высоты вершин (Topographic prominence).
Вокруг центра алгоритм измеряет среднюю яркость изображения в концентрических кольцах толщиной 0,3 мм. В такой толщине кольца умещается несколько пикселей изображения. Далее с помощью полученных значений строится график интенсивности в зависимости от расстояния от центра круга.
То есть, как только построенный круг соприкасается с краем таблетки, график подскакивает вверх, потому что край таблетки ярко выражен на бледном фоне круга. Далее отслеживается второй скачок графика: как раз в том месте, где область действия антибиотика (конец окружности) прекращается.
Этот метод так же хорошо справлялся с распознаванием окружностей с искривленной круглой формой (см. изображение выше: на нем видно, что две окружности слились)
Второй скачок для таких кейсов размытый, волнообразный. В таких случаях окружность достраивается автоматически.
Разработка алгоритма и настройка параметров производилась на Python с использованием библиотеки Streamlit для упрощения визуализации и корректировки параметров. Но в последствии проверка качества распознавания показала, что время от загрузки изображения до выдачи результатов занимает от 5 до 10 секунд.
В итоговой версии алгоритмы были переписаны на C++ для увеличения скорости обработки и возможности использования под Андроид (React Native) c прослойкой на Java .
Сервер на С++ выдавал результаты значительно быстрее - 1 секунда.
Задача 2. Распознавание названия антибиотика по тексту на таблетке
Размеры текста на дисках с антибиотиками варьируются от 1,5 мм до 3 мм. В реальных условиях съемки разрешающих способностей камер смартфонов бывает недостаточно для однозначного распознавания. Дополнительным челленджем было хаотичное расположение таблеток, т.е. текст на них располагался и вверх ногами, и под разными углами.
Чтобы обеспечить точность распознавания мы сделали следующее:
- Находим таблетку методом Blob Detector
- Выравниваем цвет фона средним значением, чтобы уменьшить влияние шумов
- Определяем область размещения текста
- Выравниваем текст по горизонтали. Для этого мы определяем направление текста методом анализа интенсивности: идея в том, что буквы на таблетках сверху для большинства случаев больше, чем цифры.
- Распознаем текст: мы использовали механизм распознавания текста Tesseract
Далее выполняется поиск распознанного значения кода антибиотика в таблице, которая содержит все наименования антибиотиков, используемых в лаборатории.
Задача 3. Калибровка изображения для точности измерений до 1 мм и распознавание при съемке с ракурсов от 90° до 80°
С этими двумя условиями нам помог разобраться всего 1 лист бумаги.
Чтобы рассчитать диаметр окружностей нам нужна константа. Эту роль у нас выполняла подложка.
Так как мы начали с MVP версии, мы оговорили с клиентом, что на этом этапе будут доступны для распознавания стандартные чашки Петри с диаметром 90 мм. Поэтому наша подложка имела заданный размер: 10 х 10 см. Размеры подложки определены, значит теперь возможно распознать точный диаметр окружностей.
Известные входные параметры сделали также возможным нормализацию изображения при разных углах съемки.
Помимо этого подложка выполняет и другую важную функцию. Зачастую на чашках имеются посторонние надписи. Фон подложки помогает устранить из видимости посторонние шумы.
Мобильное приложение
Помните, в начале статьи мы зафиксировали, что вручную измерение диаметров и запись показателей занимает около 2 минут? Давайте посмотрим, как автоматизация улучшила эффективность.
После запуска приложения открывается камера. Пользователь фотографирует чашку Петри и буквально через секунду открывается экран с результатами: на фотографии выделены окружности с указанием диаметра и анаграммы антибиотиков.
Пользователь вводит номер образца чашки Петри, род и вид питательной среды. На основании введенных данных о среде, приложение автоматически определяет эффективность антибиотика для микроорганизма представленного образца: устойчив к антибиотику (окружности вокруг таблетки нет или ее диаметр очень мал), чувствительный к антибиотику (диаметр окружности приближен к максимальным значениям), или промежуточный результат (по диаметру окружности сложно делать однозначные выводы).
Таким образом всего за один один клик за секунды собирается вся информация, которая передается в нужном формате в любую интегрируемую систему.
На видео вы может подробнее ознакомится с работой мобильного приложения:
Добрый день! Измерения программой как-то зависят от диаметра самой чашки? Что является эталоном? Если будет новый поставщик чашек с размерами, которые будут отличаться от текущих, - не повлияет ли этот факт на размерность получаемых данных?
Добрый день!
Размер чашки в данном случае не имеет существенного значения. В нашем алгоритме мы можем задать различные геометрические параметры: например, максимальный размер кругов (для оптимизации) или размер подложки.
Ограничения заключаются только в том, что при увеличении размера наблюдаемой области мелкие детали сложнее обнаружить, поскольку их размер в пикселях становится меньше, что особенно существенно для надписей на таблетках.
Если требуется распознавать тип таблетки в таком случае, то может потребоваться установка отдельной камеры или использование смартфона с качественной камерой