Как распознать образы с помощью TensorFlow?

Привет, VC! Хочу поделиться опытом о том, как можно начать использовать 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, где можно протестировать работу тестовой выборки.

Как распознать образы с помощью TensorFlow?

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

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

Как распознать образы с помощью TensorFlow?
Как распознать образы с помощью TensorFlow?

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

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

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

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

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

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

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

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

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

33
2 комментария

Какую версию python использовали?

Автор

Была использована версия 3.8

1