CeramicNet — проект для поиска клейм на старинных керамических изделиях и их сопоставления с каталогом эталонов.
- Фото изделия: на вход подается обычная фотография тарелки, чашки или вазы (обычно снимок донца с клеймом).
- Детекция (RT-DETR v2-S): нейросеть находит область клейма и вырезает ее.
-
Предобработка (CLAHE): алгоритм убирает засветы, проявляет затертые линии рельефа и приводит картинку к квадрату
$224 \times 224$ px. - Векторизация (Энкодер клейм): энкодер превращает изображение клейма в вектор из 384 чисел, описывающий его геометрическую форму.
- Поиск по базе: вектор сравнивается со всеми эталонами из каталогов по косинусному сходству за пару миллисекунд.
- Результат: список наиболее похожих клейм из справочников с указанием завода, книги, страницы и процента совпадения.
- Детектор (RT-DETR v2-S) — локализует клеймо на керамике (
weights/detection_weights/rtdetr_v2_s.onnx). Точный безанкорный трансформерный детектор (end-to-end без NMS), обученный находить клейма и устойчивый к фоновым элементам (орнаментам, трещинам, дефектам глазури). - Энкодер (student_encoder_katya) — извлекает компактные признаки клейма (
weights/retrieval_weights/student_encoder_katya.onnx). Дистиллированная модель, обученная сопоставлять реальные фрагменты керамики с эталонными оттисками из книг. - Индекс эталонов — готовая база клейм из справочников, сохраненная в виде матрицы векторов в файле
data/books_index/books_index_student_encoder_katya.npz. Новые клейма можно добавлять в базу без переобучения моделей.
Требуется Python версии 3.9 или выше.
git clone https://github.com/mmmishaa/CeramicNet
cd CeramicNet
python -m venv .venv
source .venv/bin/activate # Для Linux/macOS
# .venv\Scripts\activate # Для Windows
pip install -r requirements.txtДля первого запуска системы нужно выполнить два простых шага:
По умолчанию скачивается только необходимый рабочий набор: веса актуального детектора (rtdetr_v2_s.onnx), энкодера (student_encoder_katya.onnx) и архив справочников клейм (books.zip):
Для получения доступа к архиву и ID папки на Google Drive обратитесь к авторам репозитория.
python -m scripts.download_artifacts --folder_id <ID_ПАПКИ_GOOGLE_DRIVE>Скрипт загрузит веса в weights/ и распакует справочники в data/books/.
Перед первым запуском необходимо один раз собрать векторный индекс по справочникам (если готовый .npz не был скачан):
python scripts/build_index.pyСкрипт пропустит все эталонные клейма из data/books/ через энкодер и сохранит векторную базу в data/books_index/books_index_student_encoder_katya.npz.
После этого система полностью готова к поиску и распознаванию.
- Полная загрузка для разработки (
--dev): скачивает все файлы, включая полный датасет обучающих фотографий керамики (ceramic_dataset.zip) и экспериментальные веса:python -m scripts.download_artifacts --folder_id <ID_ПАПКИ> --dev
- Выборочная загрузка: можно скачать только отдельные категории артефактов через флаги
--detection,--retrieval,--books,--dataset:# Скачать только справочники клейм python -m scripts.download_artifacts --folder_id <ID_ПАПКИ> --books
- Просмотр файлов в папке без скачивания:
python -m scripts.download_artifacts --folder_id <ID_ПАПКИ> --list
Вся работа с системой выполняется через скрипт main.py.
Запуск пайплайна на случайном снимке с показом окна с результатом:
python main.py --random 1 --showpython main.py --input path/to/plate.jpg --showpython main.py --input path/to/folder/ --top-k 5Если у вас уже есть кроп клейма, детектор можно отключить флагом --no-detect:
python main.py --input path/to/stamp.png --no-detect --showpython main.py --input path/to/plate.jpg --top-k 5 --show--input <путь>— путь к файлу изображения или к папке с изображениями.--random [N]— взять N случайных снимков из датасета (по умолчанию 1).--top-k <число>— сколько похожих клейм выводить в ответе (по умолчанию 10).--no-detect— отключить детектор и передать изображение напрямую в энкодер.--show— открыть окно с визуализацией: исходное фото, рамка детекции и найденные эталоны.--model <имя>— альтернативная модель энкодера из конфига (по умолчанию активнаяstudent_encoder_katya).--detection-config <путь>— путь к конфигу детектора (по умолчаниюconfigs/detection/detection_config.yaml).--retrieval-config <путь>— путь к конфигу ретривала (по умолчаниюconfigs/retrieval/retrieval_config.yaml).
CeramicNet/
├── configs/ # Конфигурационные файлы
│ ├── detection/ # Пороги и параметры детектора
│ └── retrieval/ # Параметры энкодеров и каталогов
├── data/ # Данные (скачиваются скриптом)
│ ├── books/ # Сканы справочников клейм
│ ├── books_index/ # Векторный индекс эталонов (.npz)
│ └── ceramic_dataset/ # Фотографии керамики (при флаге --dev)
├── notebooks/ # Ноутбуки обучения (Kaggle / ClearML)
│ ├── detection/yolo/ # Обучение YOLO26s
│ └── retrieval/ # Обучение энкодера DINOv2
├── scripts/ # Вспомогательные скрипты
│ ├── build_index.py # Построение векторного индекса эталонов
│ └── download_artifacts.py # Скачивание весов и данных с Google Drive
├── src/ # Исходный код системы
│ ├── detection/ # Модуль детекции на ONNX Runtime
│ ├── retrieval/ # Энкодер DINOv2, индекс, книги
│ └── pipeline.py # Логика сквозного пайплайна
├── weights/ # Веса моделей ONNX
└── main.py # Главная точка входа
