April 22, 2020

Распознавание образов в домашних условиях

Питер Брейгель (Младший). «Деревенский алхимик»

Вероятно вы уже встречались где-нибудь в 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.

В качестве заключения

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

В качестве примеров я представил задачи обработки фотографий и обнаружения дефектов на снимках - надо признать мало пригодные в быту, но, конечно, существуют и более практичные вещи: поиск свободных парковочных мест возле дома или распознавание лиц людей, подходящих к двери дома. Попробуйте и вы, ведь применение нейросетей и использование мощных графически ускорителях сегодня доступно каждому.