Компьютерное зрение

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

  1. Получение изображения. Сбор цифровых изображений или видео с камеры или других источников — это начальный этап компьютерного зрения.
  2. Предварительная обработка. На этом этапе отснятые фотографии или видео очищаются, чтобы избавиться от посторонней информации, такой как шум и размытие. Фотографии также должны быть изменены в размере, обрезаны и изменены на этом этапе для достижения соответствующего формата и разрешения.
  3. Улучшение изображения. Для улучшения качества и видимости фотографий изменяются яркость, контрастность и цветовой баланс.
  4. Извлечение признаков. Выявление отличительных элементов на фотографиях, таких как края, углы и текстурные узоры, называется извлечением признаков. Чтобы изобразить фотографии лаконично и осмысленно, используются несколько качеств.
  5. Распознавание объектов. Это процесс обнаружения и классификации объектов на фотографиях или в видеороликах. На этом этапе используются алгоритмы машинного обучения для сопоставления извлеченных функций с предопределенными шаблонами объектов.
  6. Отслеживание объектов. Отслеживание объектов в видеоклипе во времени называется отслеживанием объектов. На этом этапе положение и скорость объектов оцениваются с использованием методов анализа движения.
  7. Сегментация изображения. Это процесс разделения изображения на полезные области или объекты. На этом этапе сопоставимые пиксели группируются с использованием методов кластеризации и классификации.
  8. 3D-реконструкция. Реконструкция сцены или объекта из последовательности 2D-фотографий или видео в 3D-модель называется 3D-реконструкцией. На этом этапе глубина и форма объектов оцениваются с использованием методов стереозрения и фотограмметрии.
  9. Оценка. Последним шагом является оценка производительности системы компьютерного зрения с использованием различных показателей, включая точность, воспроизводимость и оценку F1.

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

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

Набор данных изображений гистологии груди

Этот набор данных Kaggle был собран с веб-сайта Эндрю Яновчика и использован для класса по науке о данных в Epidemium. Он включает 5547 фотографий гистологии молочной железы размером 50 × 50 x 3. цель. Здесь IDC указывает на рак молочной железы.

Импорт необходимых библиотек

import tensorflow.keras as K
import keras
import keras.preprocessing.image
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split

Импорт изображений рака молочной железы

Набор данных изображений доступен в виде многомерных массивов NumPy. Форма (5547, 50, 50, 3) представляет 5547 изображений размером 50 × 50 пикселей, а 3 указывает, что цвета в изображениях представлены в формате RGB. Для уменьшения предвзятости изображения перемешиваются.

# load images of shape (5547, 50, 50, 3)
x_images = np.load('X.npy')  
# load labels of shape (5547,1); (0 = no cancer, 1 = cancer)
y_images = np.load('Y.npy')   
# shuffle data
perm_array = np.arange(len(x_images))
np.random.shuffle(perm_array)
x_images = x_images[perm_array]
y_images = y_images[perm_array]

Печать 30 изображений из набора данных вместе с их значением IDC

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

imgs_0 = x_images[y_images == 0] # 0 = no cancer
imgs_1 = x_images[y_images == 1] # 1 = cancer
plt.figure(figsize=(20,20))
for i in range(30):
    plt.subplot(5,6,i+1)
    plt.title('IDC = %d'%y_images[i])
    plt.imshow(x_images[i])

Построение гистограмм значений RGB для изображений

Мы можем лучше понять взаимосвязь между функциями и значениями, которые должны быть предсказаны, построив графики. Здесь я построил значения интенсивности пикселей RGB для двух изображений и сравнил результаты. Мы видим, что в случае IDC = 1 значения интенсивности пикселей распределяются примерно одинаково.

plt.figure(figsize=(14,3))
for i in range(2):
    n_img = np.random.randint(len(x_images))
    plt.subplot(1,4,1+2*i)
    plt.title('IDC = %d'%y_images[n_img])
    plt.imshow(x_images[n_img])
    plt.subplot(1,4,2+2*i)
    plt.title('IDC = %d'%y_images[n_img])
    plt.ylabel('Count')
    plt.xlabel('Pixel Intensity')
    plt.hist(x_images[n_img,:,:,0].flatten(), bins=30, lw = 0,color='r', alpha=0.5);
    plt.hist(x_images[n_img,:,:,1].flatten(), bins=30, lw = 0, color='g', alpha=0.5);
    plt.hist(x_images[n_img,:,:,2].flatten(), bins=30, lw = 0, color='b', alpha=0.5);
print('red channel: min/mean/std/max = %.2f/%.2f/%.2f/%.2f'%(x_images[:,:,:,0].min(),
    x_images[:,:,:,0].mean(), x_images[:,:,:,0].std(), x_images[:,:,:,0].max()))
print('green channel: min/mean/std/max = %.2f/%.2f/%.2f/%.2f'%(x_images[:,:,:,1].min(),
    x_images[:,:,:,1].mean(), x_images[:,:,:,1].std(), x_images[:,:,:,1].max()))
print('blue channel: min/mean/std/max = %.2f/%.2f/%.2f/%.2f'%(x_images[:,:,:,2].min(),
    x_images[:,:,:,2].mean(), x_images[:,:,:,2].std(), x_images[:,:,:,2].max()))

Определение функции для предварительной обработки данных с использованием предварительно обученной модели ResNet 50 от Keras

ResNet-50 — это предварительно обученная архитектура с глубоким обучением, которая обычно используется для задач классификации изображений. При подготовке данных для моделей глубокого обучения, таких как ResNet-50, важным этапом является предварительная обработка. Модель ResNet-50 вместе с механизмом предварительной обработки доступна в библиотеке Keras.

def preprocess(X,Y):
    X_p = K.applications.resnet50.preprocess_input(X)
    Y_p = K.utils.to_categorical(Y,2)
    return X_p, Y_p

Разделение данных на обучающие и тестовые части в соотношении 80:20 и их предварительная обработка

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

X_train, X_test, y_train, y_test = train_test_split(x_images, y_images, test_size=0.2, random_state=42)
X_train, y_train = preprocess(X_train, y_train)
X_test, y_test = preprocess(X_test, y_test)

Импорт модели ResNet-50

Я сделал все слои, кроме последнего, необучаемыми, чтобы исправить их и снизить стоимость вычислений. Здесь я определил входной тензор формы (224, 224, 3). Это связано с тем, что модель ResNet-50 лучше всего работает с изображениями размером 224×224. Веса берутся из imagenet и являются фиксированными.

input_t = K.Input(shape = (224,224,3))
res_model = K.applications.ResNet50(include_top = False, weights = "imagenet", input_tensor = input_t)
for layer in res_model.layers[:143]:
        layer.trainable = False

Добавление модели ResNet-50 в последовательные слои Keras и добавление дополнительных слоев

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

  • Последовательная модель — это линейный набор слоев, который можно создать, добавляя слои в модель один за другим.
  • Слой Flatten используется для преобразования многомерных входных данных в один вектор.
  • Слой пакетной нормализации используется для нормализации активаций предыдущего слоя в каждом пакете, что способствует более быстрой сходимости и повышает стабильность модели.
  • Плотный слой — это полностью связанный слой, в котором каждый нейрон связан с каждым нейроном предыдущего слоя. Он выполняет линейное преобразование, а затем нелинейную функцию активации.
  • Dropout Layer случайным образом выбирает нейроны, которые следует игнорировать во время обучения. Они «выпадают» случайным образом.
to_res = (224, 224)
model = K.models.Sequential()
model.add(K.layers.Lambda(lambda image: tf.image.resize(image, to_res))) 
model.add(res_model)
model.add(K.layers.Flatten())
model.add(K.layers.BatchNormalization())
model.add(K.layers.Dense(256, activation='relu'))
model.add(K.layers.Dropout(0.5))
model.add(K.layers.BatchNormalization())
model.add(K.layers.Dense(128, activation='relu'))
model.add(K.layers.Dropout(0.5))
model.add(K.layers.BatchNormalization())
model.add(K.layers.Dense(64, activation='relu'))
model.add(K.layers.Dropout(0.5))
model.add(K.layers.BatchNormalization())
model.add(K.layers.Dense(2, activation='softmax'))

Обучение модели и сохранение модели с лучшим значением val_accuracy

Я использовал категориальную кроссэнтропию в качестве функции потерь, RMSprop в качестве оптимизатора со скоростью обучения 2e-3 и точностью в качестве метрики. Модель обучается в течение 16 эпох, и модель с наилучшей точностью проверки сохраняется в истории.

Контрольные точки в Keras определяются как сохранение веса модели в заранее определенные моменты во время обучения. Эти сохраненные веса можно загрузить в модель позже, чтобы продолжить обучение с того места, где оно было остановлено, или сделать прогнозы на основе свежих данных. Я выбрал контрольную точку, когда точность проверки максимальна.

check_point = K.callbacks.ModelCheckpoint(filepath="XAI.healthcare.model",
                                              monitor="val_acc",
                                              mode="max",
                                              save_best_only=True,
                                              )
model.compile(loss='categorical_crossentropy',
                  optimizer=K.optimizers.RMSprop(lr=2e-3),
                  metrics=['accuracy'])
history = model.fit(X_train, y_train, batch_size=16, epochs=12, verbose=1,
                        validation_data=(X_test, y_test),
                        callbacks=[check_point])
model.summary()

Отображение окончательной точности

print("Validation Accuracy: ",max(history.history['val_accuracy'])) 
# 0.8144144415855408
print("Training Accuracy: ",max(history.history['accuracy']))
# 0.938021183013916

Исходный код на GitHub

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