Мультимодальная (текст + изображение + табличные признаки) офлайновая система для классификации товаров на контрафакт / оригинал. Проект запускается локально и/или в Docker, поддерживает офлайн-зависимости и опциональный OCR через Tesseract. Проект был выполнен в рамках хакатона E-CUP 2025.
- Три модальности: текст (локальная HF‑модель), изображение (CLIP + линейная голова), таблица (sklearn‑pipeline).
- Гибкая агрегация:
weighted | mean | max+ настраиваемые веса. - Выход:
results/submission.csvи отладочныйresults/debug.csv. - Опциональный OCR (Tesseract
rus+eng) — можно подмешать распознанный текст к текстовой модальности флагом--use_ocr. - Полностью офлайновый режим (по желанию) — CLIP можно ставить из локального
third_party/CLIP.
├─ data/
│ ├─ imgs/
│ ├─ data.csv
│ └─ data_full.csv
├─ image_model/
│ ├─ classifier_checkpoint.pth
│ ├─ classifier_checkpoint3.pth
│ └─ ViT-B-32.pt
├─ results/
├─ src/
│ ├─ main.py
│ ├─ text_analyze.py
│ ├─ image_analyze.py
│ └─ tabular_analyze.py
├─ table_model/
│ └─ f1_pipeline_final.pkl
├─ text_model/ # локальная HF-модель
│ ├─ config.json
│ ├─ model.safetensors
│ ├─ tokenizer.json / tokenizer_config.json / vocab.txt
│ └─ special_tokens_map.json
├─ run_example.sh
├─ requirements.txt
├─ Dockerfile
└─ README.md
- Python 3.10+ (для Docker используется
python:3.10-slim). - PyTorch, Transformers, scikit‑learn, pandas, Pillow и т.д. — см.
requirements.txt. - OCR (опционально): системный пакет
tesseract-ocr+ языкtesseract-ocr-rus.
- Онлайн:
requirements.txtсодержитgit+https://github.com/openai/CLIP.git. - Офлайн: положите код CLIP в
third_party/CLIPи замените вrequirements.txtна-e ./third_party/CLIP.
- Входной CSV по умолчанию:
./data/data.csv. - Обязательные столбцы:
id,name_rus,description. (Если нетid— будет создан.) - Опционально:
resolution(0/1) — для подсчёта F1 и автоподбора порога (--auto_threshold). - Изображения: по умолчанию ищутся как
data/imgs/<id>.jpg|.png|.jpeg|.webpили по явному имени файла из столбца--img_col.
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
python -m src.main \
--csv_path ./data/data.csv \
--image_folder ./data/imgs \
--text_model_dir ./text_model \
--clip_model ./image_model/ViT-B-32.pt \
--classifier_path ./image_model/classifier_checkpoint3.pth \
--tabular_model_path ./table_model/f1_pipeline_final.pkl \
--out_csv ./results/submission.csvДобавьте флаг --use_ocr и убедитесь, что установлен Tesseract (rus+eng).
docker build -t ecup2025 .docker run --rm -v "$(pwd)":/project -w /project ecup2025 \
bash -lc "python -m src.main --csv_path ./data/data.csv --image_folder ./data/imgs \
--text_model_dir ./text_model --clip_model ./image_model/ViT-B-32.pt \
--classifier_path ./image_model/classifier_checkpoint3.pth \
--tabular_model_path ./table_model/f1_pipeline_final.pkl \
--out_csv ./results/submission.csv"docker build -t ecup2025 .; docker run --rm -v "${PWD}:/project" -w /project ecup2025 bash -lc "python -m src.main --csv_path ./data/data.csv --image_folder ./data/imgs --text_model_dir ./text_model --clip_model ./image_model/ViT-B-32.pt --classifier_path ./image_model/classifier_checkpoint3.pth --tabular_model_path ./table_model/f1_pipeline_final.pkl --out_csv ./results/submission.csv"Для OCR добавьте
--use_ocrвнутри кавычек. Для GPU при наличии CUDA добавьте--gpus allкdocker run.
Важно (Windows): Ошибка вида //./pipe/dockerDesktopLinuxEngine означает, что Docker Desktop не запущен/не выбран Linux‑контекст. Откройте Docker Desktop → Switch to Linux containers или docker context use desktop-linux.
--csv_path, --image_folder, --text_model_dir
--clip_model, --classifier_path, --tabular_model_path
--id_col, --name_col, --desc_col, --img_col, --img_ext
--agg {weighted,mean,max} --w_text --w_img --w_tab
--threshold 0.5 | --auto_threshold
--device cpu|cuda
--use_ocr # подмешать распознанный с изображения текст
--disable_text --disable_image --disable_tabular
Пример с весами и автопорогом:
python -m src.main \
--csv_path ./data/data_full.csv \
--agg weighted --w_text 0.4 --w_img 0.4 --w_tab 0.2 \
--auto_threshold \
--out_csv ./results/submission.csvresults/submission.csv— столбцы:id, prediction(0/1).results/debug.csv— диагностика:text_prob, image_prob, tabular_prob, final_prob, pred.- В логах печатается
F1(если в данных естьresolution).
- В Docker образе должен быть установлен
tesseract-ocrи языкtesseract-ocr-rus. - Быстрая проверка внутри контейнера:
tesseract --version && tesseract --list-langs | head -n 5- Если Tesseract недоступен,
--use_ocrпросто не добавит текст (пустая строка), пайплайн продолжит работу.
См. run_example.sh — создаёт results/ и прокидывает все параметры из командной строки ("$@").