Мультимодальная (текст + изображение + табличные признаки) офлайновая система для классификации товаров на контрафакт / оригинал. Проект запускается локально и/или в 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.csv- results/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/ и прокидывает все параметры из командной строки ("$@").