Время прочтения: 6 мин.
В посте хочу поделиться опытом о том, как можно начать использовать TensorFlow в целях распознавания образов. Целью работы является распознавание боковых зубов (маляров) на рентгеновских снимках с использованием нейронной сети. Для реализации цели необходимо выполнить несколько следующих этапов. Данные этапы составляют процесс настройки, обучения, тестирования нейронной сети с использованием 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. Открываю файл в текстовом редакторе и прописываю элементы в подобном формате:
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. Открываю файл в текстовом редакторе и выполняю следующие действия:
- Строка 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 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%.
Таким образом в ходе проделанной работы была реализована цель, а точнее распознаны боковые зубы (маляры) на рентгеновских снимках с использованием нейронной сети. Для реализации цели были решены следующие задачи:
- Установлено необходимо программное обеспечение
- Установлен репозиторий
- Загружен и установлен датасет
- Создана и установлена среда
- Установлены необходимые пакеты
- Произведена разметка изображений обучающего датасета
- Произведена настройка исполняющих файлов
- Обучение и тестирование нейронной сети