Розгортання додатка для контролю якості (глибинне навчання) за допомогою Streamlit, Docker та AWS Elastic Beanstalk

текст перекладу
Особлива подяка доктору Яссеру Альмехіо @mymehio за рецензування цього посту.

Вступ:

Застосунок: Кваліфікація отворів на PCB

Контроль якості електронних компонентів є надзвичайно важливим під час складання електронних пристроїв. З розвитком методів виробництва електронних схем, дефекти пайки при складанні друкованих плат (PCB) стали більш поширеними. Для мінімізації цих проблем важливу роль відіграють передові технології, такі як рентгенівське зображення (рис. 1), які використовуються для інспекції та виявлення потенційних дефектів чи невідповідностей.

Виявлення та мінімізація дефектів (таких як пори) допомагає запобігти потенційним відмовам або неполадкам у електронних компонентах або схемах.

pic

Рис. 1 Рентгенівське зображення PCB

В пропонованих моделях, заснованих на ШІ, ми використовуємо одну з найновіших моделей для виявлення та сегментації, щоб вирішити проблему виявлення пор. Пора на PCB пайці означає виявлення порожніх місць або зазорів в межах певного об'єкта чи ділянки. У цьому випадку мета полягає в тому, щоб виявити та визначити місцезнаходження пор або порожніх ділянок і обчислити їх наявність, використовуючи рішення на основі ШІ.

Наше рішення використовує двоетапний підхід, використовуючи дві потужні моделі глибокого навчання: YOLO та SAM. Ця двоетапна методологія дозволяє досягти точної ідентифікації та локалізації об'єктів на складних та динамічних зображеннях.

Огляд:

Вхід: зображення та відповідні обмежуючі коробки, надані YOLO як вихід

Вихід: сегментовані області з двома різними масками

pic

Рис. 2 Потік системи

pic

Рис. 3 Прототип з використанням Streamlit

Зміст

  • Розділ 1: Використовувані технології
  • Розділ 2: Підготовка кастомного набору даних за допомогою Roboflow: Анотація та аугментація
  • Розділ 3: Навчання YOLO на кастомному наборі даних
  • Розділ 4: Прототипування додатка за допомогою Streamlit
  • Розділ 5: Dockerизація додатка
  • Розділ 6: Розгортання на AWS Elastic Beanstalk

Розділ 1: Використовувані технології

YOLO (You Only Look Once) (розроблено Ultralytics) — це популярний алгоритм виявлення об'єктів у реальному часі. Він широко використовується в комп'ютерному зорі та глибокому навчанні для виявлення та локалізації об'єктів на зображеннях або відео.

YOLO приймає вхідне зображення або відео і розділяє його на сітку. Кожна клітинка сітки прогнозує фіксовану кількість обмежуючих коробок разом з ймовірностями класів та оцінками впевненості.

Segment Anything Model (SAM) (розроблено Meta AI) — це агностична модель, яка може сегментувати кожну окрему область на зображенні як новий клас, використовуючи підказку: точку або обмеження цільових зон.

Roboflow

Roboflow дозволяє розробникам легко створювати додатки комп'ютерного зору (включаючи моделі для виявлення та класифікації об'єктів). Завдяки всім необхідним інструментам для перетворення сирих зображень у кастомні треновані моделі комп'ютерного зору, Roboflow спрощує процес збору зображень, їх маркування та експорт у потрібний формат. З Roboflow ви можете швидко та легко створювати кастомно треновані моделі, які можуть бути розгорнуті в реальних додатках.

Streamlit

Streamlit — це потужний інструмент для створення інтерактивних веб-додатків на Python, особливо для проєктів з аналізу даних та машинного навчання. Він дозволяє швидко та легко створювати користувацькі інтерфейси та візуалізації без необхідності глибоких знань у фреймворках для веб-розробки.

З Streamlit ви можете писати код на Python у простому скриптовому стилі та миттєво бачити результати у вашому браузері.
текст перекладу
Він підтримує живе перезавантаження, що означає, що ваш додаток автоматично оновлюється, коли ви змінюєте свій код.

Docker

Docker — це платформа з відкритим кодом, яка дозволяє автоматизувати розгортання, масштабування та управління додатками за допомогою контейнеризації. Вона забезпечує спосіб пакування додатку та його залежностей у стандартизовану одиницю, звану контейнером. Ці контейнери є легкими, ізольованими та портативними, що дозволяє запускати додатки однаково в різних середовищах.

Щоб розгорнути в хмарному сервісі, вам потрібно створити акаунт на реєстрі Docker-образів. Для цього проєкту ми будемо використовувати Docker Hub.

Docker Hub

Docker Hub — це хмарний сервіс, наданий Docker, який дозволяє зберігати, ділитися та керувати Docker-образами. Він служить як центральний репозиторій для Docker-образів, що полегшує співпрацю розробників та команд і розповсюдження контейнеризованих додатків.

Ось деякі ключові функції та можливості Docker Hub:

  1. Зберігання образів: Docker Hub надає надійну платформу для зберігання ваших Docker-образів. Ви можете завантажити свої образи в Docker Hub і забрати їх, коли потрібно, що забезпечує легкий доступ і контроль версій.
  2. Публічні та приватні репозиторії: Docker Hub дозволяє створювати публічні та приватні репозиторії. Публічні репозиторії доступні для всіх, в той час як приватні репозиторії надають більше контролю та безпеки, обмежуючи доступ лише для авторизованих користувачів.
  3. Тегування та версії образів: Docker Hub підтримує тегування та версійність образів, що дозволяє організовувати та управляти різними версіями вашого додатку. Це дозволяє легко розгортати певні версії або здійснювати відкат при потребі.

Elastic Beanstalk

Elastic Beanstalk — це сервіс, наданий Amazon Web Services (AWS), який спрощує розгортання та управління веб-додатками. Він автоматизує процес налаштування інфраструктури, включаючи обчислювальні ресурси, балансування навантаження та масштабування, дозволяючи вам зосередитися на розробці коду вашого додатку.

Розділ 2: Підготовка кастомного набору даних за допомогою Roboflow: Анотація та аугментація

Ось як побудувати кастомний набір даних за допомогою Roboflow:

  1. Створіть акаунт у Roboflow. Ви можете зробити це безкоштовно на вебсайті Roboflow.

pic

  1. Створіть проєкт для семантичної сегментації.

pic

  1. Завантажте свої зображення. Ви можете завантажувати зображення в різних форматах, включаючи JPG, PNG та TIFF.
  • Призначте зображення своїм колегам для маркування.

pic

  1. Кроки для маркування зображень.

pic

  • a) Roboflow надає різноманітні інструменти для допомоги в маркуванні зображень.
  • b) Використовуйте інструмент Smart Polygon для того, щоб скористатися функцією SAM в Roboflow.

pic

  • c) Виберіть пори та компоненти, класифікуйте їх відповідно

*** пори (світлі плями) та компоненти (темний фон)

pic

pic

Далі додайте зображення до вашого набору даних, і Roboflow автоматично розділить зображення на тренувальний, валідаційний та тестовий набори.

pic

pic

  1. Створіть нову версію вашого набору даних. Коли ви маркуєте зображення, ви можете створити нову версію вашого набору даних.
    текст перекладу
    Це створить новий файл набору даних, який буде у правильному форматі для навчання моделі машинного навчання.
  • Додатковий крок — виконати аугментацію даних на згенерованих зображеннях перед їх генерацією.

pic

pic

  1. Експортуйте свій набір даних.
  • Ви можете експортувати свій набір даних у різних форматах, включаючи YOLOv8, TensorFlow Object Detection API та COCO.

i) Виберіть бажаний формат

pic

ii) Або завантажте архів чи згенеруйте код

pic

iii) Якщо ви завантажуєте код, ви можете використовувати його для завантаження набору даних в іншому місці.

Розділ 3: Навчання YOLO на кастомному наборі даних

Моделі навчання YOLO вже були навчены та оцінені на двох класах: пори (світлі плями) та компоненти (темний фон). Цей пост зосереджений на розгортанні на AWS Cloud. Я незабаром оновлю це повідомлення, додавши посилання на навчання YOLO.

Це включає:

  1. Навчання YOLO на двох класах: пори (світлі плями) та компоненти (Переглянути ноутбук)
  2. Валідація YOLO
  3. Використання попередньо натренованого SAM для сегментації пор та фону, використовуючи результат YOLO як підказку (Переглянути ноутбук)

Розділ 4: Прототипування додатку на Streamlit

Давайте імпортуємо необхідні пакети Python.

import streamlit as st  
from PIL import Image  
import core

І створимо основну частину додатку.

def main():  
 st.title("Завантажте зображення PCB")  

 # Завантажити зображення  
 uploaded_file = st.file_uploader(  
 "Виберіть зображення...", type=["jpg", "jpeg", "png"])  

 if uploaded_file is not None:  
 st.write(core.get_system_info())  
 # Читання зображення  
 image = Image.open(uploaded_file)  

 # Відобразити зображення  
 st.image(image, caption="Завантажене зображення",  
 width=300,) # , use_column_width=True)  
 st.write(  
 f"**Деталі зображення:** Формат: {image.format} / Розмір: {image.size} / Режим: {image.mode}")  

 with st.spinner("Обробка..."):  
 df, image_Yolo, sam_img = core.process(image, uploaded_file.name)  
 print("To display")  

 # Відобразити зображення  
 st.image(image_Yolo,   
 caption="Виявлення YOLO",  
 width=300  
 ) # , use_column_width=True)  


 # Відобразити зображення  
 st.image(sam_img, clamp=True, #channels='BGR',  
 caption="Сегментація SAM",  
 width=300  
 ) # , use_column_width=True)  

 st.dataframe(df)  
 else:  
 st.info("Будь ласка, завантажте файл зображення.")  


if __name__ == "__main__":  
 main()

Повний код можна знайти на GitHub.

Розділ 5: Dockerизація додатку

Щоб упакувати додаток разом з його залежностями, ми використовуватимемо Docker для створення контейнера. Docker дозволяє нам інкапсулювати додаток і його необхідні компоненти в образ, який можна легко відтворити та розгорнути.

Для цього нам потрібно створити Dockerfile, який є текстовим файлом, що містить інструкції для створення образу. Якщо ви новачок у Docker, не хвилюйтеся! Цей посібник надасть вам всебічне введення.

Цей Dockerfile прокоментований для легкого розуміння.

FROM python:3.8-slim-buster  
# Встановлення Git  
RUN apt-get update && apt-get install -y git  
# Оновлення pip  
RUN pip install --no-cache-dir --upgrade pip  
RUN apt-get update && apt-get install -y \  
 build-essential \  
 cmake \  
 git \  
 libatlas-base-dev \  
 libgtk2.0-dev \  
 libjpeg-dev \  
 liblapack-dev \  
 libswscale-dev \  
 pkg-config \  
 python3-dev \  
 python3-numpy \  
 software-properties-common \  
 zip  

COPY .

текст перекладу
/app  
WORKDIR /app  
RUN pip install -r requirements.txt  
EXPOSE 8080  
#ENTRYPOINT ["streamlit","run"]  
#CMD ["app.py", "--server.port", "8080"]  

# Команда для запуску додатку Streamlit і відкриття порту 8080, коли контейнер працює  
CMD streamlit run --server.port 8080 app.py

Припускаючи, що Docker встановлений і працює на вашому комп'ютері, ви можете побудувати Docker образ, використовуючи наступну команду в терміналі або командному рядку:

docker build -t / .

Ваше ім’я користувача має бути вашим ім’ям користувача на Docker Hub. Ви створили обліковий запис на Docker Hub раніше.

Розглянемо команду детальніше:

  • docker build вказує Docker на створення образу.
  • -t yourimagename присвоює ім’я образу, який ви будуєте. Замість yourimagename вкажіть бажане ім’я для вашого образу. Ви можете вибрати будь-яке ім’я.
  • . вказує контекст побудови. Точка означає поточну директорію, що означає, що Docker буде шукати Dockerfile в поточній директорії.

Після виконання команди Docker прочитає Dockerfile, виконає інструкції і створить образ на основі заданої конфігурації.

Зверніть увагу, що потрібно перейти до директорії, що містить ваш Dockerfile, перед виконанням команди docker build. Переконайтеся, що Dockerfile знаходиться в поточній директорії або вкажіть правильний шлях до Dockerfile, якщо він знаходиться в іншому місці.

Після успішного завершення процесу побудови, у вас буде Docker образ, готовий до використання для запуску вашого додатку.

Тестування додатку локально

  1. Запустіть Docker контейнер: Після успішного створення Docker образу, ви можете запустити контейнер на основі цього образу, використовуючи наступну команду:
docker run -p 8080:8080 /

Опція -p прив'язує порт 8080 на вашому локальному комп'ютері до порту 8080 всередині Docker контейнера. Коригуйте номери портів відповідно до вимог вашого додатку. Ця команда запускає контейнер і виконує ваш додаток всередині нього.

2. Доступ до вашого додатку: Коли контейнер запущено, ви можете отримати доступ до вашого додатку, відкривши веб-браузер і перейшовши за адресою http://localhost:8080. Це підключить вас до додатку Streamlit, що працює всередині Docker контейнера.

  1. Зверніть увагу, що якщо ваш додаток Streamlit використовує інший порт (наприклад, 8501), вам потрібно буде оновити команду в кроці 2 для прив'язки відповідних портів.

Розділ 6: Розгортання на AWS Elastic Beanstalk

Щоб розгорнути наш додаток на AWS, нам потрібно опублікувати наш Docker образ в реєстр, доступний для хмарного провайдера. Зверніть увагу, що цей крок не є обов'язковим, але він спрощує розгортання, пропускаючи кілька етапів конфігурації.

Docker Hub, як згадувалося раніше, є зручним вибором для цього. Якщо ви раніше не завантажували образ, клієнт Docker може запропонувати вам увійти. Ви можете ввести ті ж облікові дані, які використовували для входу на Docker Hub спочатку.

Зверніть увагу, що цей крок може зайняти деякий час, особливо якщо наш образ великий.

$ docker push / .

pic

Репозиторій Docker Hub

Тепер ми майже готові розгорнути наш образ на AWS Elastic Beanstalk (EB).

  1. Увійдіть в консоль AWS і пошукайте Elastic Beanstalk.

pic

  1. Створіть додаток

pic

3.

текст перекладу
Налаштуйте додаток

pic

pic

Виберіть Docker як платформу

pic

В розділі Application code виберіть "Upload your code" -> "Local file" і завантажте файл Dockerrun.aws.json

pic

Файл Dockerrun.aws.json описує, як розгорнути Docker образ як додаток Elastic Beanstalk. Цей JSON файл специфічний для Elastic Beanstalk. Якщо ваш додаток працює на образі, який доступний у хмарному репозиторії, ви можете вказати образ у файлі Dockerrun.aws.json v1 і не використовувати Dockerfile. Більше інформації можна знайти тут.

{  
 "AWSEBDockerrunVersion": "1",  
 "Image": {  
 "Name": "ajosegun/pcbqualitycontrol:latest",  
 "Update": "true"  
 },  
 "Ports": [  
 {  
 "ContainerPort": 8080,  
 "HostPort": 8080  
 }  
 ],  
 "Logging": "/var/log/nginx"  
}
  1. Змініть налаштування екземплярів і потужності: змініть Root volume type на General Purpose (SSD) і розмір на 20 ГБ (розмір залежить від вашого додатка).

pic

Далі виберіть правильну Capacity і змініть Instance type, щоб він відповідав вимогам вашого додатка. Можливо, вам потрібно буде вибрати потужніший екземпляр, оскільки це модель глибинного навчання.

pic

  1. Перевірте налаштування та натисніть "submit".

Elastic Beanstalk знадобиться кілька хвилин, щоб розгорнути наш додаток.

Після цього ви зможете отримати доступ до контролю якості PCB через його URL!

Висновок

У підсумку, цей посібник описує процес прототипування додатка за допомогою Streamlit і розгортання його за допомогою Docker, як локально, так і на AWS Elastic Beanstalk. Якщо у вас є питання або вам потрібно додаткове пояснення, не соромтеся ставити їх у коментарях.

Для вашої зручності, код, використаний у цьому посібнику, доступний на GitHub.

Він також містить ноутбуки для маркування даних і розробки моделі. Не соромтеся досліджувати код і використовувати його як довідку для своїх власних проектів.

Сподіваюся, цей посібник був корисним, і я з нетерпінням чекаю на допомогу з будь-якими додатковими питаннями чи темами, які ви хочете дослідити.

Автор: Олусегун Аджосе

Рецензент: Ясер Альмехіо

Перекладено з: Deploy a Quality Control (Deep Learning) Application with Streamlit, Docker and AWS Elastic Beanstalk

Leave a Reply

Your email address will not be published. Required fields are marked *