Skip to content
Open
Show file tree
Hide file tree
Changes from 82 commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
5bdd704
Initial UI setup for Geti Inspect
MarkRedeman Aug 29, 2025
918ba83
πŸš€ feat(geti-inspect): add initial backend code (#2930)
maxxgx Sep 8, 2025
82dd6b0
πŸ§ͺ test(get-inspect): add unit tests for endpoints (#2942)
maxxgx Sep 8, 2025
1588d72
Add openapi spec to gitignore
MarkRedeman Sep 4, 2025
22f8f8f
Use error page
MarkRedeman Sep 4, 2025
978a895
Delete nginx and Dockerfile
MarkRedeman Sep 4, 2025
cbb0a46
πŸ”§ chore(geti-inspect): Update Geti Inspect to react 19 (#2948)
MarkRedeman Sep 10, 2025
644f594
πŸš€ feat(geti-inspect): add training worker and predict endpoint (#2945)
maxxgx Sep 16, 2025
072ef38
πŸ”§ chore(inspect): Add Githbu Action workflows for geti inspect (#2961)
MarkRedeman Sep 18, 2025
0614756
πŸ”§ chore(inspect): Update route structure and add openapi route (#2963)
MarkRedeman Sep 22, 2025
e07a955
chore: Update package lock (#2967)
dwesolow Sep 25, 2025
61d2481
feat(geti-inspect): add pipelines (#2969)
maxxgx Sep 26, 2025
e04ef66
feat: Add sidebar with dataset, models and stats (#2970)
dwesolow Sep 29, 2025
3489422
πŸš€ feat(inspect): Add dataset list (#2971)
dwesolow Sep 29, 2025
4e160a1
πŸ”§ chore(inspect): Update UI scripts (#2974)
dwesolow Sep 29, 2025
7437855
πŸ”§ chore(inspect): Configure project(s) mocks for playwright tests (#2…
dwesolow Sep 29, 2025
590ece3
πŸš€ feat(inspect): Add project management (#2977)
dwesolow Sep 30, 2025
d9a613d
πŸ”§ chore(inspect): Update allowed origins so server can receive reques…
dwesolow Sep 30, 2025
6d51c68
πŸš€ feat(inspect): Allow user to upload images, train model and display…
dwesolow Oct 1, 2025
1baa2eb
πŸ”§ chore(inspect): Update openapi page (#2985)
dwesolow Oct 1, 2025
0a2af70
πŸ”§ chore(inspect): Rename folder structure from app to application (#2…
dwesolow Oct 3, 2025
8f1ef19
refactor(inspect): Update photo placeholder to use indicator instead …
dwesolow Oct 3, 2025
f0339cd
chore(inspect): Improve error and suspense handling in router (#2991)
MarkRedeman Oct 3, 2025
237731d
Fix path (#2993)
ashwinvaidya17 Oct 3, 2025
2a4f257
πŸ”„ refactor(inspect): Improvements to the jobs management and training…
dwesolow Oct 6, 2025
7653915
πŸ”§ chore(inspect): Add more models to be used for training (#2994)
dwesolow Oct 6, 2025
f0a7643
πŸ› fix(inspect): Use null pool for async engine (#2998)
MarkRedeman Oct 6, 2025
df8eb42
πŸ”§ chore(inspect): Update uv.lock (#2995)
dwesolow Oct 8, 2025
9fc19c1
πŸš€ feat(geti-inspect): add trainable models (#3005)
maxxgx Oct 8, 2025
3a446de
πŸš€ feat(geti-inspect): add thumbnails media endpoint (#3004)
maxxgx Oct 8, 2025
a2df1cb
chore(gitattributes): Remove uv.lock LFS entry (#3007)
MarkRedeman Oct 9, 2025
dc08cf0
πŸ”§ chore(dataset): Use thumnbail suffix to get the dataset items (#3013)
dwesolow Oct 9, 2025
b84f44c
πŸ”§ chore(inspect): Add dev command to run server and ui concurrently (…
dwesolow Oct 9, 2025
d63f53d
πŸ”„refactor(trainable models): Use trainable models from the server (#3…
dwesolow Oct 9, 2025
fed89a3
ci(inspect): Exclude application/ for geti-inspect (#3009)
MarkRedeman Oct 9, 2025
390f97f
πŸ› fix(geti-inspect): daemon worker error (#3016)
maxxgx Oct 9, 2025
f6ae55f
πŸ› fix(metrics): disable mps for torch metrics (#3018)
maxxgx Oct 10, 2025
3da55dd
πŸš€ feat(geti-inspect): add inference device selection (#3011)
maxxgx Oct 13, 2025
42c5541
πŸ”§ chore(normal images): Add `Normal images` heading (#3028)
dwesolow Oct 15, 2025
4339b78
πŸš€ feat(inference): Allow user to select media and get the inference (…
dwesolow Oct 15, 2025
931af9c
πŸ”§ chore(inference): convert to jet and add opacity (#3029)
ashwinvaidya17 Oct 15, 2025
cdeeaff
πŸš€ feat(inference): Display inference on top of the image + opacity (#…
dwesolow Oct 16, 2025
6ddb323
πŸ”§ chore(geti-inspect): configure loggers (#3039)
maxxgx Oct 21, 2025
be6fe07
chore(inspect): minor UI improvements (#3040)
MarkRedeman Oct 22, 2025
31c3d2f
chore (inspect): improve logs (add uvicorn handler) and add job_id to…
maxxgx Oct 22, 2025
701aca5
feat(inspect): add training device selection (#3056)
maxxgx Oct 27, 2025
6bf1e55
feat(inspect): Add train model dialog, job logs and models dataset (#…
MarkRedeman Oct 27, 2025
71ca2c1
chore(inspect): improve SSE generator (#3060)
maxxgx Oct 28, 2025
1d14bf1
bug(inspect): add missing db commit (#3075)
maxxgx Oct 28, 2025
dace0f0
Refactor(inspect): sources and sinks under project (#3079)
maxxgx Nov 3, 2025
cf91762
feat(inspect): delete media endpoint (#3082)
maxxgx Nov 4, 2025
9096eb7
Merge branch 'main' into feature/geti-inspect
maxxgx Nov 5, 2025
87a1efe
feat(inspect): add, remove list and connect sources (#3078)
camiloHimura Nov 5, 2025
19a3461
chore(inspect): fix pre commit and GHA (#3084)
maxxgx Nov 5, 2025
64fe8ea
feat(inspect): add, remove list and connect sinks (#3087)
camiloHimura Nov 5, 2025
32f527a
πŸš€ feat(inspect): Add progressbar (#3045)
ashwinvaidya17 Nov 6, 2025
1d7b9c7
fix(inspect): fix pipeline conflict (#3090)
maxxgx Nov 7, 2025
1a08bee
chore(inspect): improve openapi spec (#3100)
maxxgx Nov 10, 2025
22aa6df
feat(inspect): Pipeline enable/disable (#3097)
camiloHimura Nov 11, 2025
5008712
feat(inspeect): add alembic migration (#3103)
maxxgx Nov 11, 2025
0500abf
feat(inspect): Inference devices (#3106)
camiloHimura Nov 12, 2025
48365ba
🐞 fix(application): set validation split to synthetic (#3111)
ashwinvaidya17 Nov 13, 2025
ab12f0e
feat(inspect): Stream autoplay (#3110)
camiloHimura Nov 13, 2025
12fa1a4
feat(inspect): Device selection in training model dialog (#3094)
ActiveChooN Nov 14, 2025
e8476dc
feat(inspect): allow webRTC streaming passthrough (#3114)
maxxgx Nov 14, 2025
0202e60
refactor(inspect): update metrics service to be up to date with Geti …
maxxgx Nov 14, 2025
80e459a
feat(inspect): Enable/Disable project (#3117)
camiloHimura Nov 18, 2025
bdad999
feat(inspect): add stop pipeline endpoint (#3124)
maxxgx Nov 19, 2025
0b08527
feat(inspect): exported model size (#3126)
ActiveChooN Nov 19, 2025
8adc3a1
feat(inspect): Fix backend job cancellation (#3122)
ActiveChooN Nov 19, 2025
0773110
feat(inspect): Enable/Disable inference (#3127)
camiloHimura Nov 19, 2025
9990aca
feat(inspect): Model deletion endpoint (#3128)
ActiveChooN Nov 20, 2025
5cb2bc6
Add docker files
ashwinvaidya17 Nov 21, 2025
a9c5f70
Fix non-root user mounting issues
ashwinvaidya17 Nov 21, 2025
09d9f27
feat(inspect): enhance ModelsView (#3135)
ActiveChooN Nov 21, 2025
40c5e5a
Merge branch 'feature/geti-inspect' into ashwin/feature/dockerfile_2
ashwinvaidya17 Nov 24, 2025
4d09a21
Update Dockerfile to include g++ and modify CORS settings in main.py …
ashwinvaidya17 Nov 24, 2025
0a232b8
fix proxy issue
ashwinvaidya17 Nov 24, 2025
c7ebce5
cuda build
ashwinvaidya17 Nov 25, 2025
ef63ed2
Add XPU build
ashwinvaidya17 Nov 27, 2025
f0ef85b
Merge branch 'feature/geti-inspect' into ashwin/feature/dockerfile_2
ashwinvaidya17 Nov 27, 2025
c0d3c78
Fix conflicts
ashwinvaidya17 Nov 27, 2025
438a499
Comment XPU settings
ashwinvaidya17 Nov 27, 2025
70f05fa
Merge branch 'feature/geti-inspect' into ashwin/feature/dockerfile_2
ashwinvaidya17 Dec 1, 2025
39209fc
Merge branch 'feature/geti-inspect' into ashwin/feature/dockerfile_2
ashwinvaidya17 Dec 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 100 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# Git
.git
.gitignore
.gitattributes

# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
.pytest_cache/
.coverage
htmlcov/
.tox/
.nox/
.hypothesis/

# Virtual environments
venv/
env/
ENV/
.venv

# IDEs
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store

# Node
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Application data (will be mounted as volumes)
application/backend/data/**
application/backend/logs/**
application/backend/openvino_cache/**
application/backend/tests/**
application/backend/**/__pycache__/**
application/backend/.*_cache/**
application/backend/.tmp/**
application/backend/.venv/**
application/ui/dist/
application/ui/build/
application/ui/node_modules/
data/

# Documentation and examples
docs/
examples/
*.md
!README.md

# CI/CD
.github/
.gitlab-ci.yml
.travis.yml

# Testing
tests/
*.test.js
*.spec.js
coverage/

# Temporary files
tmp/
temp/
*.tmp
*.log

# Datasets and model artifacts
datasets/
pre_trained/
results/
openvino_cache/

# Experiment tracking and logs
wandb/
lightning_logs/
mlruns/
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -176,3 +176,7 @@ docs/source/_build/
wandb/
lightning_logs/
mlruns

# application data
data/
logs/
154 changes: 154 additions & 0 deletions application/.packaging/docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
#------------------------------------------
# Web UI Build Stage
#------------------------------------------
FROM node:24-alpine3.22@sha256:3e843c608bb5232f39ecb2b25e41214b958b0795914707374c8acc28487dea17 AS web-ui-base

WORKDIR /home/app/web_ui/

COPY --link application/ui/package.json ./package.json
COPY --link application/ui/package-lock.json ./package-lock.json
COPY --link application/ui/packages ./packages
RUN npm ci --audit=false --ignore-scripts


COPY --link application/ui/tsconfig.json ./tsconfig.json
COPY --link application/ui/rsbuild.config.ts ./rsbuild.config.ts
COPY --link application/ui/src ./src

ENV PUBLIC_API_BASE_URL=""
ENV PUBLIC_API_BASE_URL=${PUBLIC_API_BASE_URL}

FROM web-ui-base AS web-ui


RUN npm run build


#------------------------------------------
# Geti Inspect Base with UI built
#------------------------------------------
FROM python:3.13-slim@sha256:58c30f5bfaa718b5803a53393190b9c68bd517c44c6c94c1b6c8c172bcfad040 AS geti-inspect-base
COPY --from=docker.io/astral/uv:0.9.7@sha256:ba4857bf2a068e9bc0e64eed8563b065908a4cd6bfb66b531a9c424c8e25e142 /uv /uvx /bin/
ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy
ENV UV_PYTHON_DOWNLOADS=0


# Create non-root user and group
RUN groupadd --gid 10001 non-root && \
useradd --uid 10001 --gid 10001 --create-home --shell /bin/bash non-root

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
libgl1 \
libglib2.0-0 \
g++ \
nginx=1.26.* \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean

ENV PATH=/app/.venv/bin:$PATH
WORKDIR /app
ENV PYTHONPATH=/app

COPY --chown=non-root:non-root application/.packaging/docker/nginx.conf /etc/nginx/nginx.conf
COPY --chown=non-root:non-root --from=web-ui /home/app/web_ui/dist /usr/share/nginx/html

# Copy anomalib source code (pyproject.toml depends on README and LICENSE as well)
COPY --chown=non-root:non-root src ./src
COPY --chown=non-root:non-root pyproject.toml uv.lock ./
COPY --chown=non-root:non-root LICENSE ./LICENSE
COPY --chown=non-root:non-root README.md ./README.md

# Copy backend application
COPY --chown=non-root:non-root application/backend /app/application/backend

# Create nginx directories and set ownership for non-root user
RUN mkdir -p /var/lib/nginx/body /var/lib/nginx/proxy /var/lib/nginx/fastcgi \
/var/lib/nginx/uwsgi /var/lib/nginx/scgi /var/run/nginx \
&& chown -R non-root:non-root /var/lib/nginx /var/run/nginx /var/log/nginx \
&& chmod -R 755 /var/lib/nginx /var/run/nginx /var/log/nginx

# Create data and logs directories with write permissions for mounted volumes
RUN mkdir -p /app/data /app/logs \
&& chown -R non-root:non-root /app


#------------------------------------------
# Geti Inspect CPU version
#------------------------------------------
FROM geti-inspect-base AS geti-inspect-cpu
USER non-root
WORKDIR /app

RUN --mount=type=cache,target=/home/non-root/.cache/uv,uid=10001,gid=10001 \
uv sync --frozen --no-dev --extra cpu --extra application
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why run uv sync from the root anomalib folder instead of application?

Installing inspect as an extra might be useful during development but I don't see the value in production environments


EXPOSE 80

CMD ["sh", "-c", "nginx && exec geti-inspect"]

#------------------------------------------
# Geti Inspect CUDA version
#------------------------------------------
FROM geti-inspect-base AS geti-inspect-cuda

RUN apt-get update \
&& apt-get install -y --no-install-recommends wget=1.25.0-2 \
&& wget -q https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb \
&& dpkg -i cuda-keyring_1.1-1_all.deb \
&& rm -rf cuda-keyring_1.1-1_all.deb \
&& apt-get remove -y wget

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
cuda-cudart-12-4 \
libcublas-12-4 \
libcufft-12-4 \
libcurand-12-4 \
libcusolver-12-4 \
libcusparse-12-4 \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean

USER non-root
WORKDIR /app

RUN --mount=type=cache,target=/home/non-root/.cache/uv,uid=10001,gid=10001 \
uv sync --frozen --no-dev --extra cu124 --extra application

EXPOSE 80

CMD ["sh", "-c", "nginx && exec geti-inspect"]

#------------------------------------------
# Geti Inspect XPU version
#------------------------------------------
FROM geti-inspect-base AS geti-inspect-xpu

RUN apt-get update \
&& apt-get install -y --no-install-recommends wget gpg \
&& wget -qO - https://repositories.intel.com/gpu/intel-graphics.key | \
gpg --yes --dearmor --output /usr/share/keyrings/intel-graphics.gpg \
&& echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu jammy unified" | \
tee /etc/apt/sources.list.d/intel-gpu-jammy.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends \
libze-intel-gpu1 \
libze1 \
intel-opencl-icd \
clinfo \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get remove -y wget gpg \
&& apt-get clean

RUN groupadd -f render && usermod -aG render non-root

USER non-root
WORKDIR /app

RUN --mount=type=cache,target=/home/non-root/.cache/uv,uid=10001,gid=10001 \
uv sync --frozen --no-dev --extra xpu --extra application

EXPOSE 80

CMD ["sh", "-c", "nginx && exec geti-inspect"]
28 changes: 28 additions & 0 deletions application/.packaging/docker/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Docker distribution for Geti Inspect

## To create CPU build

```bash
cd application/.packaging/docker
docker compose up
```

## To create XPU build

> [!NOTE]
> You need to first set the `RENDER_GROUP_ID` environment variable to match your host system's render group ID.

```bash
cd application/.packaging/docker
RENDER_GROUP_ID=$(getent group render | cut -d: -f3) AI_DEVICE=xpu docker compose up
```

## To create CUDA build

> [!NOTE]
> You need to uncomment the `deploy:` section in the `docker-compose.yml` file to enable GPU support.

```bash
cd application/.packaging/docker
AI_DEVICE=cuda docker compose up
```
56 changes: 56 additions & 0 deletions application/.packaging/docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
x-proxy-list: &proxy-list
- HTTP_PROXY=${HTTP_PROXY}
- HTTPS_PROXY=${HTTPS_PROXY}
- NO_PROXY=${NO_PROXY}
- http_proxy=${http_proxy}
- https_proxy=${https_proxy}
- no_proxy=${no_proxy}

x-proxies: &proxies
args: *proxy-list

services:
geti-inspect:
image: geti-inspect-${AI_DEVICE:-cpu}:${TAG:-latest}
environment: *proxy-list
restart: unless-stopped
build:
# Use root directory as context to build the image
context: ../../..
dockerfile: application/.packaging/docker/Dockerfile
target: geti-inspect-${AI_DEVICE:-cpu}
<<: *proxies
working_dir: /app
container_name: geti-inspect-${AI_DEVICE:-cpu}
group_add:
- "${RENDER_GROUP_ID}" # This is needed to allow access to the 'render' group for torch XPU support
volumes:
# Persist database and uploaded data
- backend-data:/app/data
# Persist logs
- backend-logs:/app/logs
ports:
- "80:80"

Check warning

Code scanning / Semgrep OSS

Semgrep Finding: trailofbits.yaml.docker-compose.port-all-interfaces.port-all-interfaces Warning

Service port is exposed on all interfaces
# Increase file descriptor limits
ulimits:
nofile:
soft: 65536
hard: 65536
# Uncomment the following lines to enable GPU support (NVIDIA GPUs only)
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
# Map all host devices to provide access to webcams and other attached devices
privileged: true
devices:
- /dev:/dev

volumes:
backend-data:
driver: local
backend-logs:
driver: local
Loading
Loading