Мультиконтейнерное приложение для идентификации и визуализации дефектов сварного шва на панорамных изображениях-рентгенограммах.
Полезные ссылки:
-
Датасеты:
- Базовый: https://disk.yandex.ru/d/pKCLfDHbFPIAjA
- Тестовое множество: https://disk.yandex.ru/d/nLc7Op9koStaxg
-
Jupiter Nootbook команды, занявшей 2 место: https://www.kaggle.com/code/antonoof/gazprom-yolo11x-instance-segmentation
В основе — дообученная модель Ultralytics YOLOv8, которая распознаёт следующие типов дефектов:
0: "пора"
1: "включение"
2: "подрез"
3: "прожог"
4: "трещина"
5: "наплыв"
6: "эталон1"
7: "эталон2"
8: "эталон3"
9: "пора-скрытая"
10: "утяжина"
11: "несплавление"
12: "непровар корня"
Сервис | Образ | Порт | Кратко |
---|---|---|---|
frontend-service | ai_weld_analisys-frontend-service |
8000 |
Приём панорамы, порезка на тайлы, запрос к ML-ядру, сохранение результатов в PostgreSQL, генерация Word-отчёта и отдача статических файлов (HTML + JS + CSS). |
ml-service | ai_weld_analisys-ml-service |
8001 |
YOLO-модель (ultralytics ) + post-processing; отдаёт JSON с найденными дефектами для каждого тайла. |
postgres | postgres:15-alpine |
5432 |
Хранит изображения и детекции. |
otel-collector | otel/opentelemetry-collector-contrib |
4317 |
Трассировка OTel – прием и передача в jaeger . |
jaeger | jaegertracing/all-in-one |
16686 |
Веб-UI для просмотра трассировки. |
Требования: Docker Desktop ≥ v20, Docker Compose ≥ v2, ~4 GB RAM.
- Клонируем репозиторий
git clone https://github.com/EgorSinitsyn/AI_weld_analisys
cd AI_weld_analisys/
- Сборка и запуск приложения
docker-compose up --build
- Открываем в браузере клиент http://localhost:8000
- Для просмотра трассировки открываем http://localhost:16686
- Остановка приложения
docker-compose down
- Запуск сервисов, переход на http://localhost:8000 (см. п. 3)
- Загрузка изображения-панорамы
- Пользователь нажимает на кнопку "Выберите изображение" и прикрепляет файл с расширением
.png
или.jpg
, на котором необходимо распознать дефекты.
- Пользователь нажимает на кнопку "Выберите изображение" и прикрепляет файл с расширением
- Нарезка & отправка в ML-ядро
- Frontend вычисляет размер и режет панораму на тайлы (16 / 27 / 28 частей — зависит от размера) и параллельно отправляет их на
ml-service:8001/detect
.
- Frontend вычисляет размер и режет панораму на тайлы (16 / 27 / 28 частей — зависит от размера) и параллельно отправляет их на
- Инференс YOLO
- ML-ядро (дообученная модель Ultralytics YOLO) делает предсказания и возвращает JSON: список bbox-ов/масок с классом, уверенностью, координатами и вычисленной «длиной по линейке».
{ "status": "success", "detections": [ { "class": "lack_of_fusion", "confidence": 0.87, "coordinates": "x1=123, y1=456, x2=234, y2=345", "index": 3, "length": 42 } ] }
- Агрегация результатов
- Frontend собирает ответы по всем тайлам и в интерфейсе отображает информацию об обнаруженных дефектах.
- Визуализация & скачивание
- Одновременно вызывается
PanoramaProcessor
, который
рисует боксы / маски на исходной панораме и сохраняет файл
вstatic/results/processed_<имя>.jpg
. - Кнопка «Открыть результат» ведёт прямо к этому JPG
- Генерируется Word-отчёт
static/reports/defects_report.docx
со сводной таблицей и статистикой — доступен для скачивания в один клик по нажатию "Скачать отчет" - PS кнопки "Открыть результат" и "Скачать отчет" будут активны только после завершения обработки всех тайлов в самом низу веб-страницы. Полный цикл обработки 1 панорамы от момента загрузки до появления кнопок занимает в среднем 15-20 сек.
- Одновременно вызывается
- Сохранение в PostgreSQL
- Исходная картинка + JSON-детекции кладутся в таблицы
images
иdetected
(см.app/models.py
). - Это позволит строить историю инспекций, вести аналитику и т. д.
- Исходная картинка + JSON-детекции кладутся в таблицы
- Трассировка
- Все запросы к сервисам логируются в Jaeger, что позволяет отслеживать производительность и выявлять узкие места.
- Для просмотра трассировки открываем http://localhost:16686