Что такое БЫКИ

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

Он оптимизирован для быстрой работы с различными типами данных, включая структурированные и неструктурированные данные, такие как изображения, видео, аудио и текст. Интерфейс командной строки Oxen (CLI) похож на git, что упрощает его использование для тех, кто знаком с управлением версиями кода с помощью git.

Чтобы узнать больше об особенностях Oxen, установке и основных командах, перейдите по ссылке.

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

Монтаж

Мак

$ brew tap Oxen-AI/oxen
$ brew install oxen

Последняя версия Ubuntu

$ wget https://github.com/Oxen-AI/oxen-release/releases/download/v0.4.8/oxen-ubuntu-latest-0.4.8.deb
$ sudo dpkg -i oxen-ubuntu-latest-0.4.8.deb

Настройка пользователя

Чтобы ваша история коммитов отображала вашу информацию точно, вам необходимо настроить локальное имя пользователя и адрес электронной почты Oxen. Это то, что будет отображаться в oxen log и на панели инструментов OxenHub, чтобы указать, кто внес определенные изменения.

$ oxen config --name "YOUR_NAME" --email "YOUR_EMAIL"

Набор токенов аутентификации для хоста: hub.oxen.ai

$ oxen config --auth hub.oxen.ai 'API Key'

Клонировать репозиторий

$ oxen clone https://hub.oxen.ai/ox/CatDogBoundingBox

После того, как вы клонировали репо, вы должны найти следующие каталоги.

После того, как вы клонируете репозиторий, вам нужно проверить ветку Nurul25kCatDogImages.

$ oxen checkout -b Nurul25KCatDogImages 

Мы рассмотрим руководство по папке Dogs-Vs-Cats и изучим другие каталоги в отдельном посте. Внутри каталога dogs-vs-cats мы найдем 3 следующие папки.

sampleSubmission.csv
тест/
обучение/

Эти наборы данных изначально были собраны с Kaggle, но мы проиндексировали их в репозиторий Oxen, чтобы их было проще использовать, дополнять и расширять с течением времени.

Давайте начнем строить базовую архитектуру CNN для классификации кошек и собак по изображениям.

Прежде всего, давайте импортируем все необходимые библиотеки.

import numpy as np
import pandas as pd
import seaborn as sns
import dtale
from tensorflow.keras.utils import load_img
from tensorflow.keras.utils import img_to_array
from matplotlib.image import imread
from numpy import asarray
from keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split
from tensorflow.python.ops.math_ops import arg_max
import matplotlib.pyplot as plt
import random
import os

Определение размера изображения и пакета.

Image_Width= 224
Image_Height= 224
Image_Size=(Image_Width,Image_Height)
Image_Channels=3
batch_size = 32

Теперь нам нужно изучить наборы данных, которые мы собираемся использовать для этого урока. Мы будем работать с 25К изображений, которые есть в папке поезда.

Теперь давайте прочитаем эти изображения и преобразуем их во фрейм данных.

filenames = os.listdir("train")
categories = []
for f_name in filenames:
    category=f_name.split('.')[0]
    if category=='dog':
        categories.append(1)
    else:
        categories.append(0)
df = pd.DataFrame({
    'filename':filenames,
    'category':categories
})

Если мы распечатаем фрейм данных, мы должны найти:

Теперь мы разделим наборы данных на train_df, test_df, validate_df.

train_df = df.loc[:22000]
test_df = df.loc[22001:24000]
validate_df = df.loc[24001:24999]

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

tf.keras.utils.split_dataset(
    dataset, left_size=None, right_size=None, shuffle=False, seed=None
)

Давайте посмотрим на наборы данных train_df и нарисуем несколько изображений.

plt.figure(figsize=(20,20))
for i in range(2):
  plt.subplots(1)
  filename = '/data/NurulWorkspace/dogs-vs-cats/train/'+train_df['filename'][i]
  image = imread(filename)
  print('image shape', image .shape, 'maximum color level', image .max())
  # plot raw pixel data
  plt.imshow(image)

Теперь мы найдем, сбалансированы ли наборы данных!

sns.countplot(x ='category', data = train_df)

Мы видим, что наборы данных хорошо сбалансированы, и нам не нужно делать дополнительную аугментацию данных.

Теперь мы создадим генераторы данных для обучения и проверки данных.

# Create data generators for the training and validation data
train_datagen = ImageDataGenerator(rotation_range=15,
                                rescale=1./255,
                                shear_range=0.1,
                                zoom_range=0.2,
                                horizontal_flip=True,
                                width_shift_range=0.1,
                                height_shift_range=0.1
                                )

train_generator = train_datagen.flow_from_dataframe(train_df,
                                                 "train/",x_col='filename',y_col='category',
                                                 target_size=Image_Size,
                                                 class_mode='categorical',
                                                 batch_size=batch_size)

validation_datagen = ImageDataGenerator(rescale=1./255)
validation_generator = validation_datagen.flow_from_dataframe(
    validate_df, 
    "train/", 
    x_col='filename',
    y_col='category',
    target_size=Image_Size,
    class_mode='categorical',
    batch_size=batch_size
)
Found 22001 validated image filenames belonging to 2 classes.
Found 999 validated image filenames belonging to 2 classes.

Поскольку мы закончили предварительную обработку данных, пришло время создать базовую архитектуру CNN и обучить модель.

from keras.models import Sequential
from keras.layers import Conv2D,MaxPooling2D,\
     Dropout,Flatten,Dense,Activation,\
     BatchNormalization

model = Sequential()

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(Image_Width, Image_Height, Image_Channels)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# Second convolutional layer
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# Third convolutional layer
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# Flatten layer
model.add(Flatten())

# Fully connected layer
model.add(Dense(512, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))

# Compile the model
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

# Print the model summary
model.summary()

epochs= 90
history = model.fit(
    train_generator, 
    epochs = epochs,
    validation_data=validation_generator,
    #callbacks=callbacks
)

Сохранение модели[Опция]. Если вы хотите сохранить модель.

model.save("Data_Cats_vs_Dogs_Classification_25K_Images.h5")

Построение кривой точности и потерь для фазы обучения для каждой эпохи.

Похоже, что модель работает разумно на данных поезда. Давайте посмотрим, хорошо ли работает модель с невидимыми или тестовыми наборами данных.

Во-первых, давайте подготовим тестовые наборы данных аналогично шагам обучения.

test_datagen = ImageDataGenerator(rotation_range=15,
                                rescale=1./255,
                                shear_range=0.1,
                                zoom_range=0.2,
                                horizontal_flip=True,
                                width_shift_range=0.1,
                                height_shift_range=0.1)

test_generator = train_datagen.flow_from_dataframe(test_df,
                                            "train/", x_col= 'filename', y_col='category',
                                            target_size=Image_Size,
                                            class_mode= 'categorical',
                                            shuffle = False,
                                            batch_size=batch_size
                                            )
Found 2000 validated image filenames belonging to 2 classes.

sns.countplot(x ='category', data = test_df)

Также кажется, что наборы тестовых данных также хорошо сбалансированы.

Теперь мы выясним, насколько хороша производительность на невидимых / тестовых наборах данных, изучив матрицу путаницы.

from sklearn.metrics import classification_report
# Generate predictions for the test data
predictions = model.predict(test_generator)

# Convert the predictions from one-hot encoding to class labels
predicted_classes = np.argmax(predictions, axis=1)

# Get the true classes of the test data
true_classes = test_generator.classes

print(classification_report(true_classes, predicted_classes))

Матрица путаницы — это таблица, которая обобщает производительность модели классификации путем сравнения предсказанных и фактических меток классов. .

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

Точность измеряет долю истинно положительных результатов среди случаев, которые модель предсказала как положительные. Для класса 0 точность составляет 0,9, а для класса 1 — 0,95. Отзыв измеряет долю истинных положительных результатов, которые были правильно идентифицированы моделью. Для класса 0 полнота составляет 0,96, а для класса 1 — 0,89. Оценка F1 представляет собой гармоническое среднее значение точности и полноты, и она дает единую оценку, которая уравновешивает обе метрики. Для класса 0 показатель F1 равен 0,93, а для класса 1 — 0,92. Поддержка — это количество экземпляров в каждом классе. Для класса 0 имеется 1036 экземпляров, а для класса 1 — 964 экземпляра. Точность измеряет долю экземпляров, правильно классифицированных моделью. Общая точность модели составляет 0,9.

Подводя итог: мы использовали OxenHub для сверхбыстрого клонирования больших наборов данных на нашу локальную машину и обучили алгоритм CNN отличать собак от кошек.

  • Спасибо, что следили за этим постом.
  • Ссылка на Jupyter Notebook.
  • Не стесняйтесь проверять документацию разработчиков Oxen по адресу https://github.com/Oxen-AI/oxen-release#-oxen.
  • Не стесняйтесь создавать учетную запись на https://oxen.ai/register, чтобы вы могли создавать свои собственные репо и сразу же бесплатно клонировать большие наборы данных.
  • Если вам нужна дополнительная информация или помощь, свяжитесь со мной. ЛинкедИн. Электронная почта: [email protected], [email protected]