НЕЙРОННАЯ СЕТЬ ДЛЯ РАСПОЗНАВАНИЯ ОБРАЗОВ С TENSORFLOW: КАК С НЕЙ РАБОТАТЬ

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

Цель статьи — привлечь этот инструмент для распознавания боковых зубов (маляров) на рентгеновских снимках с использованием нейронной сети. Для того чтобы этого достичь, нужно выполнить несколько важных этапов, о чём и поговорим под катом.

bd6f747433b9518e0780fd0c82089216.png

Что это за этапы?

Это  процесс настройки, обучения, тестирования нейронной сети с использованием TensorFlow. Сразу и приступим.

f996fa4bedc7847daff07b8fca8a7d09.jpg

Этап 1. Установка программного обеспечения

Сразу понадобится установить Anaconda. Если вы собираетесь обучать нейронную сеть на GPU, то обязательно нужно установить cuDNN и CUDA — программно-аппаратный инструментарий, увеличивающий вычислительные мощности.

Этап 2. Создание каталога проекта TensorFlow

Для создания каталога проекта выполняем следующие шаги:

  1. Создаём папку в удобном месте (рекомендовано в C:), называем «tensorflow1». Каталог будет являться главным и включать в себя все модели и структуру.

  2. Загружаем и устанавливаем репозиторий TensowFlow в директорию …\tensorflow1\models. В случае возникновения ошибок совместимости рекомендовано понизить версию TensorFlow.

  3. Загружаем и устанавливаем модель Faster-RCNN-Inception в …\tensorflow1\models\research\object_detection. 

  4. Загружаем следующую пачку каталогов в …\tensorflow1\models\research\object_detection. Данный репозиторий содержит тестовую обучающую выборку и основные функции для обучающих баз.

  5. Если нужна собственная обучающая выборка, то необходимо удалить все файлы из …\ 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, где можно протестировать работу тестовой выборки.

ada6a94d75d1bb7593685a461b605b31.png

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

В качестве обучающей выборки было использовано около 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. Открываем файл в текстовом редакторе и выполняем следующие действия:

  1. Строка 9. Изменяем num_classes на количество объектов обучения.

  2. Строка 106. Изменяем fine_tune_checkpoint на C:/tensorflow1/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01–28/model.ckpt» или другой путь, в который вы установили tensorflow.

  3. Строки 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».

  4. Строка 130. Подставляем в num_examples в …\images\test количество изображений.

  5. Строки 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%.

02b024aae659f68ada616fff05fe33e9.png30def477a6114786de281435a730b7bd.png

Что в итоге?

В ходе работы удалось научить нейросеть распознавать боковые зубы (маляры) на рентгеновских снимках. Для реализации цели были решены следующие задачи:

  1. Установлено необходимое программное обеспечение.

  2. Установлен репозиторий.

  3. Загружен и установлен датасет.

  4. Создана и установлена среда.

  5. Установлены необходимые пакеты.

  6. Произведена разметка изображений обучающего датасета.

  7. Произведена настройка исполняющих файлов.

  8. Обучена и протестирована нейронная сеть.

И да, если у вас есть опыт работы с TensorFlow, появились вопросы или дополнения к статье — всё это можно обсудить в комментариях.

© Habrahabr.ru