Упростите компьютерное зрение с помощью Monk, библиотеки глубокого обучения с низким кодом и унифицированной оболочки для компьютерного зрения.

Введение :

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

Задача :

Использование ИИ-монаха для обнаружения объектов можно проиллюстрировать с помощью следующего примера. Задача - обнаружить объекты в датасете еды Октоберфеста. Ссылка на набор данных и описание набора данных можно найти ниже.

Набор данных: Набор данных Oktoberfest Food можно найти здесь [1]

  • dataset содержит наборы данных для поездов и тестов, включая метки
  • метки можно найти в files.txt (стиль OpenCV)
  • <filename> <number of objects> <classid1> <x1> <y1> <w1> <h1> <classid2> <x2> <y2> <w2> <h2> ...
  • models содержит наши предварительно обученные модели TensorFlow
  • video_data_zipped содержит необработанные видео, из которых был извлечен набор данных

Набор данных содержит 15 помеченных объектов с Октоберфеста. Классы следующие:

  1. Bier
  2. Bier Mass
  3. Weissbier
  4. Кола
  5. Вассер
  6. Карри-Вурст
  7. Weisswein
  8. A-Schorle
  9. Егермейстер
  10. Pommes
  11. Бургер
  12. Williamsbirne
  13. Альм-Брезе
  14. Brotzeitkorb
  15. Kaesespaetzl

Монах AI:

Monk object detection [2] - это сборник всех библиотек обнаружения объектов. Для каждого конвейера преследуется двоякая цель - сделать установку совместимой с несколькими ОС, версиями Cuda и версиями python, а во-вторых, сделать ее небольшим кодом со стандартизованным потоком вещей. Обнаружение объектов Monk позволяет пользователю решить проблему компьютерного зрения с помощью очень небольшого количества строк кода. В этом примере мы будем использовать конвейер gluonCV с Monk AI. Вот тетрадь colab [3] для кода в этом руководстве.

Настройка Monk:

# Importing libraries
import os
import sys
import pandas as pd
import cv2
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
# Cloning the Monk Object Detection repository
!git clone 'https://github.com/Tessellate-Imaging/Monk_Object_Detection.git'
# Installing requirements
! cd Monk_Object_Detection/1_gluoncv_finetune/installation && cat requirements_colab.txt | xargs -n 1 -L 1 pip install

При загрузке набора данных по вышеупомянутой ссылке структура каталогов набора данных должна выглядеть примерно так:

Parent_Directory (root) 
 | — — — — — -train (img_dir)
 |               |
 |               | — — — — — — — — — img1.jpg
 |               | — — — — — — — — — img2.jpg
 |               | — — — — — — — — — ………(and so on)
 |               | _ _ _ _ _ _ _ _ _ files.txt
 | _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _

Преобразование аннотаций в желаемый формат:

Аннотации должны быть преобразованы в формат PASCAL VOC. Пример желаемого формата выглядит следующим образом:

| Id ………………. | Этикетки ……………………………………. |

| img1.jpg ………. | x1 y1 x2 y2 label1 x1 y1 x2 y2 label2… .. |

Ярлыки: x1 y1 x2 y2 label

x1, y1 - верхний левый угол ограничивающей рамки

x2, y2 - нижний правый угол ограничивающей рамки

Код для этого приведен ниже:

f = open("/content/dataset/train/files.txt", "r")
ids = []
annotations = []
for x in f:
cnt = 2
line_content = x.split()
image_id = line_content[0]
no_of_annotations = line_content[1]
temp = []
for _ in range(int(no_of_annotations)):
image_annotation = line_content[cnt:cnt+5]
class_id = image_annotation[0]
x_center = image_annotation[1]
y_center = image_annotation[2]
width = image_annotation[3]
height = image_annotation[4]
x_min = int(x_center)
y_min = int(y_center)
x_max = int(x_center) + int(int(width))
y_max = int(y_center) + int(int(height))
temp.append(x_min)
temp.append(y_min)
temp.append(x_max)
temp.append(y_max)
temp.append(class_id)
cnt = cnt + 5
ids.append(image_id)
anno_string = ""
for elem in temp:
anno_string += str(elem)
anno_string += " "
annotations.append(anno_string)
f.close()
df = pd.DataFrame({"ID":ids,"Label":annotations})
df.to_csv('/content/dataset/annotations.csv',index=False)

Выбор модели и обучение:

В этом примере мы будем использовать SSD (детектор одиночного выстрела). Код для инициализации детектора, настройки гиперпараметров и обучения приведен ниже:

# Initialising detector
from detector_prototype import Detector
gtf = Detector();
# Loading the dataset
gtf.Dataset(root='/',img_dir= 'content/dataset/train/', anno_file='content/dataset/annotations.csv', batch_size=4);
# Defining training parameters
pretrained = True;
gpu=True;
model_name = "ssd_512_resnet50_v1_coco";
# Initialising Model
gtf.Model(model_name, use_pretrained=pretrained, use_gpu=gpu);
# Setting model parameters
gtf.Set_Learning_Rate(0.001);
epochs=10;
params_file = "saved_model.h5";
# Training
gtf.Train(epochs, params_file);

Первые 5 строк выше инициализируют детектор и загружают набор данных из каталога. Строки 6–15 определяют параметры обучения и инициализируют модель с заданными гиперпараметрами. Строки 16-17 используются для начала тренировочного процесса.

Дождитесь окончания тренировочного процесса и переходите к выводам.

Выполнение логического вывода:

# Setting into inference mode
from inference_prototype import Infer
# Loading details of saved model
model_name = "ssd_512_resnet50_v1_coco"
params_file = "saved_model.h5"
# class_list contains the list of classes in the dataset
class_list = ['Bier','Bier Mass','Weissbier','Cola','Wasser','Curry-Wurst','Weisswein','A-Schorle','Jaegermeister ','Pommes','Burger','Williamsbirne','Alm-Breze','Brotzeitkorb','Kaesespaetzle']
# Initialising inference
gtf = Infer(model_name, params_file, class_list, use_gpu=True);
# Getting predictions for a test image
img_name = '/content/dataset/test/1526744530681_45.jpg';
visualize = True;
thresh = 0.7;
output = gtf.run(img_name, visualize=visualize, thresh=thresh);

Таким образом, мы видим, что смогли создать собственный детектор объектов с очень небольшим количеством строк кода. Еще одно преимущество Monk заключается в том, что он не только прост, но и предлагает множество конвейеров и моделей для обучения, которые можно выбрать в соответствии с потребностями пользователей. В заключение, Monk AI - отличная библиотека, которая упрощает решение большинства задач компьютерного зрения просто и эффективно.

Использованная литература :

[1] Набор данных о продуктах питания Октоберфест: https://github.com/a1302z/OktoberfestFoodDataset

[2] Репозиторий Github по обнаружению объектов Monk: https://github.com/Tessellate-Imaging/Monk_Object_Detection

[3] Блокнот Colab для этого руководства: https://colab.research.google.com/drive/1flH7GBr-yM3A__eNF2e6XbUIjzcKVAI2