tissue-tile-quality-filter 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. tissue_tile_quality_filter-0.1.0/.dockerignore +43 -0
  2. tissue_tile_quality_filter-0.1.0/.github/copilot-instructions.md +35 -0
  3. tissue_tile_quality_filter-0.1.0/.github/workflows/publish.yml +31 -0
  4. tissue_tile_quality_filter-0.1.0/.github/workflows/test.yml +43 -0
  5. tissue_tile_quality_filter-0.1.0/.gitignore +39 -0
  6. tissue_tile_quality_filter-0.1.0/.python-version +1 -0
  7. tissue_tile_quality_filter-0.1.0/DOCKER.md +105 -0
  8. tissue_tile_quality_filter-0.1.0/Dockerfile +58 -0
  9. tissue_tile_quality_filter-0.1.0/PKG-INFO +137 -0
  10. tissue_tile_quality_filter-0.1.0/README.md +123 -0
  11. tissue_tile_quality_filter-0.1.0/docker-compose.yml +17 -0
  12. tissue_tile_quality_filter-0.1.0/docs/python_api_usage.py +111 -0
  13. tissue_tile_quality_filter-0.1.0/example_tiles/kaggle_tiles/SOB_B_A-14-22549AB-100-001.png +0 -0
  14. tissue_tile_quality_filter-0.1.0/example_tiles/kaggle_tiles/SOB_B_A-14-22549AB-100-009.png +0 -0
  15. tissue_tile_quality_filter-0.1.0/example_tiles/kaggle_tiles/SOB_B_A-14-22549AB-100-020.png +0 -0
  16. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0000.png +0 -0
  17. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0001.png +0 -0
  18. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0002.png +0 -0
  19. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0003.png +0 -0
  20. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0004.png +0 -0
  21. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0005.png +0 -0
  22. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0006.png +0 -0
  23. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0007.png +0 -0
  24. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0008.png +0 -0
  25. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0009.png +0 -0
  26. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0010.png +0 -0
  27. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0011.png +0 -0
  28. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0012.png +0 -0
  29. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0013.png +0 -0
  30. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0014.png +0 -0
  31. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0015.png +0 -0
  32. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0016.png +0 -0
  33. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0017.png +0 -0
  34. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0018.png +0 -0
  35. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0019.png +0 -0
  36. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0020.png +0 -0
  37. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0021.png +0 -0
  38. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0022.png +0 -0
  39. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0023.png +0 -0
  40. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0024.png +0 -0
  41. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0025.png +0 -0
  42. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0026.png +0 -0
  43. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0027.png +0 -0
  44. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0028.png +0 -0
  45. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0029.png +0 -0
  46. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0030.png +0 -0
  47. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0031.png +0 -0
  48. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0032.png +0 -0
  49. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0033.png +0 -0
  50. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0034.png +0 -0
  51. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0035.png +0 -0
  52. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0036.png +0 -0
  53. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0037.png +0 -0
  54. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0038.png +0 -0
  55. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0039.png +0 -0
  56. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0040.png +0 -0
  57. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0041.png +0 -0
  58. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0042.png +0 -0
  59. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0043.png +0 -0
  60. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0044.png +0 -0
  61. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0045.png +0 -0
  62. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0046.png +0 -0
  63. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0047.png +0 -0
  64. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0048.png +0 -0
  65. tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0049.png +0 -0
  66. tissue_tile_quality_filter-0.1.0/prek.toml +8 -0
  67. tissue_tile_quality_filter-0.1.0/pyproject.toml +63 -0
  68. tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/__init__.py +36 -0
  69. tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/__main__.py +133 -0
  70. tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/config.py +53 -0
  71. tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/exporter.py +273 -0
  72. tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/models.py +178 -0
  73. tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/pipeline.py +343 -0
  74. tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/quality_checks.py +201 -0
  75. tissue_tile_quality_filter-0.1.0/tests/conftest.py +164 -0
  76. tissue_tile_quality_filter-0.1.0/tests/test_cli.py +344 -0
  77. tissue_tile_quality_filter-0.1.0/tests/test_coverage_extensions.py +342 -0
  78. tissue_tile_quality_filter-0.1.0/tests/test_exporter.py +279 -0
  79. tissue_tile_quality_filter-0.1.0/tests/test_models.py +226 -0
  80. tissue_tile_quality_filter-0.1.0/tests/test_pipeline.py +197 -0
  81. tissue_tile_quality_filter-0.1.0/tests/test_quality_checks.py +236 -0
  82. tissue_tile_quality_filter-0.1.0/uv.lock +852 -0
@@ -0,0 +1,43 @@
1
+ # Git
2
+ .git/
3
+ .gitignore
4
+
5
+ # Python
6
+ __pycache__/
7
+ *.py[cod]
8
+ *$py.class
9
+ .venv/
10
+ .env
11
+ *.egg-info/
12
+ dist/
13
+ build/
14
+
15
+ # Testing
16
+ .pytest_cache/
17
+ .coverage
18
+ htmlcov/
19
+ .ruff_cache/
20
+
21
+ # IDE
22
+ .vscode/
23
+ .history/
24
+
25
+ # Project-specific
26
+ example_tiles/
27
+ kaggle_results/
28
+ test_results/
29
+ demo_results/
30
+ test_output/
31
+ kaggle_test_output/
32
+ results/
33
+
34
+ # Documentation
35
+ docs/
36
+
37
+ # CI/CD
38
+ .github/
39
+
40
+ # OS
41
+ .DS_Store
42
+ *.swp
43
+ *.swo
@@ -0,0 +1,35 @@
1
+ # Tissue Tile Quality Filter Copilot Instructions
2
+
3
+ ## Critical Rules - Git Operations
4
+
5
+ ### 🚫 ABSOLUTE RESTRICTION
6
+ - **ONLY** allowed git command: `git status` (read-only, informational)
7
+ - **NEVER** run without explicit user permission:
8
+ - `git add`
9
+ - `git commit`
10
+ - `git push`
11
+ - `git pull`
12
+ - `git reset`
13
+ - `git branch`
14
+ - Any other git command that modifies the repository
15
+
16
+ ### ⚠️ Protocol
17
+ - **Always ask the user first** before executing ANY git command except `git status`
18
+ - Wait for explicit approval before proceeding
19
+ - Example: "Should I enable this feature? Permission to run `git add`?"
20
+
21
+ ## Stack
22
+ -⁠ ⁠uv for dependency management, ruff for linting
23
+
24
+ ## Key rules
25
+ - ⁠All new dependencies go through ⁠ uv add ⁠
26
+ - ⁠Follow ruff formatting rules
27
+ - Add type hints to all functions and variables where possible
28
+ - Write docstrings for all functions and classes
29
+ - Full logging and error handling for all operations
30
+ - Never put import statements inside functions; all imports must be at the top of the file
31
+ - Remove basic examples from docstrings to keep them concise; focus on describing parameters, return values, and behavior instead
32
+ - Do not add icons unless explicitly requested
33
+
34
+
35
+
@@ -0,0 +1,31 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+
15
+ - name: Set up Python
16
+ uses: actions/setup-python@v4
17
+ with:
18
+ python-version: "3.11"
19
+
20
+ - name: Install uv
21
+ run: pip install --no-cache-dir uv
22
+
23
+ - name: Build package
24
+ run: |
25
+ uv pip install --system build
26
+ python -m build
27
+
28
+ - name: Publish to PyPI
29
+ uses: pypa/gh-action-pypi-publish@release/v1
30
+ with:
31
+ password: ${{ secrets.PYPI_API_TOKEN }}
@@ -0,0 +1,43 @@
1
+ name: Tests & Linting
2
+
3
+ on:
4
+ push:
5
+ branches: [main, dev]
6
+ pull_request:
7
+ branches: [main, dev]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.11"]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Set up Python ${{ matrix.python-version }}
20
+ uses: actions/setup-python@v4
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+
24
+ - name: Install uv
25
+ run: pip install --no-cache-dir uv
26
+
27
+ - name: Sync dependencies
28
+ run: uv sync
29
+
30
+ - name: Run pytest
31
+ run: uv run pytest tests/ -v --cov=src --cov-report=xml
32
+
33
+ - name: Upload coverage to Codecov
34
+ uses: codecov/codecov-action@v3
35
+ with:
36
+ file: ./coverage.xml
37
+ fail_ci_if_error: false
38
+
39
+ - name: Type check with Pylance
40
+ run: uv run ty check
41
+
42
+ - name: Lint with ruff
43
+ run: uv run ruff check
@@ -0,0 +1,39 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # Environment
13
+ .env
14
+
15
+ # custom
16
+ .DS_Store
17
+
18
+ # backups and logs
19
+ .history/
20
+ *.log
21
+
22
+ # Ruff
23
+ .ruff_cache/
24
+
25
+ # Testing and Coverage
26
+ .pytest_cache/
27
+ .coverage
28
+ .coverage.*
29
+ htmlcov/
30
+ .hypothesis/
31
+
32
+ # Generated outputs (DO NOT commit)
33
+ kaggle_results/
34
+ test_results/
35
+ demo_results/
36
+ test_output/
37
+ kaggle_test_output/
38
+ docker_results/
39
+ results/
@@ -0,0 +1 @@
1
+ 3.11
@@ -0,0 +1,105 @@
1
+ # Docker Usage Guide
2
+
3
+ This document explains how to build and run the Tissue Tile Quality Filter using Docker.
4
+
5
+ ## Why Docker?
6
+
7
+ - **Reproducibility**: Same environment across all machines
8
+ - **Isolation**: No dependency conflicts with your system
9
+ - **Portability**: Run on any machine with Docker installed
10
+ - **Scalability**: Easy to run multiple containers in parallel
11
+
12
+ ## Quick Start
13
+
14
+ ### 1. Build the image
15
+
16
+ ```bash
17
+ docker build -t tissue-tile-quality-filter:v0.1.0 .
18
+ ```
19
+
20
+ ### 2. Run with Docker
21
+
22
+ Process tiles from the `example_tiles/synthetic_tiles` directory:
23
+
24
+ ```bash
25
+ docker run --rm \
26
+ -v ./example_tiles/synthetic_tiles:/input:ro \
27
+ -v ./docker_results:/output:rw \
28
+ tissue-tile-quality-filter:v0.1.0 \
29
+ process /input --output /output --verbose
30
+ ```
31
+
32
+ ### 3. Check the results
33
+
34
+ Results are saved to `./docker_results/`:
35
+ ```bash
36
+ ls -la docker_results/
37
+ ```
38
+
39
+ ## Docker Commands Reference
40
+
41
+ ### Show help
42
+ ```bash
43
+ docker run --rm tissue-tile-quality-filter:v0.1.0 --help
44
+ ```
45
+
46
+ ### Display package info
47
+ ```bash
48
+ docker run --rm tissue-tile-quality-filter:v0.1.0 info
49
+ ```
50
+
51
+ ### Process with custom options
52
+ ```bash
53
+ docker run --rm \
54
+ -v ./example_tiles/kaggle_tiles:/input:ro \
55
+ -v ./docker_results:/output:rw \
56
+ tissue-tile-quality-filter:v0.1.0 \
57
+ process /input \
58
+ --batch-id my_batch \
59
+ --threshold high \
60
+ --output /output \
61
+ --workers 4 \
62
+ --verbose
63
+ ```
64
+
65
+ ## Using Docker Compose
66
+
67
+ For convenience, use `docker-compose.yml`:
68
+
69
+ ### Build and run
70
+ ```bash
71
+ docker-compose up --build
72
+ ```
73
+
74
+ ### Override the command
75
+ ```bash
76
+ docker-compose run --rm tissue-tile-quality-filter \
77
+ process /data/input/kaggle_tiles --threshold high --output /data/output --verbose
78
+ ```
79
+
80
+ ## Volume Mounting Explanation
81
+
82
+ - `-v ./example_tiles/synthetic_tiles:/input:ro`
83
+ - Host directory: `./example_tiles/synthetic_tiles` (your local tiles)
84
+ - Container path: `/input` (where the container sees them)
85
+ - `:ro` = read-only (prevents accidental modification)
86
+
87
+ - `-v ./docker_results:/output:rw`
88
+ - Host directory: `./docker_results` (created if it doesn't exist)
89
+ - Container path: `/output` (where results are written)
90
+ - `:rw` = read-write
91
+
92
+ ## Image Details
93
+
94
+ ### Base Image
95
+ - `python:3.11-slim` - Official Python 3.11 slim image (~150MB)
96
+
97
+ ### Multi-stage Build
98
+ - **Stage 1 (Builder)**: Compiles dependencies in isolation
99
+ - **Stage 2 (Runtime)**: Contains only runtime files, minimal size (~800MB)
100
+
101
+ ### Security
102
+ - Non-root user (`appuser`, UID 1000)
103
+ - Read-only filesystem where possible
104
+ - No unnecessary packages
105
+
@@ -0,0 +1,58 @@
1
+ # Multi-stage Dockerfile for Tissue Tile Quality Filter
2
+ # Version: 0.1.0
3
+
4
+ # Stage 1: Build stage
5
+ FROM python:3.11-slim AS builder
6
+
7
+ # Install uv package manager
8
+ RUN pip install --no-cache-dir uv
9
+
10
+ WORKDIR /build
11
+
12
+ # Copy dependency files and README (required by pyproject.toml for build system)
13
+ COPY pyproject.toml README.md ./
14
+
15
+ # Copy source code
16
+ COPY src/ ./src/
17
+
18
+ # Create venv and install dependencies
19
+ RUN uv venv /opt/venv && \
20
+ uv pip install --python /opt/venv/bin/python .
21
+
22
+ # Stage 2: Runtime stage
23
+ FROM python:3.11-slim
24
+
25
+ # Install runtime dependencies (OpenCV needs some system packages)
26
+ RUN apt-get update && apt-get install -y --no-install-recommends \
27
+ libsm6 \
28
+ libxext6 \
29
+ libxrender-dev \
30
+ libgl1 \
31
+ libglib2.0-0 \
32
+ && rm -rf /var/lib/apt/lists/*
33
+
34
+ WORKDIR /app
35
+
36
+ # Copy virtual environment from builder
37
+ COPY --from=builder /opt/venv /opt/venv
38
+
39
+ # Copy application source code
40
+ COPY src/ ./src/
41
+
42
+ # Set environment variables
43
+ ENV PATH="/opt/venv/bin:$PATH" \
44
+ PYTHONUNBUFFERED=1 \
45
+ PYTHONDONTWRITEBYTECODE=1
46
+
47
+ # Create a non-root user for security
48
+ RUN useradd -m -u 1000 appuser && \
49
+ chown -R appuser:appuser /app
50
+
51
+ LABEL org.opencontainers.image.title="Tissue Tile Quality Filter" \
52
+ org.opencontainers.image.version="0.1.0" \
53
+ org.opencontainers.image.description="Production-grade histology tile quality assessment pipeline"
54
+
55
+ # Set the CLI as the entrypoint
56
+ ENTRYPOINT ["python", "-m", "tissue_tile_quality_filter"]
57
+
58
+ USER appuser
@@ -0,0 +1,137 @@
1
+ Metadata-Version: 2.4
2
+ Name: tissue-tile-quality-filter
3
+ Version: 0.1.0
4
+ Summary: A Python pipeline for histology image tile quality filtering with blur detection and tissue coverage analysis
5
+ Requires-Python: >=3.11
6
+ Requires-Dist: click>=8.0.0
7
+ Requires-Dist: opencv-python>=4.8.0
8
+ Requires-Dist: pandas>=2.0.0
9
+ Requires-Dist: pillow>=10.0.0
10
+ Requires-Dist: pyarrow>=14.0.0
11
+ Requires-Dist: pydantic>=2.0.0
12
+ Requires-Dist: python-dotenv>=1.0.0
13
+ Description-Content-Type: text/markdown
14
+
15
+ # Tissue Tile Quality Filter Pipeline
16
+
17
+ A production-grade Python pipeline for automated quality assessment of histology image tiles. Detects blur, tissue coverage, and filters tiles based on configurable quality thresholds.
18
+
19
+ ---
20
+
21
+ ## Installation
22
+
23
+ ### From PyPI (recommended)
24
+ ```bash
25
+ pip install tissue-tile-quality-filter
26
+ ```
27
+
28
+ ### From source (development)
29
+ ```bash
30
+ git clone https://github.com/sinemdemirkayabudak/tissue-tile-quality-filter.git
31
+ cd tissue-tile-quality-filter
32
+ uv sync
33
+ ```
34
+
35
+ ---
36
+
37
+ ## Usage
38
+
39
+ There are two ways to use this package: **CLI** for quick batch processing, or **Python API** for integration into your own code.
40
+
41
+ ### CLI Usage
42
+
43
+ Process a directory of tiles from the command line:
44
+
45
+ ```bash
46
+ # Basic usage (installed via pip)
47
+ tissue-tile-quality-filter process ./tiles
48
+
49
+ # With options
50
+ tissue-tile-quality-filter process ./tiles \
51
+ --batch-id my_batch \
52
+ --threshold high \
53
+ --output ./results \
54
+ --workers 4 \
55
+ --verbose
56
+
57
+ # View quality thresholds
58
+ tissue-tile-quality-filter info
59
+ ```
60
+
61
+ If running from source (development):
62
+ ```bash
63
+ # Development usage (with uv)
64
+ uv run tissue-tile-quality-filter process ./tiles --verbose
65
+ ```
66
+
67
+ **Options:**
68
+ - `--output, -o`: Output directory (default: `./results`)
69
+ - `--batch-id, -b`: Batch identifier (default: `batch_001`)
70
+ - `--threshold, -t`: Quality threshold: `high`, `medium`, `low` (default: `medium`)
71
+ - `--workers, -w`: Number of parallel workers (default: auto-detect CPU count)
72
+ - `--verbose, -v`: Enable verbose output
73
+
74
+ ### Python API Usage
75
+
76
+ Integrate the pipeline into your own Python code:
77
+
78
+ ```python
79
+ from pathlib import Path
80
+ from tissue_tile_quality_filter import TileQualityFilterPipeline, export_to_csv
81
+
82
+ # Initialize pipeline
83
+ pipeline = TileQualityFilterPipeline(
84
+ batch_id="my_batch",
85
+ pass_threshold="medium",
86
+ max_workers=4 # Parallel processing
87
+ )
88
+
89
+ # Process directory
90
+ batch_report = pipeline.process_directory(Path("./tiles"))
91
+
92
+ # Export results
93
+ export_to_csv(batch_report, Path("./results/tiles.csv"))
94
+
95
+ # Access batch statistics
96
+ print(f"Passed: {batch_report.passed_tiles}/{batch_report.total_tiles}")
97
+ print(f"Pass rate: {batch_report.pass_rate:.1f}%")
98
+ ```
99
+
100
+ See [docs/python_api_usage.py](docs/python_api_usage.py) for complete examples.
101
+
102
+ ---
103
+
104
+ ## Docker
105
+
106
+ Run the pipeline in a containerized environment for reproducibility and portability.
107
+
108
+ ### Using pre-built image (recommended)
109
+ ```bash
110
+ # Pull from Docker registry
111
+ docker pull sinembudak/tissue-tile-quality-filter:v0.1.0
112
+
113
+ # Process tiles using volume mount
114
+ docker run --rm \
115
+ -v ./example_tiles/synthetic_tiles:/input:ro \
116
+ -v ./docker_results:/output:rw \
117
+ sinembudak/tissue-tile-quality-filter:v0.1.0 \
118
+ process /input --output /output --verbose
119
+
120
+ # View available commands
121
+ docker run --rm sinembudak/tissue-tile-quality-filter:v0.1.0 --help
122
+ ```
123
+
124
+ ### Building from source
125
+ ```bash
126
+ # Build the image locally
127
+ docker build -t tissue-tile-quality-filter:v0.1.0 .
128
+
129
+ # Run the local build
130
+ docker run --rm \
131
+ -v ./example_tiles/synthetic_tiles:/input:ro \
132
+ -v ./docker_results:/output:rw \
133
+ tissue-tile-quality-filter:v0.1.0 \
134
+ process /input --output /output --verbose
135
+ ```
136
+
137
+ See [DOCKER.md](DOCKER.md) for complete Docker documentation.
@@ -0,0 +1,123 @@
1
+ # Tissue Tile Quality Filter Pipeline
2
+
3
+ A production-grade Python pipeline for automated quality assessment of histology image tiles. Detects blur, tissue coverage, and filters tiles based on configurable quality thresholds.
4
+
5
+ ---
6
+
7
+ ## Installation
8
+
9
+ ### From PyPI (recommended)
10
+ ```bash
11
+ pip install tissue-tile-quality-filter
12
+ ```
13
+
14
+ ### From source (development)
15
+ ```bash
16
+ git clone https://github.com/sinemdemirkayabudak/tissue-tile-quality-filter.git
17
+ cd tissue-tile-quality-filter
18
+ uv sync
19
+ ```
20
+
21
+ ---
22
+
23
+ ## Usage
24
+
25
+ There are two ways to use this package: **CLI** for quick batch processing, or **Python API** for integration into your own code.
26
+
27
+ ### CLI Usage
28
+
29
+ Process a directory of tiles from the command line:
30
+
31
+ ```bash
32
+ # Basic usage (installed via pip)
33
+ tissue-tile-quality-filter process ./tiles
34
+
35
+ # With options
36
+ tissue-tile-quality-filter process ./tiles \
37
+ --batch-id my_batch \
38
+ --threshold high \
39
+ --output ./results \
40
+ --workers 4 \
41
+ --verbose
42
+
43
+ # View quality thresholds
44
+ tissue-tile-quality-filter info
45
+ ```
46
+
47
+ If running from source (development):
48
+ ```bash
49
+ # Development usage (with uv)
50
+ uv run tissue-tile-quality-filter process ./tiles --verbose
51
+ ```
52
+
53
+ **Options:**
54
+ - `--output, -o`: Output directory (default: `./results`)
55
+ - `--batch-id, -b`: Batch identifier (default: `batch_001`)
56
+ - `--threshold, -t`: Quality threshold: `high`, `medium`, `low` (default: `medium`)
57
+ - `--workers, -w`: Number of parallel workers (default: auto-detect CPU count)
58
+ - `--verbose, -v`: Enable verbose output
59
+
60
+ ### Python API Usage
61
+
62
+ Integrate the pipeline into your own Python code:
63
+
64
+ ```python
65
+ from pathlib import Path
66
+ from tissue_tile_quality_filter import TileQualityFilterPipeline, export_to_csv
67
+
68
+ # Initialize pipeline
69
+ pipeline = TileQualityFilterPipeline(
70
+ batch_id="my_batch",
71
+ pass_threshold="medium",
72
+ max_workers=4 # Parallel processing
73
+ )
74
+
75
+ # Process directory
76
+ batch_report = pipeline.process_directory(Path("./tiles"))
77
+
78
+ # Export results
79
+ export_to_csv(batch_report, Path("./results/tiles.csv"))
80
+
81
+ # Access batch statistics
82
+ print(f"Passed: {batch_report.passed_tiles}/{batch_report.total_tiles}")
83
+ print(f"Pass rate: {batch_report.pass_rate:.1f}%")
84
+ ```
85
+
86
+ See [docs/python_api_usage.py](docs/python_api_usage.py) for complete examples.
87
+
88
+ ---
89
+
90
+ ## Docker
91
+
92
+ Run the pipeline in a containerized environment for reproducibility and portability.
93
+
94
+ ### Using pre-built image (recommended)
95
+ ```bash
96
+ # Pull from Docker registry
97
+ docker pull sinembudak/tissue-tile-quality-filter:v0.1.0
98
+
99
+ # Process tiles using volume mount
100
+ docker run --rm \
101
+ -v ./example_tiles/synthetic_tiles:/input:ro \
102
+ -v ./docker_results:/output:rw \
103
+ sinembudak/tissue-tile-quality-filter:v0.1.0 \
104
+ process /input --output /output --verbose
105
+
106
+ # View available commands
107
+ docker run --rm sinembudak/tissue-tile-quality-filter:v0.1.0 --help
108
+ ```
109
+
110
+ ### Building from source
111
+ ```bash
112
+ # Build the image locally
113
+ docker build -t tissue-tile-quality-filter:v0.1.0 .
114
+
115
+ # Run the local build
116
+ docker run --rm \
117
+ -v ./example_tiles/synthetic_tiles:/input:ro \
118
+ -v ./docker_results:/output:rw \
119
+ tissue-tile-quality-filter:v0.1.0 \
120
+ process /input --output /output --verbose
121
+ ```
122
+
123
+ See [DOCKER.md](DOCKER.md) for complete Docker documentation.
@@ -0,0 +1,17 @@
1
+ version: '3.8'
2
+
3
+ services:
4
+ tissue-tile-quality-filter:
5
+ build:
6
+ context: .
7
+ dockerfile: Dockerfile
8
+ image: tissue-tile-quality-filter:v0.1.0
9
+ volumes:
10
+ # Mount input tiles directory
11
+ - ./example_tiles:/data/input:ro
12
+ # Mount output directory
13
+ - ./docker_results:/data/output:rw
14
+ environment:
15
+ - PYTHONUNBUFFERED=1
16
+ # Example command (override with actual command)
17
+ command: process /data/input/synthetic_tiles --output /data/output --verbose