#!/usr/bin/env bash # # DXA Quality Assessment — единая точка входа. # # Использование: ./run.sh <команда> [аргументы] # ./run.sh train [доп. аргументы для src.dxa.train] # ./run.sh infer <вход> <выход.xlsx|.csv> [доп. аргументы] # ./run.sh serve [порт] # ./run.sh test # # Скрипт намеренно не содержит своей реализации обучения и инференса: вся # логика живёт в Python-модулях, а здесь только вызовы. Дублирование цикла # обучения (как было раньше) приводило к расхождению правил между режимами. set -euo pipefail GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m' PYTHON=${PYTHON:-python3} DATA_ROOT=${DATA_ROOT:-dataset_hack} ANNOTATION_PATH=${ANNOTATION_PATH:-"dataset_hack/НД_для_обучения/разметка.xlsx"} MODEL_PATH=${MODEL_PATH:-models/dxa_model.pth} PORT=${PORT:-8000} command=${1:-help} shift || true case "$command" in train) echo -e "${YELLOW}Обучение классификатора качества DXA${NC}" "$PYTHON" -m src.dxa.train \ --data-root "$DATA_ROOT" \ --annotation-path "$ANNOTATION_PATH" \ --output-dir "$(dirname "$MODEL_PATH")" \ "$@" echo -e "${GREEN}Готово. Чекпоинт: ${MODEL_PATH}${NC}" ;; infer) input_path=${1:-dataset_hack/Для теста} output_path=${2:-results.xlsx} shift 2 2>/dev/null || true echo -e "${YELLOW}Пакетная обработка${NC}" echo " вход: $input_path" echo " выход: $output_path" "$PYTHON" -m src.dxa.inference \ --input-path "$input_path" \ --output-path "$output_path" \ --model-path "$MODEL_PATH" \ "$@" echo -e "${GREEN}Готово: ${output_path}${NC}" ;; serve) echo -e "${YELLOW}Запуск API на порту ${PORT}${NC}" DXA_MODEL_PATH="$MODEL_PATH" \ "$PYTHON" -m uvicorn src.main:app --host 0.0.0.0 --port "$PORT" ;; test) echo -e "${YELLOW}Запуск тестов${NC}" "$PYTHON" -m pytest tests/ -q ;; help|*) cat <<'USAGE' DXA Quality Assessment — управление запуском Команды: train [аргументы] Обучить классификатор качества. Пример: ./run.sh train --epochs 100 --head mlp infer <вход> <выход> [арг.] Пакетная обработка DICOM (файл или каталог). Пример: ./run.sh infer "dataset_hack/Для теста" results.xlsx Дополнительно: --zip-out masks.zip serve [порт] Запустить HTTP API и веб-интерфейс. test Запустить тесты. Переменные окружения: DATA_ROOT Каталог датасета (по умолчанию dataset_hack) ANNOTATION_PATH Excel с разметкой (только для отчёта о расхождениях) MODEL_PATH Путь к чекпоинту (по умолчанию models/dxa_model.pth) PORT Порт API (по умолчанию 8000) PYTHON Интерпретатор (по умолчанию python3) Типовой порядок работы: ./run.sh train # обучить модель ./run.sh infer dataset_hack results.xlsx ./run.sh serve # веб-интерфейс на http://localhost:8000 USAGE ;; esac