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.
- tissue_tile_quality_filter-0.1.0/.dockerignore +43 -0
- tissue_tile_quality_filter-0.1.0/.github/copilot-instructions.md +35 -0
- tissue_tile_quality_filter-0.1.0/.github/workflows/publish.yml +31 -0
- tissue_tile_quality_filter-0.1.0/.github/workflows/test.yml +43 -0
- tissue_tile_quality_filter-0.1.0/.gitignore +39 -0
- tissue_tile_quality_filter-0.1.0/.python-version +1 -0
- tissue_tile_quality_filter-0.1.0/DOCKER.md +105 -0
- tissue_tile_quality_filter-0.1.0/Dockerfile +58 -0
- tissue_tile_quality_filter-0.1.0/PKG-INFO +137 -0
- tissue_tile_quality_filter-0.1.0/README.md +123 -0
- tissue_tile_quality_filter-0.1.0/docker-compose.yml +17 -0
- tissue_tile_quality_filter-0.1.0/docs/python_api_usage.py +111 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/kaggle_tiles/SOB_B_A-14-22549AB-100-001.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/kaggle_tiles/SOB_B_A-14-22549AB-100-009.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/kaggle_tiles/SOB_B_A-14-22549AB-100-020.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0000.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0001.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0002.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0003.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0004.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0005.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0006.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0007.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0008.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0009.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0010.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0011.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0012.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0013.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0014.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0015.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0016.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0017.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0018.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0019.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0020.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0021.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0022.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0023.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0024.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0025.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0026.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0027.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0028.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0029.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0030.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0031.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0032.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0033.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0034.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0035.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0036.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0037.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0038.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0039.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0040.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0041.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0042.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0043.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0044.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0045.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0046.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0047.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0048.png +0 -0
- tissue_tile_quality_filter-0.1.0/example_tiles/synthetic_tiles/tile_0049.png +0 -0
- tissue_tile_quality_filter-0.1.0/prek.toml +8 -0
- tissue_tile_quality_filter-0.1.0/pyproject.toml +63 -0
- tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/__init__.py +36 -0
- tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/__main__.py +133 -0
- tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/config.py +53 -0
- tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/exporter.py +273 -0
- tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/models.py +178 -0
- tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/pipeline.py +343 -0
- tissue_tile_quality_filter-0.1.0/src/tissue_tile_quality_filter/quality_checks.py +201 -0
- tissue_tile_quality_filter-0.1.0/tests/conftest.py +164 -0
- tissue_tile_quality_filter-0.1.0/tests/test_cli.py +344 -0
- tissue_tile_quality_filter-0.1.0/tests/test_coverage_extensions.py +342 -0
- tissue_tile_quality_filter-0.1.0/tests/test_exporter.py +279 -0
- tissue_tile_quality_filter-0.1.0/tests/test_models.py +226 -0
- tissue_tile_quality_filter-0.1.0/tests/test_pipeline.py +197 -0
- tissue_tile_quality_filter-0.1.0/tests/test_quality_checks.py +236 -0
- 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
|