Я видел, что большинство практикующих ML могут построить модель машинного обучения, но когда дело доходит до развертывания модели или создания реального приложения с помощью модели ML, они не знают, как это сделать. Они показывают код, который они написали в блокноте jupyter или colab.

Распространенная жалоба, которую я слышу, заключается в том, что развертывание моделей машинного обучения в производстве — сложный процесс, и это действительно так. Исследования показывают, что почти 90% моделей машинного обучения никогда не попадают в производство.

Это как машина, которую вы построили, припарковали в гараже и никогда ею не пользовались.

Целью создания приложения машинного обучения является решение проблемы, а модель машинного обучения может сделать это только тогда, когда она активно используется в производстве. Развертывание модели ML так же важно, как и разработка модели ML. Процесс развертывания модели машинного обучения называется MLOps.

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

Прежде чем я начну, я хочу, чтобы вы знали, что это продолжение моей предыдущей статьи 'Классификация опухолей головного мозга с использованием Tensorflow и Transfer Learning”.

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

  • Как загрузить сохраненную модель ML
  • Как создать веб-приложение

Мы узнали, как сохранить модель, но теперь, как мы можем загрузить модель, чтобы использовать ее в производстве?

Загрузка модели ML

import gradio as gr
import tensorflow as tf
import cv2
import numpy as np

# Loading the Machine Learning model
model = tf.keras.models.load_model("models/modelv1.h5")

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

Я также импортировал библиотеку под названием Gradio. Gradio поможет нам создать веб-интерфейс, чтобы каждый мог использовать его где угодно!

Сначала создадим пользовательский интерфейс.

# Building the Interface
with gr.Blocks() as demo:

    # Image inputs and outputs widget
    with gr.Row():
        image = gr.inputs.Image(shape=(224, 224))
        label = gr.outputs.Label(num_top_classes=4)

    # Submit button for classiying the image
    with gr.Row():
        submit_btn = gr.Button(value="Submit")
        submit_btn.click(classify_image, inputs=[image], outputs=[
                         label], show_progress=True)

Представьте, что веб-приложение, которое мы разрабатываем, состоит из строк и столбцов, нам нужно два контейнера в одной строке, один контейнер для ввода изображения и другой для вывода. Во второй строке нам нужна одна кнопка с надписью «Отправить», чтобы пользователь мог нажать кнопку, и наша модель могла сделать прогноз.

Приведенный выше код создает две разные строки. В одной строке мы создаем контейнер для ввода (gr.inputs.Image), который принимает изображение размером 244x244. Вам не нужно беспокоиться об изменении размера изображения до 244x244, код сделает все за нас. В той же строке у нас есть еще одна метка контейнера (gr.inputs.Label). Эта метка поможет нам отобразить прогнозы, т. е. «Нет опухоли», «Опухоль глиомы», «Опухоль менингиомы» и «Опухоль гипофиза».

Во второй строке мы создаем кнопку (gr.Button) со значением "Отправить". Обратите внимание, что кнопка только создана, и на нее еще нельзя нажать. Мы должны сделать его кликабельным. Gradio помогает нам легко создать кнопку, на которую можно нажать, с помощью метода click(), предоставляемого классом Button Gradio.

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

Интерфейс будет выглядеть так 👇👇👇

Приведенный выше код выдаст ошибку "classify_image не определен". Давайте удалим эту ошибку, создав функцию classify_image.

def classify_image(input_image):
    opencvImage = cv2.cvtColor(np.array(input_image), cv2.COLOR_RGB2BGR)
    img = cv2.resize(opencvImage, (150, 150))
    img = img.reshape(1, 150, 150, 3)
    p = model.predict(img)
    p = np.argmax(p, axis=1)[0]

    if p == 0:
        p = 'Glioma Tumor'
    elif p == 1:
        p = "No Tumor"
    elif p == 2:
        p = 'Meningioma Tumor'
    else:
        p = 'Pituitary Tumor'
    if p != 1:
        print(f'The Model predicts that it is a {p}')

    
    return p

Функция classify_image принимает изображение в качестве параметра. Мы конвертируем это изображение из RGB в BGR, используя метод cvtColor OpenCV. Затем мы изменяем размер нашего изображения до 150x150. Почему? Потому что в то время, когда мы строили нашу модель классификатора, мы предоставили изображения размером 150x150. Каждый раз, когда мы создаем любую модель ML, мы должны убедиться, что размер ввода при создании модели ML и размер ввода при использовании модели в производстве должны быть одинаковыми.

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

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

Итак, с помощью argmax мы сможем узнать индекс, связанный с прогнозируемым результатом. Основываясь на прогнозах, сделанных нашей моделью классификации, мы присваиваем разные значения одной переменной (p). Например, если наша модель предсказывает 0, значит, на изображении опухоль глиомы, если она предсказывает 1, значит, на изображении нет опухоли и так далее. Мы возвращаем эту переменную (p), чтобы мы могли показать значение p на метке Gradio. Если мы ничего не вернем, то наша модель будет работать нормально, но не покажет результат пользователю.

На этом мы почти закончили, но когда вы запускаете программу, она ничего не показывает, не показывает никаких ошибок или чего-то еще, почему? потому что мы не создали точку входа нашей программы.

Давайте создадим точку входа нашей программы, которая является основной функцией.

# Main Function
if __name__ == "__main__":
    demo.launch()

Приведенный выше код создает основную функцию, и внутри основной функции мы вызываем demo.launch(), которая, в свою очередь, запускает веб-сайт на нашем локальном компьютере.

Чтобы получить доступ к нашему веб-приложению, перейдите в свой браузер и введите http://127.0.0.1:7860/, чтобы запустить только что созданный веб-сайт. Обратите внимание, если вы хотите поделиться этим веб-сайтом с любыми другими пользователями, вы должны добавить share=True в функцию запуска: demo.launch(share=True)

Фу! 😮‍💨

Много работы не так ли? Итак, мы закончили создание нашего веб-приложения. Вы можете развернуть этот код на любом сервере Heroku, Amazon и т. д.

Выход

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

Прочтите первую часть этой статьи Классификация опухолей головного мозга с использованием Tensorflow и Transfer Learning. Код частей 1 и 2 предоставлен на GitHub. Если у вас есть какие-либо сомнения, рекомендации, проблемы или что-то еще, вы всегда можете связаться со мной в LinkedIn, Twitter,иInstagram.

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

Удачного программирования 😉

https://forms.gle/1zB9GiKAdejyNbkh6







Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу