Время прочтения: 6 мин.

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

Этап 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, где можно протестировать работу тестовой выборки.

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

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

item {
  id: 1
  name: ‘example_1’
}
item {
  id: 2
  name: ‘example_2’
}

Копирую 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 train-ing/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%.

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

  1. Установлено необходимо программное обеспечение
  2. Установлен репозиторий
  3. Загружен и установлен датасет
  4. Создана и установлена среда
  5. Установлены необходимые пакеты
  6. Произведена разметка изображений обучающего датасета
  7. Произведена настройка исполняющих файлов
  8. Обучение и тестирование нейронной сети