0

2. Анализ данных для построения модели обнаружения объектов

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

В разделе 2.1  находятся инструкции как сохранить данные.  В разделе 2.2, описана структура предоставленной вам информации. И раздел 2.3 описывает создание визуализации ограничивающей рамки.  

2.1. Загрузка набора данных

Для загрузки данных используем специальную утилиту. Для этого сначала с помощью git загрузим репозиторий на свой компьютер.

git clone https://github.com/Pseudo-Lab/Tutorial-Book-Utils

Cloning into 'Tutorial-Book-Utils'...
remote: Enumerating objects: 30, done.
remote: Counting objects: 100% (30/30), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 30 (delta 9), reused 18 (delta 5), pack-reused 0
Unpacking objects: 100% (30/30), done.

В сохраненной папке будет скрипт PL_data_loader.py на питоне для загрузки больших файлов с Google диска. Для его запуски выполним  эту комманду:

python ./Tutorial-Book-Utils/PL_data_loader.py --data FaceMaskDetection

Face Mask Detection.zip is done!

Распакуйте полученный файл «Face Mask Detection.zip» в текущую директорию.

Рисунок 2-1 список файлов и директорий

В итоге у вас получится две папки images — где хранятся все изображения  и annotations где хранятся координаты местоположения медицинской маски для конкретного изображения.

2.2 Структура набора данных

Набор данных для обнаружения маски лица состоит из двух папок “images”и “annotation».  Папка “images” содержит файлы изображений пронумерованные от 0 до 852,  а папка “annotation” файлы в xml формате также пронумерованные от 0 до 852.

В папка “annotation” в xml-формате содержится информация о каждом файле изображения. Например, maksssksksss307.xml файл содержит следующие данные:

содержимое maksssksksss307.xml

Файл содержит как общую информацию — имя файла с изображением и размере изображения, так и координаты (рамки) объектов находящихся на изображении. Можно увидеть три типа объектов: mask_weared_incorrect, with_mask, without_mask. Таким образом записана информация о позиции и классификация объекта по признаку наличия маски на лице ( маска одета неправильно, маска одета, маска не одета). В xmin, ymin, xmax, ymax находятся координаты рамки для каждого объекта найденного на изображении.

Изображение maksssksksss307.

Рисунок 2-2 визуализация файла makssksksss307.png

Рисунок 2-2 это файл изображения  makssksksss307.png который описывает файлmaksssksksss307.xml. 

2.3. Визуализация ограничивающей рамки

Для повышения точности моделей глубокого обучения важны валидные наборы данных.  Этот раздел приведен для визуализации ограничивающей рамки изображения чтобы убедится в правильности маркировки наших данных. Проще говоря нам нужно наглядно понять что данные занесенные в xml файлы достоверны и правильно ограничивают области на изображении с нужными нам объектами (масками и лицами без масок).
 
import os
import glob
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.patches as patches
from bs4 import BeautifulSoup

Начало кода визуализации ограничивающей рамки для проверки импортированного пакета. matplotlib — будет использоваться для визуализации объектов, пакеты os и glob используются для общих и системных функций. Пакет  BeautifulSoup — это HTML- парсер используемый для разбора XML-документа.

img_list = sorted(glob.glob('images/*'))
annot_list = sorted(glob.glob('annotations/*'))

Создаем отсортированные массивы файлов с изображениями и описаниями.

print(len(img_list))
print(len(annot_list))

Проверим кол-во файлов в каждом массиве, их должно быть по 853 шт.

print(img_list[:10])
print(annot_list[:10])

Выведем на экран по 10 элементов из каждого массива и убедимся что полученные данные содержат имена файлов из каждой папки

У вас должно получится что-то типа такого, убедитесь что массивы отсортированы в одинаковом порядке

853
853
['images\\maksssksksss0.png', 'images\\maksssksksss1.png', 'images\\maksssksksss10.png', 'images\\maksssksksss100.png', 'images\\maksssksksss101.png', 'images\\maksssksksss102.png', 'images\\maksssksksss103.png', 'images\\maksssksksss104.png', 'images\\maksssksksss105.png', 'images\\maksssksksss106.png']
['annotations\\maksssksksss0.xml', 'annotations\\maksssksksss1.xml', 'annotations\\maksssksksss10.xml', 'annotations\\maksssksksss100.xml', 'annotations\\maksssksksss101.xml', 'annotations\\maksssksksss102.xml', 'annotations\\maksssksksss103.xml', 'annotations\\maksssksksss104.xml', 'annotations\\maksssksksss105.xml', 'annotations\\maksssksksss106.xml']

Теперь создадим функции визуализации ограничивающей рамки.

def generate_box(obj):
    
    xmin = float(obj.find('xmin').text)
    ymin = float(obj.find('ymin').text)
    xmax = float(obj.find('xmax').text)
    ymax = float(obj.find('ymax').text)
    
    return [xmin, ymin, xmax, ymax]

def generate_label(obj):
    if obj.find('name').text == "with_mask":
        return 1
    elif obj.find('name').text == "mask_weared_incorrect":
        return 2
    return 0

def generate_target(file): 
    with open(file) as f:
        data = f.read()
        soup = BeautifulSoup(data, "html.parser")
        objects = soup.find_all("object")

        num_objs = len(objects)

        boxes = []
        labels = []
        for i in objects:
            boxes.append(generate_box(i))
            labels.append(generate_label(i))
        
        target = {}
        target["boxes"] = boxes
        target["labels"] = labels
        
        return target

def plot_image(img_path, annotation):
    
    img = mpimg.imread(img_path)
    
    fig,ax = plt.subplots(1)
    ax.imshow(img)

    
    for idx in range(len(annotation["boxes"])):
        xmin, ymin, xmax, ymax = annotation["boxes"][idx]

        if annotation['labels'][idx] == 0 :
            rect = patches.Rectangle((xmin,ymin),(xmax-xmin),(ymax-ymin),linewidth=1,edgecolor='r',facecolor='none')
        
        elif annotation['labels'][idx] == 1 :
            
            rect = patches.Rectangle((xmin,ymin),(xmax-xmin),(ymax-ymin),linewidth=1,edgecolor='g',facecolor='none')
            
        else :
        
            rect = patches.Rectangle((xmin,ymin),(xmax-xmin),(ymax-ymin),linewidth=1,edgecolor='orange',facecolor='none')

        ax.add_patch(rect)

    plt.show()

Приведенный выше код определяет всего 4 функции. Сначала указываем, что хотим вернуть значения xmin, ymin, xmax, ymax через функцию generate_box. Функция generate_label возвращает значения 0, 1 и 2 следующим образом — 1 для with_mask, 2 для mask_weared_incorrect и 0 для количества оставшихся случаев без маски.

Функция generate_target — это функция, которая вызывает generate_box и generate_label соответственно, сохраняет возвращаемое значение в словаре и возвращает его. Используйте html.parser, чтобы получить содержимое файла аннотаций и извлечь ограничительную рамку и метку цели. Функция plot_image — это функция, которая выводит  изображение и ограничивающую рамку и рисует зеленую ограничивающую рамку при ношении маски, оранжевую при неправильном ношении маски и красную при отсутствии маски.

img_list.index('images/maksssksksss307.png') 
232

Приведенный выше код предназначен для поиска значения индекса файла makssskssss307.png. Вы можете проверить значение индекса местоположения файла maksssksss307.png с помощью функции index.

bbox = generate_target(annot_list[232])
plot_image(img_list[232], bbox)

Рисунок 2-3 Результат работы скрипта визуализации рамки

На рис. 2-2 показан файл изображения makssskssss307.png, описанный файлом makssskssss307.xml. Точно так же, как mask_weared_incorrect, with_mask и without_mask появляются в объекте в порядке от крайней левой координаты X, в файле изображения объект, который не носит маску правильно, объект, который носит маску, и объект, который не носит маску. На рисунке 2-3 показаны рамки объектов которые соответствуют последовательности описанных координат в файле makssskssss307.xml.  

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

Platon

Добавить комментарий