Привет, Хабр! В сегодняшней статье хотим поделиться опытом, как можно начать использовать TensorFlow в целях распознавания образов. Напомним, что TensorFlow — открытая программная библиотека для машинного обучения, разработанная компанией Google для решения задач построения и тренировки нейронной сети с целью автоматического нахождения и классификации образов, достигающая качества человеческого восприятия.
Цель статьи — привлечь этот инструмент для распознавания боковых зубов (маляров) на рентгеновских снимках с использованием нейронной сети. Для того чтобы этого достичь, нужно выполнить несколько важных этапов, о чём и поговорим под катом.
Что это за этапы?
Это процесс настройки, обучения, тестирования нейронной сети с использованием TensorFlow. Сразу и приступим.
Этап 1. Установка программного обеспечения
Сразу понадобится установить Anaconda. Если вы собираетесь обучать нейронную сеть на GPU, то обязательно нужно установить cuDNN и CUDA — программно-аппаратный инструментарий, увеличивающий вычислительные мощности.
Этап 2. Создание каталога проекта TensorFlow
Для создания каталога проекта выполняем следующие шаги:
Создаём папку в удобном месте (рекомендовано в C:), называем «tensorflow1». Каталог будет являться главным и включать в себя все модели и структуру.
Загружаем и устанавливаем репозиторий TensowFlow в директорию ..\tensorflow1\models. В случае возникновения ошибок совместимости рекомендовано понизить версию TensorFlow.
Загружаем и устанавливаем модель Faster-RCNN-Inception в ..\tensorflow1\models\research\object_detection.
Загружаем следующую пачку каталогов в ..\tensorflow1\models\research\object_detection. Данный репозиторий содержит тестовую обучающую выборку и основные функции для обучающих баз.
Если нужна собственная обучающая выборка, то необходимо удалить все файлы из ..\ object_detection\images\train, ..\ object_detection\images\test, ..\ object_detection\training, ..\ object_detection\inference_graph и «test_labels.csv», «train_labels.csv» в ..\ object_detection\images.
Этап 3. Создание среды и установка библиотек
Когда структура создана, необходимо приступить к созданию виртуальной среды. Запускаем Anaconda и создаём venv с помощью следующих команд:
conda create -n tensorflow1 pip python
activate tensorflow1
python -m pip install --upgrade pip
pip install --ignore-installed --upgrade tensorflow
Установка библиотек:
conda install -c anaconda protobuf
pip install pillow
pip install lxml
pip install Cython
pip install contextlib2
pip install jupyter
pip install matplotlib
pip install pandas
pip install opencv-python
Установка переменной среды:
set PYTHONPATH=C:\tensorflow1\models; \
C:\tensorflow1\models\research;C:\tensorflow1\models\research\slim
В каталоге ..\models\research создаём файл name_pb2.py, состоящий из каждого файла name.proto в папке \object_detection\protos. Описание данного процесса производится с помощью следующей команды:
protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto .\object_detection\protos\keypoint_box_coder.proto .\object_detection\protos\multiscale_anchor_generator.proto .\object_detection\protos\graph_rewriter.proto .\object_detection\protos\calibration.proto .\object_detection\protos\flexible_grid_anchor_generator.proto
Этап 4. Формируем исполняющие файлы
Python setup.py build
Python setup.py install
jupyter notebook object_detection_tutorial.ipynb
В результате открывается окно Jupiter Notebook, где можно протестировать работу тестовой выборки.
Если весь код работает без ошибок, то результат выглядит так, как на скриншоте. В противном случае результат в виде картинки не будет выведен. Далее необходимо сформировать собственный датасет и обучить нейронную сеть.
В качестве обучающей выборки было использовано около 500 обучающих и 80 тестовых записей данных, основанных на медицинских изображениях, полученных на микроКТ. В приведённом примере весь датасет был создан вручную в виде графических файлов. В случае если нет времени на детальный подбор конкретных файлов, стоит использовать уже готовые сформированные датасеты. Весь материал распределяем по папкам test и train в каталоге ..\research\object_detection\images.
Для разметки тестовых записей из датасета используем labelImg. Для разметки можно применять любой другой альтернативный софт. Для запуска утилиты labelImg используются следующие команды:
conda install pyqt=5
conda install -c anaconda lxml
pyrcc5 -o libs/resources.py resources.qrc
python labelImg.py
В ходе этого этапа в директории с файлами обучения для каждого отдельного файла картинки формируется xml-файл с обозначениями координат выбранной области.
Этап 5. Обучение нейронной сети
Ну а теперь нужно сформировать файлы со свойствами объектов. Данная команда создаст файлы train_labels.csv и test_labels.csv в папке ..\object_detection\images:
Python xml_to_csv.py
В этом же корневом каталоге открываем generate_tfrecord.py в текстовом редакторе. Начиная со строки 31 заменяем текст меток на свои собственные. В коде эти метки заключены в одинарные кавычки, а их количество должно быть эквивалентно тем, на основе которых проводим обучение.
Генерируем файлы tfrecord для обучения с помощью следующих команд:
python generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record
python generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record
Формируем карту меток в каталоге ..\research\object_detection\training под названием labelmap.pbtxt. Открываем файл в текстовом редакторе и прописываем наши элементы в подобном формате:
Копируем faster_rcnn_inception_v2.config из каталога ..\research\object_detection\samples\configs в ..\research\object_detection\training. Открываем файл в текстовом редакторе и выполняем следующие действия:
Строка 9. Изменяем num_classes на количество объектов обучения.
Строка 106. Изменяем fine_tune_checkpoint на C:/tensorflow1/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01-28/model.ckpt” или другой путь, в который вы установили tensorflow.
Строки 123 и 125. Изменяем в train_input_reader input_path на “ C:/tensorflow1/models/research/object_detection/test.record”, label_map_path на “C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt”.
Строка 130. Подставляем в num_examples в ..\images\test количество изображений.
Строки 135 и 137. Изменяем в eval_input_reader input_path на “ C:/tensorflow1/models/research/object_detection/test.record”, label_map_path на “C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt”.
Если выполнение команд прошло без ошибок, приступаем к обучению:
python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2.config
После выполнения команды нейронная сеть начнёт обучаться на основании датасета и размеченных данных. В это время на экран консоли выводятся значения ошибок распознавания. Необходимое среднее арифметическое значение ошибок, к которому необходимо стремиться, должно быть минимальным. В соответствии с этим качество конечного распознавания будет лучше.
После обучения экспортируем граф вывода с помощью команды, где XXXX — значение в model.ckpt-XXXX:
Python export_inference_graph.py –input_type image_tensor –pipeline_config_path training/faster_rcnn_inception_v2.config –trained_checkpoint_prefix training/model.ckpt-XXXX –output_directory inference_graph
Этап 6. Проверка результата
Для тестирования полученных результатов перемещаем изображение, которое хотим протестировать, в ..\object_detection. Меняем переменную имени файла IMAGE_NAME, а также количество классов NUM_CLASSES в Object_detection_image.py.
Для тестирования на основе видеофайла или картинки с камеры нужно открыть соответствующий файл с именами в названиях video или webcam. Для запуска тестирования активируем среду tensorflow1 в Anaconda и вводим команду idle.
Ниже приведены результаты тестирования программы после обучения её на основе заданной выборки. Нейронная сеть была обучена на распознавание зубов, а именно маляров. В первом случае были предоставлены снимки 2 зубов и челюсти в полном размере. Результат распознавания показывает, что данные объекты были верно распознаны с вероятностью 99%.
Что в итоге?
В ходе работы удалось научить нейросеть распознавать боковые зубы (маляры) на рентгеновских снимках. Для реализации цели были решены следующие задачи:
Установлено необходимое программное обеспечение.
Установлен репозиторий.
Загружен и установлен датасет.
Создана и установлена среда.
Установлены необходимые пакеты.
Произведена разметка изображений обучающего датасета.
Произведена настройка исполняющих файлов.
Обучена и протестирована нейронная сеть.
И да, если у вас есть опыт работы с TensorFlow, появились вопросы или дополнения к статье — всё это можно обсудить в комментариях.
Комментарии (7)
DmitryLeonov
02.12.2022 15:11+3Маляры, моляры, какая в сущности разница, кого/что распознавать. С малярами получилось даже концептуальнее.
WondeRu
03.12.2022 02:18+1Чуть аккуратнее
Python setup.py build
Python setup.py install
Такие команды выдадут ошибку. Текст набирался, скорее всего, в Ворде, где автоматом первая буква меняется на заглавную
vassabi
03.12.2022 17:44а в винде норм сработает - она "немного умеет" в регистронезависимые имена
но да, лучше писать так чтобы срабатывало на бОльшем количестве платформ
vitaly_zyr
03.12.2022 09:25Вот поэтому не сдаю биометрию в Сбербанк! Сдашь, а потом окажется, что ты маляр, или водопроводчик даже...
raamid
Мой опыт общения с ИИ. Как-то обнаружил на ноге странное пятно. Решил сфоткать и поискать по картинкам в Google. В итоге выяснил что у меня "болезнь". Попробовал переснять и поискать еще раз. Выяснилось что у меня "лодыжка". После визита к живому врачу оказалось что у меня аллергическое высыпание, получил назначение попринимал лекарства, все прошло.
А еще родился анекдот. Через 20 лет, приходит человек в больницу, его обследовали и врач сообщает:
- Присядьте пожалуйста, у вас все очень серьезный случай. У вас обнаружена ЛОДЫЖКА!