Радиология – это область, которая в значительной степени зависит от опыта высококвалифицированных специалистов. Радиологи анализируют медицинские изображения для диагностики и мониторинга целого ряда состояний: от простых переломов до сложных заболеваний, таких как рак. Тем не менее, с ростом популярности медицинской визуализации и острой потребностью в быстрой и точной диагностике рентгенологи находятся под огромным давлением. Именно здесь на помощь приходит искусственный интеллект (ИИ), преобразующий эту сферу за счет расширения человеческих возможностей. К концу этой статьи вы создадите свою собственную модель классификатора изображений, которая поможет обнаружить пневмонию на медицинских изображениях.
Прежде чем погрузиться в программирование, нам необходимо убедиться, что наша среда готова. Начнем с установки необходимых библиотек:
%pip install --upgrade tensorflow keras numpy pandas sklearn pillow
Эти библиотеки необходимы для построения и обучения нашей модели:
tensorflow
и keras
для создания и обучения нейронных сетей.numpy
для числовых операций.pandas
для манипулирования данными.sklearn
для предварительной обработки данных.pillow
для обработки изображений.Установив библиотеки, давайте импортируем их:
import os from tensorflow import keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Flatten from tensorflow.keras.preprocessing.image import ImageDataGenerator import numpy as np
Мы начнем с импорта нескольких основных библиотек и модулей, необходимых для построения и обучения модели нейронной сети для задач обработки изображений. Мы будем использовать TensorFlow и его подмодули для создания наших моделей глубокого обучения и управления ими. В частности, мы импортируем Keras для использования в качестве нашего высокоуровневого API, Sequential для построения линейного стека слоев и такие модули, как Dense, Conv2D, MaxPool2D и Flatten, для создания и настройки различных слоев нейронной сети. Кроме того, ImageDataGenerator поможет нам расширить данные изображения, улучшая способность модели к обобщению. Наконец, мы импортируем numpy для поддержки числовых операций, что особенно полезно для обработки массивов и выполнения математических функций.
Нашему ИИ-рентгенологу нужны данные, на которых можно учиться. Мы будем использовать ImageDataGenerator для загрузки и дополнения наших данных для обучения и проверки: для загрузки данных мы будем использовать нашего друга данных с открытым исходным кодом Kaggle. Загрузите помеченный набор данных по ссылке здесь.
В контексте контролируемого обучения здесь помеченный набор данных будет основной истиной, которую должна предсказывать модель машинного обучения.
trdata = ImageDataGenerator() traindata = trdata.flow_from_directory(directory="data-task1/train", target_size=(224, 224)) tsdata = ImageDataGenerator() testdata = tsdata.flow_from_directory(directory="data-task1/val", target_size=(224, 224))
Этот фрагмент кода настраивает генераторы данных для наших наборов данных обучения и проверки. Размер изображений изменяется до 224x224 пикселей — стандартного входного размера для модели VGG16.
Теперь самое интересное: создание модели VGG16. VGG16 — это популярная архитектура сверточной нейронной сети (CNN), известная своей простотой и эффективностью благодаря своей уникальной архитектуре, построенной в основном на 13 сверточных слоях и 3 полносвязных слоях. Что отличает VGG16, так это использование небольших сверточных фильтров 3x3 в глубокой сети. Эта конструкция улавливает сложные узоры на изображениях, обеспечивая при этом эффективность вычислений. Вот как мы это создаем:
model = Sequential() model.add(Conv2D(input_shape=(224,224,3), filters=64, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=64, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Flatten()) model.add(Dense(units=4096, activation="relu")) model.add(Dense(units=4096, activation="relu")) model.add(Dense(units=2, activation="softmax")) model.summary()
Давайте разберем это:
Определив архитектуру нашей модели, нам нужно ее скомпилировать:
opt = keras.optimizers.Adam(learning_rate=0.001) model.compile(optimizer=opt, loss=keras.losses.binary_crossentropy, metrics=['accuracy'])
Здесь мы используем оптимизатор Адама со скоростью обучения 0,001 и двоичной кросс-энтропией в качестве функции потерь, подходящей для задач двоичной классификации. Давайте разберем плюсы и минусы этих вариантов:
Компонент | Преимущества | Недостатки |
---|---|---|
Адам Оптимизатор | 1. Адаптивная скорость обучения. 2. Хорошо работает с настройками по умолчанию. | Возможность переоснащения сложными моделями. |
Двоичная перекрестная энтропийная потеря | Идеально подходит для бинарной классификации | не очень совместимо с моей функцией активации выходного слоя, почему? (Оставь это в комментариях!) |
Не стесняйтесь экспериментировать с различными оптимизаторами, скоростями обучения и функциями потерь, поскольку это отличный способ набраться опыта.
Пришло время обучить нашего искусственного радиолога! Мы настраиваем обратные вызовы, чтобы сохранить лучшую модель и прекратить работу раньше, если точность проверки перестанет улучшаться:
from keras.callbacks import ModelCheckpoint, EarlyStopping checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_accuracy', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1) early = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=20, verbose=1, mode='auto') hist = model.fit_generator(steps_per_epoch=20, generator=traindata, validation_data=testdata, validation_steps=10, epochs=10, callbacks=[checkpoint, early])
Чтобы увидеть, как работает наша модель, мы можем построить график потерь и точности обучения и проверки:
import matplotlib.pyplot as plt # Training loss plt.plot(hist.history['loss']) plt.legend(['Training']) plt.title('Training loss') plt.ylabel('loss') plt.xlabel('epoch') plt.show() # Validation loss plt.plot(hist.history['val_loss']) plt.legend(['Validation']) plt.title('Validation loss') plt.ylabel('validation loss') plt.xlabel('epoch') plt.show() # Training and validation accuracy plt.plot(hist.history['accuracy']) plt.plot(hist.history['val_accuracy']) plt.legend(['Training', 'Validation']) plt.title('Training & Validation accuracy') plt.xlabel('epoch') plt.show()
Эти графики помогут нам понять, насколько хорошо обучается наша модель и не переоснащается она или не подстраивается.
После обучения наш рентгенолог с искусственным интеллектом готов делать прогнозы. Вот как вы можете загрузить изображение и получить прогноз модели:
from tensorflow.keras.preprocessing import image # Load and preprocess image img_path = 'path_to_your_image.jpg' img = image.load_img(img_path, target_size=(224, 224)) img_array = image.img_to_array(img) img_array = np.expand_dims(img_array, axis=0) # Create batch axis # Make prediction prediction = model.predict(img_array) print('Prediction:', prediction)
Создание радиолога с искусственным интеллектом — это только начало. Вот несколько советов по тонкой настройке и улучшению вашей модели:
Вау, потрясающая работа! 🎉 Вы создали модель, которая может анализировать медицинские изображения и делать прогнозы — какое великое достижение в медицине! :) Углубившись в сложности архитектуры нейронных сетей, вы увидели, насколько эффективной может быть точно настроенная модель ИИ. Продолжайте расширять границы, продолжайте экспериментировать и, самое главное, наслаждайтесь каждым моментом работы над своими проектами ИИ!