pureframe 0.1.0b1__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.
- pureframe-0.1.0b1/.github/ISSUE_TEMPLATE/bug_report.yml +51 -0
- pureframe-0.1.0b1/.github/dependabot.yml +19 -0
- pureframe-0.1.0b1/.github/workflows/ci.yml +52 -0
- pureframe-0.1.0b1/.github/workflows/codeql.yml +35 -0
- pureframe-0.1.0b1/.github/workflows/publish.yml +57 -0
- pureframe-0.1.0b1/.github/workflows/release.yml +53 -0
- pureframe-0.1.0b1/.gitignore +50 -0
- pureframe-0.1.0b1/BENCHMARKS.md +76 -0
- pureframe-0.1.0b1/CHANGELOG.md +15 -0
- pureframe-0.1.0b1/LAUNCH.md +33 -0
- pureframe-0.1.0b1/LICENSE +21 -0
- pureframe-0.1.0b1/PKG-INFO +221 -0
- pureframe-0.1.0b1/README.md +178 -0
- pureframe-0.1.0b1/RELEASE_CHECKLIST.md +79 -0
- pureframe-0.1.0b1/ROADMAP.md +16 -0
- pureframe-0.1.0b1/SECURITY.md +5 -0
- pureframe-0.1.0b1/VERIFICATION_NOTES.md +51 -0
- pureframe-0.1.0b1/assets/demo.gif +0 -0
- pureframe-0.1.0b1/assets/logo.png +0 -0
- pureframe-0.1.0b1/assets/logo.svg +68 -0
- pureframe-0.1.0b1/docs/CONTRIBUTING.md +47 -0
- pureframe-0.1.0b1/docs/architecture.md +31 -0
- pureframe-0.1.0b1/docs/legal.md +24 -0
- pureframe-0.1.0b1/docs/plan-sharing.md +26 -0
- pureframe-0.1.0b1/docs/privacy.md +5 -0
- pureframe-0.1.0b1/examples/configs/cpu.toml +8 -0
- pureframe-0.1.0b1/examples/configs/strict.toml +8 -0
- pureframe-0.1.0b1/examples/sample.censorplan.json +29 -0
- pureframe-0.1.0b1/gui/.gitignore +24 -0
- pureframe-0.1.0b1/gui/README.md +7 -0
- pureframe-0.1.0b1/gui/components.json +25 -0
- pureframe-0.1.0b1/gui/index.html +14 -0
- pureframe-0.1.0b1/gui/package-lock.json +8224 -0
- pureframe-0.1.0b1/gui/package.json +38 -0
- pureframe-0.1.0b1/gui/postcss.config.js +6 -0
- pureframe-0.1.0b1/gui/public/tauri.svg +6 -0
- pureframe-0.1.0b1/gui/public/vite.svg +1 -0
- pureframe-0.1.0b1/gui/src/App.css +116 -0
- pureframe-0.1.0b1/gui/src/App.tsx +330 -0
- pureframe-0.1.0b1/gui/src/assets/react.svg +1 -0
- pureframe-0.1.0b1/gui/src/components/ui/button.tsx +67 -0
- pureframe-0.1.0b1/gui/src/index.css +89 -0
- pureframe-0.1.0b1/gui/src/lib/utils.ts +6 -0
- pureframe-0.1.0b1/gui/src/main.tsx +10 -0
- pureframe-0.1.0b1/gui/src/vite-env.d.ts +1 -0
- pureframe-0.1.0b1/gui/src-tauri/.gitignore +7 -0
- pureframe-0.1.0b1/gui/src-tauri/Cargo.lock +5059 -0
- pureframe-0.1.0b1/gui/src-tauri/Cargo.toml +27 -0
- pureframe-0.1.0b1/gui/src-tauri/build.rs +3 -0
- pureframe-0.1.0b1/gui/src-tauri/capabilities/default.json +10 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/128x128.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/128x128@2x.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/32x32.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/Square107x107Logo.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/Square142x142Logo.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/Square150x150Logo.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/Square284x284Logo.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/Square30x30Logo.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/Square310x310Logo.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/Square44x44Logo.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/Square71x71Logo.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/Square89x89Logo.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/StoreLogo.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/icon.icns +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/icon.ico +0 -0
- pureframe-0.1.0b1/gui/src-tauri/icons/icon.png +0 -0
- pureframe-0.1.0b1/gui/src-tauri/src/lib.rs +113 -0
- pureframe-0.1.0b1/gui/src-tauri/src/main.rs +6 -0
- pureframe-0.1.0b1/gui/src-tauri/tauri.conf.json +35 -0
- pureframe-0.1.0b1/gui/tailwind.config.js +12 -0
- pureframe-0.1.0b1/gui/tsconfig.json +29 -0
- pureframe-0.1.0b1/gui/tsconfig.node.json +10 -0
- pureframe-0.1.0b1/gui/vite.config.ts +38 -0
- pureframe-0.1.0b1/pureframe/__init__.py +1 -0
- pureframe-0.1.0b1/pureframe/batch.py +127 -0
- pureframe-0.1.0b1/pureframe/checkpoint.py +145 -0
- pureframe-0.1.0b1/pureframe/cli.py +628 -0
- pureframe-0.1.0b1/pureframe/config.py +52 -0
- pureframe-0.1.0b1/pureframe/data/deploy.prototxt +1790 -0
- pureframe-0.1.0b1/pureframe/data/res10_300x300_ssd_iter_140000.caffemodel +0 -0
- pureframe-0.1.0b1/pureframe/hardware.py +96 -0
- pureframe-0.1.0b1/pureframe/pipeline/__init__.py +1 -0
- pureframe-0.1.0b1/pureframe/pipeline/densify.py +60 -0
- pureframe-0.1.0b1/pureframe/pipeline/detect/__init__.py +1 -0
- pureframe-0.1.0b1/pureframe/pipeline/detect/audio.py +122 -0
- pureframe-0.1.0b1/pureframe/pipeline/detect/face.py +44 -0
- pureframe-0.1.0b1/pureframe/pipeline/detect/nudity.py +91 -0
- pureframe-0.1.0b1/pureframe/pipeline/detect/scene.py +44 -0
- pureframe-0.1.0b1/pureframe/pipeline/detect/scene_clip.py +136 -0
- pureframe-0.1.0b1/pureframe/pipeline/fuse.py +107 -0
- pureframe-0.1.0b1/pureframe/pipeline/probe.py +7 -0
- pureframe-0.1.0b1/pureframe/pipeline/render/__init__.py +1 -0
- pureframe-0.1.0b1/pureframe/pipeline/render/apply.py +70 -0
- pureframe-0.1.0b1/pureframe/pipeline/render/plan.py +62 -0
- pureframe-0.1.0b1/pureframe/pipeline/sample.py +64 -0
- pureframe-0.1.0b1/pureframe/pipeline/shots.py +111 -0
- pureframe-0.1.0b1/pureframe/pipeline/smooth.py +91 -0
- pureframe-0.1.0b1/pureframe/tracking/__init__.py +1 -0
- pureframe-0.1.0b1/pureframe/tracking/iou_tracker.py +77 -0
- pureframe-0.1.0b1/pureframe/utils/__init__.py +1 -0
- pureframe-0.1.0b1/pureframe/utils/ffmpeg.py +287 -0
- pureframe-0.1.0b1/pureframe/utils/logging.py +13 -0
- pureframe-0.1.0b1/pyproject.toml +60 -0
- pureframe-0.1.0b1/pytest.ini +3 -0
- pureframe-0.1.0b1/scripts/bench.py +67 -0
- pureframe-0.1.0b1/scripts/make_demo.py +142 -0
- pureframe-0.1.0b1/scripts/make_demo_gif.sh +68 -0
- pureframe-0.1.0b1/scripts/make_smoke_test_clip.sh +24 -0
- pureframe-0.1.0b1/scripts/run_benchmarks.sh +20 -0
- pureframe-0.1.0b1/tests/__init__.py +1 -0
- pureframe-0.1.0b1/tests/conftest.py +97 -0
- pureframe-0.1.0b1/tests/fixtures/synthetic_explicit.mp4 +0 -0
- pureframe-0.1.0b1/tests/test_audio_classifier.py +35 -0
- pureframe-0.1.0b1/tests/test_batch.py +164 -0
- pureframe-0.1.0b1/tests/test_clip_classifier.py +29 -0
- pureframe-0.1.0b1/tests/test_e2e.py +172 -0
- pureframe-0.1.0b1/tests/test_fuse.py +106 -0
- pureframe-0.1.0b1/tests/test_iou_tracker.py +37 -0
- pureframe-0.1.0b1/tests/test_kiss_mouth_region.py +32 -0
- pureframe-0.1.0b1/tests/test_plan_apply.py +110 -0
- pureframe-0.1.0b1/tests/test_plan_serialize.py +167 -0
- pureframe-0.1.0b1/tests/test_probe.py +12 -0
- pureframe-0.1.0b1/tests/test_shots.py +33 -0
- pureframe-0.1.0b1/tests/test_smoothing.py +35 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Create a report to help us improve
|
|
3
|
+
title: "[BUG] "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for taking the time to fill out this bug report!
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: what-happened
|
|
12
|
+
attributes:
|
|
13
|
+
label: What happened?
|
|
14
|
+
description: Also tell us what you expected to happen.
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
- type: textarea
|
|
18
|
+
id: command
|
|
19
|
+
attributes:
|
|
20
|
+
label: Command executed
|
|
21
|
+
description: What exact CLI command did you run?
|
|
22
|
+
render: bash
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: traceback
|
|
27
|
+
attributes:
|
|
28
|
+
label: Error Traceback / Logs
|
|
29
|
+
description: Paste any error messages, logs, or tracebacks here.
|
|
30
|
+
render: log
|
|
31
|
+
- type: input
|
|
32
|
+
id: os
|
|
33
|
+
attributes:
|
|
34
|
+
label: Operating System
|
|
35
|
+
description: e.g. Windows 11, Ubuntu 22.04, macOS Sonoma
|
|
36
|
+
validations:
|
|
37
|
+
required: true
|
|
38
|
+
- type: input
|
|
39
|
+
id: python-version
|
|
40
|
+
attributes:
|
|
41
|
+
label: Python Version
|
|
42
|
+
description: Run `python --version`
|
|
43
|
+
validations:
|
|
44
|
+
required: true
|
|
45
|
+
- type: input
|
|
46
|
+
id: gpu
|
|
47
|
+
attributes:
|
|
48
|
+
label: GPU / Hardware
|
|
49
|
+
description: e.g. RTX 3060, M2 Max, CPU only
|
|
50
|
+
validations:
|
|
51
|
+
required: true
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "pip"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
- package-ecosystem: "npm"
|
|
8
|
+
directory: "/gui"
|
|
9
|
+
schedule:
|
|
10
|
+
interval: "weekly"
|
|
11
|
+
- package-ecosystem: "cargo"
|
|
12
|
+
directory: "/gui/src-tauri"
|
|
13
|
+
schedule:
|
|
14
|
+
interval: "weekly"
|
|
15
|
+
- package-ecosystem: "github-actions"
|
|
16
|
+
directory: "/"
|
|
17
|
+
schedule:
|
|
18
|
+
interval: "monthly"
|
|
19
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [master, main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [master, main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
name: test (ubuntu, py${{ matrix.python-version }})
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: false
|
|
15
|
+
matrix:
|
|
16
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
22
|
+
uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: ${{ matrix.python-version }}
|
|
25
|
+
cache: "pip"
|
|
26
|
+
|
|
27
|
+
- name: Install ffmpeg
|
|
28
|
+
run: sudo apt-get update && sudo apt-get install -y ffmpeg
|
|
29
|
+
|
|
30
|
+
- name: Install CPU-only PyTorch first
|
|
31
|
+
run: |
|
|
32
|
+
python -m pip install --upgrade pip
|
|
33
|
+
pip install torch --index-url https://download.pytorch.org/whl/cpu
|
|
34
|
+
|
|
35
|
+
- name: Install package
|
|
36
|
+
run: pip install -e ".[dev]"
|
|
37
|
+
|
|
38
|
+
- name: Ruff lint
|
|
39
|
+
run: ruff check pureframe tests
|
|
40
|
+
|
|
41
|
+
- name: Ruff format
|
|
42
|
+
run: ruff format --check pureframe tests
|
|
43
|
+
|
|
44
|
+
- name: Build package
|
|
45
|
+
run: python -m build
|
|
46
|
+
|
|
47
|
+
- name: Check package
|
|
48
|
+
run: python -m twine check dist/*
|
|
49
|
+
|
|
50
|
+
- name: Run fast tests
|
|
51
|
+
run: pytest -q -m "not slow" --maxfail=3
|
|
52
|
+
timeout-minutes: 10
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: "CodeQL"
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ "master" ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ "master" ]
|
|
8
|
+
schedule:
|
|
9
|
+
- cron: '0 0 * * 1'
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
analyze:
|
|
13
|
+
name: Analyze
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
permissions:
|
|
16
|
+
actions: read
|
|
17
|
+
contents: read
|
|
18
|
+
security-events: write
|
|
19
|
+
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
language: [ 'python', 'javascript', 'typescript', 'rust' ]
|
|
24
|
+
|
|
25
|
+
steps:
|
|
26
|
+
- name: Checkout repository
|
|
27
|
+
uses: actions/checkout@v4
|
|
28
|
+
|
|
29
|
+
- name: Initialize CodeQL
|
|
30
|
+
uses: github/codeql-action/init@v3
|
|
31
|
+
with:
|
|
32
|
+
languages: ${{ matrix.language }}
|
|
33
|
+
|
|
34
|
+
- name: Perform CodeQL Analysis
|
|
35
|
+
uses: github/codeql-action/analyze@v3
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# .github/workflows/publish.yml
|
|
2
|
+
name: Publish Python Package
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
tags:
|
|
7
|
+
- "v*"
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build:
|
|
11
|
+
name: Build distribution
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
with:
|
|
17
|
+
persist-credentials: false
|
|
18
|
+
|
|
19
|
+
- name: Set up Python
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: "3.13"
|
|
23
|
+
|
|
24
|
+
- name: Install build tools
|
|
25
|
+
run: python -m pip install --upgrade build twine
|
|
26
|
+
|
|
27
|
+
- name: Build package
|
|
28
|
+
run: python -m build
|
|
29
|
+
|
|
30
|
+
- name: Check package
|
|
31
|
+
run: python -m twine check dist/*
|
|
32
|
+
|
|
33
|
+
- name: Upload dist artifact
|
|
34
|
+
uses: actions/upload-artifact@v4
|
|
35
|
+
with:
|
|
36
|
+
name: python-package-distributions
|
|
37
|
+
path: dist/
|
|
38
|
+
|
|
39
|
+
publish:
|
|
40
|
+
name: Publish to PyPI
|
|
41
|
+
needs: build
|
|
42
|
+
runs-on: ubuntu-latest
|
|
43
|
+
environment:
|
|
44
|
+
name: pypi
|
|
45
|
+
url: https://pypi.org/project/pureframe/
|
|
46
|
+
permissions:
|
|
47
|
+
id-token: write
|
|
48
|
+
|
|
49
|
+
steps:
|
|
50
|
+
- name: Download dist artifact
|
|
51
|
+
uses: actions/download-artifact@v4
|
|
52
|
+
with:
|
|
53
|
+
name: python-package-distributions
|
|
54
|
+
path: dist/
|
|
55
|
+
|
|
56
|
+
- name: Publish package
|
|
57
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
tauri-build:
|
|
10
|
+
strategy:
|
|
11
|
+
fail-fast: false
|
|
12
|
+
matrix:
|
|
13
|
+
include:
|
|
14
|
+
- os: ubuntu-latest
|
|
15
|
+
target: x86_64-unknown-linux-gnu
|
|
16
|
+
- os: macos-latest
|
|
17
|
+
target: aarch64-apple-darwin
|
|
18
|
+
- os: macos-latest
|
|
19
|
+
target: x86_64-apple-darwin
|
|
20
|
+
- os: windows-latest
|
|
21
|
+
target: x86_64-pc-windows-msvc
|
|
22
|
+
runs-on: ${{ matrix.os }}
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
- name: Setup Node.js
|
|
27
|
+
uses: actions/setup-node@v4
|
|
28
|
+
with:
|
|
29
|
+
node-version: 20
|
|
30
|
+
- name: Setup Rust
|
|
31
|
+
uses: dtolnay/rust-toolchain@stable
|
|
32
|
+
with:
|
|
33
|
+
targets: ${{ matrix.target }}
|
|
34
|
+
- name: Install dependencies (Ubuntu)
|
|
35
|
+
if: matrix.os == 'ubuntu-latest'
|
|
36
|
+
run: |
|
|
37
|
+
sudo apt-get update
|
|
38
|
+
sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential curl wget file libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev
|
|
39
|
+
- name: Install Frontend Dependencies
|
|
40
|
+
working-directory: gui
|
|
41
|
+
run: npm install
|
|
42
|
+
- name: Build Tauri App
|
|
43
|
+
uses: tauri-apps/tauri-action@v0
|
|
44
|
+
env:
|
|
45
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
46
|
+
with:
|
|
47
|
+
projectPath: gui
|
|
48
|
+
tagName: ${{ github.ref_name }}
|
|
49
|
+
releaseName: 'PureFrame ${{ github.ref_name }}'
|
|
50
|
+
releaseBody: 'Release ${{ github.ref_name }}'
|
|
51
|
+
releaseDraft: true
|
|
52
|
+
prerelease: false
|
|
53
|
+
args: ${{ matrix.os == 'macos-latest' && format('--target {0}', matrix.target) || '' }}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.egg-info/
|
|
6
|
+
dist/
|
|
7
|
+
build/
|
|
8
|
+
*.egg
|
|
9
|
+
.eggs/
|
|
10
|
+
|
|
11
|
+
# Virtual environments
|
|
12
|
+
.venv/
|
|
13
|
+
venv/
|
|
14
|
+
env/
|
|
15
|
+
|
|
16
|
+
# Testing
|
|
17
|
+
.pytest_cache/
|
|
18
|
+
.coverage
|
|
19
|
+
htmlcov/
|
|
20
|
+
.mypy_cache/
|
|
21
|
+
|
|
22
|
+
# IDE
|
|
23
|
+
.vscode/
|
|
24
|
+
.idea/
|
|
25
|
+
*.swp
|
|
26
|
+
*.swo
|
|
27
|
+
|
|
28
|
+
# OS
|
|
29
|
+
.DS_Store
|
|
30
|
+
Thumbs.db
|
|
31
|
+
|
|
32
|
+
# Logs
|
|
33
|
+
*.log
|
|
34
|
+
|
|
35
|
+
# Debug scripts (dev-only)
|
|
36
|
+
debug_test*.py
|
|
37
|
+
update_cli.py
|
|
38
|
+
|
|
39
|
+
# Lock files (generated)
|
|
40
|
+
uv.lock
|
|
41
|
+
|
|
42
|
+
# Tauri build artifacts
|
|
43
|
+
gui/src-tauri/target/
|
|
44
|
+
gui/node_modules/
|
|
45
|
+
gui/dist/
|
|
46
|
+
|
|
47
|
+
# Demo intermediates (keep demo.gif and logo.svg)
|
|
48
|
+
assets/demo_input.mp4
|
|
49
|
+
assets/demo_output.mp4
|
|
50
|
+
assets/demo_plan.json
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Performance Benchmarks
|
|
2
|
+
|
|
3
|
+
> Measurements below are **real, on the machine indicated**. Other tiers are estimated from community contributions. To add your hardware, run `scripts/run_benchmarks.sh` and open a PR.
|
|
4
|
+
|
|
5
|
+
> **Note on these numbers:** The benchmark clip is a 30s synthetic 1080p video (solid colours, test patterns) with **zero detections**. Real movie content with actual detections will take longer — blurring adds per-frame overhead, and complex scenes trigger more model inference. Use these numbers as a floor, not a ceiling.
|
|
6
|
+
|
|
7
|
+
## Measured: Author's Machine
|
|
8
|
+
|
|
9
|
+
| | |
|
|
10
|
+
|---|---|
|
|
11
|
+
| **OS** | Linux (Pop!_OS 24.04, kernel 6.18.7) |
|
|
12
|
+
| **CPU** | Intel Core i5-10400F @ 2.90GHz (6 cores) |
|
|
13
|
+
| **GPU** | NVIDIA GeForce RTX 3060 (12 GB VRAM) |
|
|
14
|
+
| **Python** | 3.13.12 |
|
|
15
|
+
| **PyTorch** | 2.11.0+cu130 |
|
|
16
|
+
| **CUDA** | 13.0 |
|
|
17
|
+
|
|
18
|
+
| Profile | 30s 1080p clip | Extrapolated 90-min movie | Detection FPS |
|
|
19
|
+
|---|---|---|---|
|
|
20
|
+
| HIGH (12 GB VRAM) | **25.96s** | ~78 min | ~28 fps |
|
|
21
|
+
| MEDIUM (6–11 GB VRAM) | **41.23s** | ~124 min | ~18 fps |
|
|
22
|
+
| LOW (3–5 GB VRAM) | **27.83s** | ~83 min | ~26 fps |
|
|
23
|
+
| CPU (no GPU) | **21.37s** | ~64 min* | ~34 fps* |
|
|
24
|
+
|
|
25
|
+
*CPU appears faster on synthetic content because CUDA initialization overhead is amortised differently and no inference is triggered on zero-detection clips. Expect CPU to be **3–10× slower** on real movie content.*
|
|
26
|
+
|
|
27
|
+
## Estimated: Other Hardware
|
|
28
|
+
|
|
29
|
+
Community contributions welcome. Run `scripts/run_benchmarks.sh` and open a PR to add your hardware below.
|
|
30
|
+
|
|
31
|
+
| Hardware | Profile | Estimated 90-min movie |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| RTX 4090 (24 GB) | HIGH | ~30 min (estimated, not measured) |
|
|
34
|
+
| RTX 4070 (12 GB) | HIGH | ~50 min (estimated, not measured) |
|
|
35
|
+
| GTX 1650 (4 GB) | LOW | ~120 min (estimated, not measured) |
|
|
36
|
+
| Apple M2 Pro | MEDIUM | ~90 min (estimated, not measured) |
|
|
37
|
+
| Apple M4 Max | HIGH | ~35 min (estimated, not measured) |
|
|
38
|
+
|
|
39
|
+
## Profile Knobs
|
|
40
|
+
|
|
41
|
+
### HIGH (12+ GB VRAM)
|
|
42
|
+
- Detection resolution: 1080px
|
|
43
|
+
- Batch size: 32 frames
|
|
44
|
+
- FP16 inference: enabled
|
|
45
|
+
- Models kept in VRAM between stages
|
|
46
|
+
- Samples 5 keyframes per shot + densifies every frame
|
|
47
|
+
|
|
48
|
+
### MEDIUM (6–11 GB VRAM)
|
|
49
|
+
- Detection resolution: 720px
|
|
50
|
+
- Batch size: 16 frames
|
|
51
|
+
- FP16 inference: enabled
|
|
52
|
+
- Models kept in VRAM between stages
|
|
53
|
+
- Samples 3 keyframes per shot, densifies every 2nd frame
|
|
54
|
+
|
|
55
|
+
### LOW (3–5 GB VRAM)
|
|
56
|
+
- Detection resolution: 540px
|
|
57
|
+
- Batch size: 4 frames
|
|
58
|
+
- FP16 inference: enabled
|
|
59
|
+
- Models unloaded between stages (reduces VRAM pressure)
|
|
60
|
+
- Samples 3 keyframes per shot, densifies every 3rd frame
|
|
61
|
+
|
|
62
|
+
### CPU (no GPU)
|
|
63
|
+
- Detection resolution: 480px
|
|
64
|
+
- Batch size: 1 frame
|
|
65
|
+
- FP16 disabled (CPU doesn't benefit)
|
|
66
|
+
- Models unloaded between stages
|
|
67
|
+
- Samples 2 keyframes per shot, densifies every 5th frame
|
|
68
|
+
|
|
69
|
+
## How to Contribute Benchmarks
|
|
70
|
+
|
|
71
|
+
1. Clone the repo and install: `pip install -e .`
|
|
72
|
+
2. Generate the benchmark clip:
|
|
73
|
+
```bash
|
|
74
|
+
bash scripts/run_benchmarks.sh
|
|
75
|
+
```
|
|
76
|
+
3. Open a PR adding your row to the "Estimated" table above. Mark it "measured" and include your hardware spec.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.1.0b1] - 2026-05-07
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Initial beta release.
|
|
12
|
+
- CLI plan/apply/process workflow.
|
|
13
|
+
- Local explicit-content detection.
|
|
14
|
+
- JSON censor plan review workflow.
|
|
15
|
+
- FFmpeg-based blur rendering.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Launch Sequence: PureFrame
|
|
2
|
+
|
|
3
|
+
Follow this battle-tested sequence to maximize visibility and adoption for PureFrame.
|
|
4
|
+
|
|
5
|
+
### 1. Soft Launch on r/selfhosted
|
|
6
|
+
- **Timing:** Tuesday morning (EST).
|
|
7
|
+
- **Format:** A short text post explaining the *why* (privacy, local AI, Family Movie Act) and a clear link to the GitHub repository.
|
|
8
|
+
- **Visuals:** Use the side-by-side GIF as the primary hook.
|
|
9
|
+
|
|
10
|
+
### 2. r/Parenting
|
|
11
|
+
- **Timing:** Wednesday evening.
|
|
12
|
+
- **Format:** A relatable, non-technical post. Focus entirely on the benefit: "I built a tool that lets me watch my favorite movies with my kids without skipping scenes."
|
|
13
|
+
- **Tone:** Helpful, empathetic, community-focused.
|
|
14
|
+
|
|
15
|
+
### 3. r/PleX
|
|
16
|
+
- **Timing:** Thursday.
|
|
17
|
+
- **Format:** Technical showcase. Mention the CLI and batch processing.
|
|
18
|
+
- **Hook:** "I'm working on a Plex plugin for this next, but the standalone CLI/GUI is ready now."
|
|
19
|
+
|
|
20
|
+
### 4. Hacker News (Show HN)
|
|
21
|
+
- **Title:** `Show HN: PureFrame — Censor explicit visuals in any video locally, without cutting a frame`
|
|
22
|
+
- **First Comment:** Write a detailed comment explaining the technical challenges (YOLOv8, Audio Zero-shot classification, temporal smoothing algorithm) to engage the HN crowd.
|
|
23
|
+
|
|
24
|
+
### 5. Product Hunt
|
|
25
|
+
- **Timing:** 12:01 AM PST on a Tuesday or Wednesday.
|
|
26
|
+
- **Assets:** The demo GIF, a nice banner image (using the logo), and clear UI screenshots of the Tauri app's Plan Editor.
|
|
27
|
+
|
|
28
|
+
### 6. X/Twitter
|
|
29
|
+
- **Format:** A short thread.
|
|
30
|
+
- **Tags:** Tag prominent `#selfhosted`, `#AI`, and open-source tech accounts. Use the demo GIF on the first tweet.
|
|
31
|
+
|
|
32
|
+
### 7. Blogger Outreach
|
|
33
|
+
- Reach out to family-friendly streaming bloggers and tech journalists. Offer them a pre-compiled Windows `.exe` or Mac `.dmg` so they don't have to compile from source.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 PureFrame
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|