Распознавание образов в домашних условиях
Вероятно вы уже встречались где-нибудь в Twitter или LinkedIn с мемом, где COVID-19 отмечен ответственным за проведенную цифровизацию в компании.
Цифровизация, как в случае с COVID-19 по большей части, может заключаться в переводе персонала и процессов из офлайна в онлайн. Однако если с почтой, браузером или приложением наподобие Zoom все знакомы, то о машинном обучении, нейронных сетях многие, возможно, знают только понаслышке. Потому предлагаю познакомиться, наверное, с наиболее перспективным направлением цифровизации - применением искусственного интеллекта.
Создание несложных решений в этой области сегодня доступно практически каждому. Рецепт в общем-то простой: необходимо взять какую-нибудь готовую реализацию архитектуры типа Mask R-CNN, добавить чуточку кода и запустить это все где-нибудь вроде Google Colab.
Так, например, с помощью всего нескольких строк кода можно наложить эффект черно-белого фона на фото с воздушными шарами…
… или найти дефекты на рентгенограмме сварного соедиения
Далее, собственно говоря, я постараюсь объяснить как своими руками повторить, а может быть и даже создать собственное решение какой-нибудь задачи в области компьютерного зрения.
Приведенные пошаговые инструкции будут интересны тем, кто хотел бы вживую и с мининимальными усилиями создать практическую реализацию работы нейронных сетей.
В первой части представлена инструкция по опробованию готовой модели для замены фона с цветного на черно-белый на фотографиях с воздушными шарами. Во второй - обучению и опробованию модели по распознанию дефектов на рентгенограммах сварных соединений.
Часть 1. Обрабатываем фотографии с воздушными шарами
Начинаем с самой простой задачи - запуска обученной и готовой к использованию модели.
Первым шагом в Google Colab создаем новый блокнот.
Collaboratory, или сокращенно «Collab», позволяет вам писать и выполнять Python в вашем браузере. В «Collab» из коробки настроена среда для запуска кода на Python, предоставляется бесплатный доступ к одному графическому ускорителю типа NVidia Tesla K80
В используемой нами модели применяется TensorFlow 1.x, поэтому во избежание ошибок исполнения кода в самой первой строке указываем нужную версию.
Новые выполняющие код ячейки можно создавать сочетанием клавишCtrl
+A
(перед текущей)/Ctrl + В
(после текущей), нажатием кнопки под панелью меню+ Code
, через менюInsert
-Code Cell
# run this cell once again in case of error "AttributeError: module 'tensorflow' has no attribute 'placeholder'" %tensorflow_version 1.x
Код построчно выполняетя нажатием сочетания клавишCtrl
+Enter
, весь код целиком - сочетанием клавишCtrl
+F9
Далее указываем URL-адрес для изображения с воздушными шарами. Вы можете с легкостью заменить его на свой.
# to use custom image with balloons change the link below balloon_URL = 'https://live.staticflickr.com/2677/4404039169_042fa233d1_b.jpg'
Клонируем (скачиваем на виртуальную машину) репозитарий модели Mask R-CNN.
# download Mask RCNN model !git clone https://github.com/matterport/Mask_RCNN.git
Выбираем директорию, в которую выполнилось клонирование нашего экземпляра модели.
# choose MaskRCNN folder %cd /content/Mask_RCNN/
В выбранную директорию скачиваем обученную под распознавание воздушных шаров модель.
# download Mask RCNN Balloon model weigths !pip install wget import wget wget.download('https://github.com/matterport/Mask_RCNN/releases/download/v2.1/mask_rcnn_balloon.h5')
Выбираем директорию, в которой расположен файл balloon.py c кодом для нашей модели.
# choose directory with balloon.py file # run this cell once again in case of error "python3: can't open file 'balloon.py': [Errno 2] No such file or directory" %cd /content/Mask_RCNN/samples/balloon
Далее собственно запускаем команду, которая из файла ballon.py выполняет функцию Splash, используя при этом веса обученной модели из файл mask_rcnn_balloon.h5, и обрабатывает изображение по указанной нами ссылке.
%%capture cap_out !python balloon.py splash --weights=/content/Mask_RCNN/mask_rcnn_balloon.h5 --image=$balloon_URL
После этого, с помощью кода, указанного ниже мы можем сравнить оригинальное и обработанное изображения.
# plot original and modified images %pylab inline from PIL import Image import matplotlib.pyplot as plt import matplotlib.image as mpimg import requests img_orig = Image.open(requests.get(balloon_URL, stream=True).raw) img_splash=mpimg.imread(cap_out.stdout.split()[-1]) fig = plt.figure(figsize=(20,10)) ax1 = fig.add_subplot(1,2,1) ax1.set_title('Original') ax1.imshow(img_orig) ax2 = fig.add_subplot(1,2,2) ax2.set_title('Modified') ax2.imshow(img_splash) plt.show()
Ссылки
Описание архитектуры модели Mask RCNN и подобный разбор представленного решения представлены в статье Splash of Color: Instance Segmentation with Mask R-CNN and TensorFlow. Крайне рекомендую ознакомиться.
Репозитарий Mask RCNN на GitHub https://github.com/matterport/Mask_RCNN.
Блокнот на Google Disk https://colab.research.google.com/drive/1xPkv1V-eIcuBRVn4cL4BmzL49R5IdiJo
Часть 2. Ищем дефекты на рентгенограммах сварных соединений
Реализации данного решения является форком Mask RCNN от Matterport, использованной в предыдущей задаче.
В отличие от предыдущего решения в этом мы будем выполнять обучение. На пользование Google Colab существуют ограничения. Рабочая сессия на виртуальной машине с графическим ускорителем ограничена максимально 12 ч ее использования, после чего происходит сброс всех данных. Обучение данной модели требует в общей сложности около 26 часов машинного времени. Поэтому нам потребуется создание контрольных точек сheckpoint (предусмотрено по-умолчанию) и лучше всего для их хранения подходит Google Drive, который с легкостью подключается в Colab.
Google Drive предоставляет только 15 GiB бесплатного дискового пространства, общий объем места, занимаемого контрольными точками на 160 эпохах обучения может составить 38 GiB. По этой причине необходимо по мере заполнения диска освобождать место удаляя предыдущие контрольные точки (кроме последней), либо увеличивать лимит хранилища оформив подписку на Google One (эти точки могут понадобиться для последующей визуализации данных в Tensorboard).
Google Drive
Предварительно добавим ярлык на папку с набором данных себе на Диск. Это позволит нам не скачивать этот датасет и не занимать лишнее дисковое пространство.
Colab
Итак, как и в прошлый раз нам потребуется создать новый блокнот.
Блокнот создается на виртуальной машине, вычисления по-умолчанию выполняются на CPU. В случае необходимости обучения модели следует выбрать ускоритель на GPU или на TPU (Google заявляет об ускорении вычислений на TPU по сравнению с GPU, однако для этого требуется, чтобы модель была подстроена под TPU).
Выбираем тип среды выполнения (Runtime - Change runtime type).
В выпадающем списке выбираем графический ускоритель GPU.
Подключаемся к виртуальной машине с помощью кнопки Connect
.
В используемой нами модели применяется TensorFlow 1.x, поэтому во избежание ошибок исполнения кода в самой первой строке указываем нужную версию.
#run this cell once again in case of error "AttributeError: module 'tensorflow' has no attribute 'placeholder'" %tensorflow_version 1.x
В данном случае требуется настройка окружения, необходимо указать версии библиотек.
Информация о версиях библиотек взята из файла environment.yml.
Данные файл используется для настройки среды в Anaconda.
!pip install scipy==1.1.0 !pip install opencv-python==4.1.0.25 !pip install tensorflow-gpu==1.5 !pip install keras==2.1.3
Подключаем Google Drive. Потребуется пройти по появившейся ссылке для получения кода авторизации.
from google.colab import drive drive.mount('/content/gdrive', force_remount=True)
Выбираем подключенный диск.
%cd gdrive/My\ Drive
Клонируем (скачиваем на виртуальную машину) репозитарий модели Metal defect detection.
!git clone https://github.com/maxkferg/metal-defect-detection.git
Выбираем директорию, в которую выполнилось клонирование нашего экземпляра модели.
# choose MaskRCNN folder %cd /content/gdrive/My\ Drive/metal-defect-detection
Так как в модели применяется Transfer Learning необходимо загрузить предварительно обученную модель mask_rcnn_coco.h5.
# download COCO model weigths !pip install wget import wget wget.download('https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5')
Запускаем обучение.
!python gdxray.py train \ --dataset=/content/gdrive/My\ Drive/GDXray/GDXray \ --series=All \ --model=mask_rcnn_coco.h5 \ --logs=logs/gdxray \ --download=True
Как уже ранее указал, процесс обучения занимает длительное время, и может требоваться перезапуск в случае сброса сессии. На этот случай следует запустить ячейку с таким кодом:
# run this cell after runtime restarting %tensorflow_version 1.x !pip install scipy==1.1.0 !pip install opencv-python==4.1.0.25 !pip install tensorflow-gpu==1.5 !pip install keras==2.1.3 from google.colab import drive drive.mount('/content/gdrive', force_remount=True) %cd /content/gdrive/My\ Drive/metal-defect-detection !python gdxray.py train \ --dataset=/content/gdrive/My\ Drive/GDXray/GDXray \ --series=All \ --model=last \ --logs=logs/gdxray \ --download=False
После 160 эпох обучение завершается. Можем приступить к рассмотрению результатов. Для визуализации работы модели в рабочей папке работает имеется блокнот inspect_model.ipynb.
По ссылке разместил немного модифицированный файл. Добавил код для возможности работы с Google Drive и блок Image for URL
для возможности загрузки снимков через URL.
Результаты распознования дефектов
Ссылки
Репозитарий модели на GitHub https://github.com/maxkferg/metal-defect-detection
Блокнот на Google Disk https://colab.research.google.com/drive/1vYqUyDEgUX0Mbd3m02IuzPFdVIPbX7YV
Если не планируете выполнять обучение модели, то по ссылке можно скачать одну из контрольных точек. Она использована в блокноте inspect_model_weld.ipynb,
после копирования файла контрольной точки на диск установите соответствующий путь к файлу в переменной LOG_DIR.
В качестве заключения
С каждым днем увеличивается производительность графических процессоров, улучшаются алгоритмы, упрощается доступ к технологиям. Все это расширяет круг пользователей и области применения нейросетей.
В качестве примеров я представил задачи обработки фотографий и обнаружения дефектов на снимках - надо признать мало пригодные в быту, но, конечно, существуют и более практичные вещи: поиск свободных парковочных мест возле дома или распознавание лиц людей, подходящих к двери дома. Попробуйте и вы, ведь применение нейросетей и использование мощных графически ускорителях сегодня доступно каждому.