kinemotion 0.64.0__tar.gz → 0.65.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.
Potentially problematic release.
This version of kinemotion might be problematic. Click here for more details.
- kinemotion-0.65.0/.basic-memory/development/athlete-pose3-d-validation-status-and-pending-work.md +30 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/CHANGELOG.md +6 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/PKG-INFO +1 -1
- {kinemotion-0.64.0 → kinemotion-0.65.0}/pyproject.toml +1 -1
- kinemotion-0.65.0/scripts/ap3d/PENDING.md +43 -0
- kinemotion-0.65.0/scripts/ap3d/ap3d_validator.py +186 -0
- kinemotion-0.65.0/scripts/ap3d/prepare_ap3d_data.py +151 -0
- kinemotion-0.65.0/scripts/ap3d/validate_baseline.py +48 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/video_io.py +11 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/uv.lock +1 -1
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/api/testing-backend-authentication-quick-reference.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/backend-granular-logging-implementation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/commit-review-r2-video-storage-migration-fe74d1f.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/database-setup-scripts-complete-implementation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/fast-api-app.py Refactoring Plan - Modular Architecture.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/fast-api-refactoring-completion-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/feature-request-system-configuration.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/follow-up-improvements-to-r2-video-storage-migration.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/i18n-implementation-plan-for-validation-messages.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/model-import-conflict-resolution-fast-api-refactoring.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/optimal-timing-implementation-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/pyright-strict-mode-fix-patterns.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/supabase-database-integration-setup.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/supabase-documentation-validation-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/agent-documentation-standards-update.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/backend-authentication-architecture-decision.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/backend-authentication-implementation-complete.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/i18n-documentation-cleanup-completed.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/research/performance-improvement-analysis-30s-18s.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.claude/settings.local.json +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.cursor/mcp.json +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.dockerignore +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.envrc +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.gitattributes +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.github/workflows/deploy-backend.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.github/workflows/release.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.gitignore +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.mcp.json +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.readthedocs.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/.gitignore +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.serena/project.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.tool-versions +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/.vercelignore +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/CLAUDE.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/Dockerfile +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/GEMINI.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/LICENSE +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/SECURITY.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/.coveragerc +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/.dockerignore +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/.env.example +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/Dockerfile +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/pyproject.toml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/analysis_api.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/app/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/app/config.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/app/dependencies.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/app/exceptions.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/app/main.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/app.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/database.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/logging_config.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/models/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/models/database.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/models/responses.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/models/storage.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/routes/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/routes/analysis.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/routes/database.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/routes/health.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/routes/platform.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/services/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/services/analysis_service.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/services/storage_service.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/services/validation.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/services/video_processor.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/types.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/utils/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/src/kinemotion_backend/utils/rate_limiter.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/supabase-schema.sql +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/tests/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/api/core.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/api/overview.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/I18N-README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/feature-request-system.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/feedback-system-setup.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/i18n-architecture-diagram.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/i18n-cheat-sheet.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/i18n-quick-start-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/i18n-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/i18n-validation-messages-specification.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/supabase-database-setup.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/testing.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/supabase-setup/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/supabase-setup/quickstart.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/supabase-setup/scripts-reference.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/guides/supabase-setup/setup-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/index.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/quick-start.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/docs/validation-status.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/.env.example +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/.gitignore +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/index.html +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/package.json +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/App.i18n.integration.test.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/App.test.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/App.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/Auth.test.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/ErrorBoundary.test.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/FeatureRequestButton.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/FeedbackForm.css +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/FeedbackForm.test.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/FeedbackForm.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/LanguageSwitcher.css +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/LanguageSwitcher.test.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/LanguageSwitcher.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/LoadingSpinner.test.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/RecentUploads.test.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/ResultsDisplay.test.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/UploadForm.test.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/config/links.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/hooks/useAnalysis.test.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/hooks/useDatabaseStatus.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/hooks/useLanguage.test.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/hooks/useLanguage.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/i18n/config.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/i18n/locales/en/translation.json +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/i18n/locales/es/translation.json +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/i18n/locales/fr/translation.json +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/index.css +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/lib/supabase.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/test/setup.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/vercel.json +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/vite.config.ts +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/frontend/yarn.lock +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/justfile +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/local_dev.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/mkdocs.yml +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/.gitignore +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/requirements-docs.txt +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/debug_detection.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/project/README.md +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/project.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/supabasedb/setup-supabase-database.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/supabasedb/setup_supabase_db.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/sonar-project.properties +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/api.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/cmj/api.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/determinism.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/pipeline_utils.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/timing.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/types.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/core/validation.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/dropjump/api.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cli/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cmj/test_api.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cmj/test_cli.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/conftest.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_cli_utils.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_pipeline_utils.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_pose.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_timing.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_validation.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/dropjump/test_api.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/dropjump/test_cli.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/dropjump/test_kinematics.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/tests/dropjump/test_validation_integration.py +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/typings/mediapipe/__init__.pyi +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/typings/mediapipe/solutions/__init__.pyi +0 -0
- {kinemotion-0.64.0 → kinemotion-0.65.0}/typings/mediapipe/solutions/pose.pyi +0 -0
kinemotion-0.65.0/.basic-memory/development/athlete-pose3-d-validation-status-and-pending-work.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: AthletePose3D Validation Status and Pending Work
|
|
3
|
+
type: note
|
|
4
|
+
permalink: development/athlete-pose3-d-validation-status-and-pending-work
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# AthletePose3D Validation Status - Dec 18, 2025
|
|
8
|
+
|
|
9
|
+
## 🏁 Overview
|
|
10
|
+
The validation scripts for AthletePose3D (AP3D) have been remade after being lost from the workspace. They are currently in a "Phase 1: Infrastructure Ready" state.
|
|
11
|
+
|
|
12
|
+
## 🔗 Verified Resources
|
|
13
|
+
- **Repository:** https://github.com/calvinyeungck/AthletePose3D
|
|
14
|
+
- **License:** https://github.com/calvinyeungck/athletepose3d/blob/main/license/README.md
|
|
15
|
+
- **Download Link:** [Google Drive](https://drive.google.com/drive/folders/10YnMJAluiscnLkrdiluIeehNetdry5Ft?usp=sharing) (Verified Dec 18, 2025)
|
|
16
|
+
|
|
17
|
+
## 📊 Code Evaluation
|
|
18
|
+
- **Structural Integrity:** High. Scripts follow modular `prepare -> validate -> report` flow.
|
|
19
|
+
- **Scientific Validity:** Medium. Current implementation lack **Coordinate Normalization** (World mm vs Image px).
|
|
20
|
+
- **Temporal Alignment:** High. Uses linear interpolation to align research sequences (60/120fps) with video processing.
|
|
21
|
+
|
|
22
|
+
## 🚀 Critical Pending Tasks
|
|
23
|
+
1. **Coordinate Normalization:** Implement scaling (e.g., torso-length based) and Procrustes alignment.
|
|
24
|
+
2. **3D Angles:** Implement 3D kinematic angle calculations (currently placeholders).
|
|
25
|
+
3. **Data Verification:** Test `.pkl` loader against actual AP3D files once downloaded.
|
|
26
|
+
|
|
27
|
+
## 📝 Roadmap Integration
|
|
28
|
+
- **Status:** Non-blocking for MVP.
|
|
29
|
+
- **Priority:** High for scientific credibility (post-Week 3).
|
|
30
|
+
- **Goal:** Prove MediaPipe's "accurate" preset achieves <100mm MPJPE on athletic movements.
|
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- version list -->
|
|
9
9
|
|
|
10
|
+
## kinemotion-v0.65.0 (2025-12-18)
|
|
11
|
+
|
|
12
|
+
### Feat
|
|
13
|
+
|
|
14
|
+
- **ap3d**: add AthletePose3D validation scripts and setup guide
|
|
15
|
+
|
|
10
16
|
## kinemotion-v0.64.0 (2025-12-15)
|
|
11
17
|
|
|
12
18
|
### Feat
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.65.0
|
|
4
4
|
Summary: Video-based kinematic analysis for athletic performance
|
|
5
5
|
Project-URL: Homepage, https://github.com/feniix/kinemotion
|
|
6
6
|
Project-URL: Repository, https://github.com/feniix/kinemotion
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# AthletePose3D Scripts - Pending Tasks & Status
|
|
2
|
+
|
|
3
|
+
These scripts were remade on Dec 18, 2025, after being lost from the workspace. While structurally complete, they require scientific refinement once the dataset is downloaded.
|
|
4
|
+
|
|
5
|
+
## 🎯 Current Status: **Phase 1 (Infrastructure Ready)**
|
|
6
|
+
|
|
7
|
+
The scripts can scan directories, generate manifests, and perform basic MPJPE calculations. However, they are currently in **Image Space (Pixels)**, not **World Space (MM)**.
|
|
8
|
+
|
|
9
|
+
## 🚀 Pending Work (High Priority)
|
|
10
|
+
|
|
11
|
+
### 1. Coordinate Normalization
|
|
12
|
+
|
|
13
|
+
- [ ] **Problem:** MediaPipe is normalized \[0,1\], AP3D Ground Truth is likely in mm or centralized camera coordinates.
|
|
14
|
+
- [ ] **Task:** Implement a scaling/normalization factor (e.g., using torso length) to make MPJPE meaningful.
|
|
15
|
+
- [ ] **Task:** Add Procrustes Alignment (Kabsch Algorithm) to handle translation/rotation offsets between models.
|
|
16
|
+
|
|
17
|
+
### 2. 3D Kinematics
|
|
18
|
+
|
|
19
|
+
- [ ] **Task:** Implement 3D joint angle calculations for Hip, Knee, and Ankle.
|
|
20
|
+
- [ ] **Task:** Compare Kinemotion's 2D-derived angles vs AP3D's 3D ground truth angles.
|
|
21
|
+
|
|
22
|
+
### 3. Data Integration
|
|
23
|
+
|
|
24
|
+
- [ ] **Task:** Verify `.pkl` / `.npy` loading logic against actual AP3D files (once downloaded).
|
|
25
|
+
- [ ] **Task:** Handle multi-view data (if present) - current scripts assume single view per video.
|
|
26
|
+
- [ ] **Task:** Add regex-based mapping for complex filenames (e.g., `S01_Run_V1.mp4` -> `S01_Run.pkl`).
|
|
27
|
+
|
|
28
|
+
### 4. Robustness & Presets
|
|
29
|
+
|
|
30
|
+
- [ ] **Task:** Use results to validate the "athletic" preset (smoothing/filtering optimization).
|
|
31
|
+
- [ ] **Task:** Handle detection failures (frames where MediaPipe returns no landmarks).
|
|
32
|
+
|
|
33
|
+
## 📊 Evaluation Summary (Code Reasoning)
|
|
34
|
+
|
|
35
|
+
| Script | Purpose | Confidence | Primary Risk |
|
|
36
|
+
| ---------------------- | ----------------- | ---------- | ------------------------------ |
|
|
37
|
+
| `prepare_ap3d_data.py` | Data indexing | High | Naive filename mapping |
|
|
38
|
+
| `ap3d_validator.py` | Error calculation | Medium | Lacks 3D coordinate projection |
|
|
39
|
+
| `validate_baseline.py` | Execution | High | None |
|
|
40
|
+
|
|
41
|
+
______________________________________________________________________
|
|
42
|
+
|
|
43
|
+
**Note:** Do not use MPJPE values from the current version for scientific reports until **Coordinate Normalization** is implemented.
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
AP3DValidator: Core validation logic for AthletePose3D dataset.
|
|
4
|
+
Calculates MPJPE, joint angle errors, and temporal consistency.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import logging
|
|
9
|
+
import pickle
|
|
10
|
+
from typing import Any
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
import scipy.interpolate as interpolate
|
|
15
|
+
from numpy.typing import NDArray
|
|
16
|
+
from kinemotion.core.pose import PoseTracker
|
|
17
|
+
from kinemotion.core.video_io import VideoProcessor
|
|
18
|
+
|
|
19
|
+
# Configure logging
|
|
20
|
+
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
class AP3DValidator:
|
|
24
|
+
"""Validator for AthletePose3D dataset."""
|
|
25
|
+
|
|
26
|
+
def __init__(self, ap3d_root: Path):
|
|
27
|
+
self.ap3d_root = ap3d_root
|
|
28
|
+
self.manifest_path = ap3d_root / "manifest.json"
|
|
29
|
+
self.manifest = self._load_manifest()
|
|
30
|
+
self.mapping = self.manifest.get("mapping", {})
|
|
31
|
+
# Inverse mapping for easy lookup: MediaPipe index -> COCO index
|
|
32
|
+
self.inv_mapping = {int(v): int(k) for k, v in self.mapping.items()}
|
|
33
|
+
|
|
34
|
+
def _load_manifest(self) -> dict[str, Any]:
|
|
35
|
+
if not self.manifest_path.exists():
|
|
36
|
+
raise FileNotFoundError(f"Manifest not found: {self.manifest_path}")
|
|
37
|
+
with open(self.manifest_path) as f:
|
|
38
|
+
return json.load(f)
|
|
39
|
+
|
|
40
|
+
def load_ground_truth(self, gt_path: str) -> Any:
|
|
41
|
+
"""Load ground truth from .pkl or .npy file."""
|
|
42
|
+
full_path = self.ap3d_root / gt_path
|
|
43
|
+
if full_path.suffix == ".pkl":
|
|
44
|
+
with open(full_path, "rb") as f:
|
|
45
|
+
data = pickle.load(f)
|
|
46
|
+
# Assume data is a numpy array of shape (frames, 17, 3)
|
|
47
|
+
# Some PKL might be dicts, adjust if needed
|
|
48
|
+
if isinstance(data, dict) and "keypoints_3d" in data:
|
|
49
|
+
return data["keypoints_3d"]
|
|
50
|
+
return data
|
|
51
|
+
elif full_path.suffix == ".npy":
|
|
52
|
+
return np.load(full_path)
|
|
53
|
+
else:
|
|
54
|
+
raise ValueError(f"Unsupported ground truth format: {full_path.suffix}")
|
|
55
|
+
|
|
56
|
+
def temporal_alignment(self, source_data: NDArray[np.float64], target_len: int) -> NDArray[np.float64]:
|
|
57
|
+
"""Align source_data to target_len using linear interpolation."""
|
|
58
|
+
source_len = len(source_data)
|
|
59
|
+
if source_len == target_len:
|
|
60
|
+
return source_data
|
|
61
|
+
|
|
62
|
+
x_source = np.linspace(0, 1, source_len)
|
|
63
|
+
x_target = np.linspace(0, 1, target_len)
|
|
64
|
+
|
|
65
|
+
# Reshape to (len, -1) for easier interpolation
|
|
66
|
+
orig_shape = source_data.shape
|
|
67
|
+
flat_source = source_data.reshape(source_len, -1)
|
|
68
|
+
|
|
69
|
+
f = interpolate.interp1d(x_source, flat_source, axis=0, kind="linear", fill_value="extrapolate")
|
|
70
|
+
flat_target: NDArray[np.float64] = f(x_target).astype(np.float64)
|
|
71
|
+
|
|
72
|
+
return flat_target.reshape((target_len,) + orig_shape[1:])
|
|
73
|
+
|
|
74
|
+
def calculate_mpjpe(self, gt_poses: NDArray[np.float64], mp_poses: NDArray[np.float64]) -> float:
|
|
75
|
+
"""
|
|
76
|
+
Calculate Mean Per Joint Position Error.
|
|
77
|
+
Assumes both are (frames, joints, 3) and aligned.
|
|
78
|
+
"""
|
|
79
|
+
# Calculate Euclidean distance per joint per frame
|
|
80
|
+
errors = np.linalg.norm(gt_poses - mp_poses, axis=2)
|
|
81
|
+
return float(np.mean(errors))
|
|
82
|
+
|
|
83
|
+
def validate_single(self, entry: dict[str, Any]) -> dict[str, Any]:
|
|
84
|
+
"""Validate a single video entry from the manifest."""
|
|
85
|
+
video_path = entry["video_path"]
|
|
86
|
+
gt_path = entry["gt_path"]
|
|
87
|
+
|
|
88
|
+
logger.info(f"Validating {video_path}...")
|
|
89
|
+
|
|
90
|
+
# Load Ground Truth: (frames, joints, 3)
|
|
91
|
+
gt_data = self.load_ground_truth(gt_path)
|
|
92
|
+
|
|
93
|
+
# Initialize PoseTracker
|
|
94
|
+
tracker = PoseTracker()
|
|
95
|
+
mp_poses = []
|
|
96
|
+
|
|
97
|
+
full_video_path = self.ap3d_root / video_path
|
|
98
|
+
with VideoProcessor(str(full_video_path)) as video:
|
|
99
|
+
width, height = video.width, video.height
|
|
100
|
+
for frame in video:
|
|
101
|
+
landmarks = tracker.process_frame(frame)
|
|
102
|
+
|
|
103
|
+
# Create pose array for this frame (17 joints, 3 coords: x, y, z)
|
|
104
|
+
# MediaPipe PoseTracker returns (x, y, visibility) in normalized coords
|
|
105
|
+
# For MPJPE we need to convert to pixels or mm.
|
|
106
|
+
# Let's start with pixel-level validation (MPJPE-px)
|
|
107
|
+
frame_pose = np.zeros((17, 3))
|
|
108
|
+
|
|
109
|
+
if landmarks:
|
|
110
|
+
# Mapping from PoseTracker names to COCO indices
|
|
111
|
+
name_to_coco = {
|
|
112
|
+
"nose": 0,
|
|
113
|
+
"left_shoulder": 5, "right_shoulder": 6,
|
|
114
|
+
"left_hip": 11, "right_hip": 12,
|
|
115
|
+
"left_knee": 13, "right_knee": 14,
|
|
116
|
+
"left_ankle": 15, "right_ankle": 16
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
for name, coco_idx in name_to_coco.items():
|
|
120
|
+
if name in landmarks:
|
|
121
|
+
x, y, _ = landmarks[name]
|
|
122
|
+
# Scale normalized to pixels
|
|
123
|
+
frame_pose[coco_idx] = [x * width, y * height, 0] # Z is 0 for now
|
|
124
|
+
|
|
125
|
+
mp_poses.append(frame_pose)
|
|
126
|
+
|
|
127
|
+
tracker.close()
|
|
128
|
+
mp_poses_arr = np.array(mp_poses)
|
|
129
|
+
|
|
130
|
+
# Temporal alignment
|
|
131
|
+
# Align GT to MP frame count
|
|
132
|
+
gt_aligned = self.temporal_alignment(gt_data, len(mp_poses_arr))
|
|
133
|
+
|
|
134
|
+
# Calculate MPJPE for visible joints (joints 0, 5, 6, 11, 12, 13, 14, 15, 16)
|
|
135
|
+
visible_joints = [0, 5, 6, 11, 12, 13, 14, 15, 16]
|
|
136
|
+
|
|
137
|
+
# Slice both to only include visible joints
|
|
138
|
+
gt_visible = gt_aligned[:, visible_joints, :2] # only X, Y
|
|
139
|
+
mp_visible = mp_poses_arr[:, visible_joints, :2]
|
|
140
|
+
|
|
141
|
+
mpjpe = self.calculate_mpjpe(gt_visible, mp_visible)
|
|
142
|
+
|
|
143
|
+
return {"mpjpe": float(mpjpe), "video": video_path}
|
|
144
|
+
|
|
145
|
+
def validate_split(self, split_name: str) -> dict[str, Any]:
|
|
146
|
+
"""Validate all videos in a specific split."""
|
|
147
|
+
entries = self.manifest["splits"].get(split_name, [])
|
|
148
|
+
results = []
|
|
149
|
+
for entry in entries:
|
|
150
|
+
res = self.validate_single(entry)
|
|
151
|
+
results.append(res)
|
|
152
|
+
|
|
153
|
+
return self.aggregate_results(results)
|
|
154
|
+
|
|
155
|
+
def aggregate_results(self, results: list[dict[str, Any]]) -> dict[str, Any]:
|
|
156
|
+
"""Aggregate results and calculate summary statistics."""
|
|
157
|
+
if not results:
|
|
158
|
+
return {}
|
|
159
|
+
mpjpes = [r["mpjpe"] for r in results]
|
|
160
|
+
return {
|
|
161
|
+
"mean_mpjpe": float(np.mean(mpjpes)),
|
|
162
|
+
"std_mpjpe": float(np.std(mpjpes)),
|
|
163
|
+
"count": len(results)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
def generate_report(self, summary: dict[str, Any], output_path: Path) -> None:
|
|
167
|
+
"""Generate a markdown report."""
|
|
168
|
+
report = f"""# AP3D Validation Report
|
|
169
|
+
|
|
170
|
+
## Summary Statistics
|
|
171
|
+
- **Total Videos:** {summary.get('count')}
|
|
172
|
+
- **Mean MPJPE:** {summary.get('mean_mpjpe'):.2f} mm
|
|
173
|
+
- **Std MPJPE:** {summary.get('std_mpjpe'):.2f} mm
|
|
174
|
+
|
|
175
|
+
## Recommendations
|
|
176
|
+
{"Acceptable baseline accuracy." if summary.get('mean_mpjpe', 999) < 100 else "Needs optimization."}
|
|
177
|
+
"""
|
|
178
|
+
with open(output_path, "w") as f:
|
|
179
|
+
f.write(report)
|
|
180
|
+
logger.info(f"Report generated at {output_path}")
|
|
181
|
+
|
|
182
|
+
if __name__ == "__main__":
|
|
183
|
+
# Example usage
|
|
184
|
+
validator = AP3DValidator(Path("data/athletepose3d"))
|
|
185
|
+
# summary = validator.validate_split("test")
|
|
186
|
+
# validator.generate_report(summary, Path("reports/ap3d_baseline_validation.md"))
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Prepare AthletePose3D dataset for validation.
|
|
4
|
+
Scans directories, extracts metadata, and creates a manifest.json.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import logging
|
|
9
|
+
import random
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
import click
|
|
14
|
+
import cv2
|
|
15
|
+
|
|
16
|
+
# Configure logging
|
|
17
|
+
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
# COCO 17 keypoints to MediaPipe 33 landmarks mapping
|
|
21
|
+
# COCO: [nose, l_eye, r_eye, l_ear, r_ear, l_shoulder, r_shoulder, l_elbow, r_elbow, l_wrist, r_wrist, l_hip, r_hip, l_knee, r_knee, l_ankle, r_ankle]
|
|
22
|
+
COCO_TO_MEDIAPIPE = {
|
|
23
|
+
0: 0, # nose
|
|
24
|
+
1: 2, # l_eye
|
|
25
|
+
2: 5, # r_eye
|
|
26
|
+
3: 7, # l_ear
|
|
27
|
+
4: 8, # r_ear
|
|
28
|
+
5: 11, # l_shoulder
|
|
29
|
+
6: 12, # r_shoulder
|
|
30
|
+
7: 13, # l_elbow
|
|
31
|
+
8: 14, # r_elbow
|
|
32
|
+
9: 15, # l_wrist
|
|
33
|
+
10: 16, # r_wrist
|
|
34
|
+
11: 23, # l_hip
|
|
35
|
+
12: 24, # r_hip
|
|
36
|
+
13: 25, # l_knee
|
|
37
|
+
14: 26, # r_knee
|
|
38
|
+
15: 27, # l_ankle
|
|
39
|
+
16: 28, # r_ankle
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
def get_video_metadata(video_path: Path) -> dict[str, Any]:
|
|
43
|
+
"""Extract metadata from video file."""
|
|
44
|
+
cap = cv2.VideoCapture(str(video_path))
|
|
45
|
+
if not cap.isOpened():
|
|
46
|
+
return {}
|
|
47
|
+
|
|
48
|
+
fps = cap.get(cv2.CAP_PROP_FPS)
|
|
49
|
+
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
50
|
+
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
51
|
+
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
52
|
+
cap.release()
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
"fps": fps,
|
|
56
|
+
"frame_count": frame_count,
|
|
57
|
+
"width": width,
|
|
58
|
+
"height": height,
|
|
59
|
+
"duration": frame_count / fps if fps > 0 else 0
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@click.command()
|
|
63
|
+
@click.option("--ap3d-root", type=click.Path(exists=True, path_type=Path), default="data/athletepose3d", help="Root directory of AP3D dataset")
|
|
64
|
+
@click.option("--train-split", type=float, default=0.7, help="Ratio of training data")
|
|
65
|
+
@click.option("--val-split", type=float, default=0.15, help="Ratio of validation data")
|
|
66
|
+
@click.option("--seed", type=int, default=42, help="Random seed for splitting")
|
|
67
|
+
def main(ap3d_root: Path, train_split: float, val_split: float, seed: int) -> None:
|
|
68
|
+
"""Scan AP3D dataset and generate manifest.json."""
|
|
69
|
+
video_dir = ap3d_root / "videos"
|
|
70
|
+
gt_dir = ap3d_root / "ground_truth"
|
|
71
|
+
|
|
72
|
+
if not video_dir.exists():
|
|
73
|
+
logger.error(f"Video directory not found: {video_dir}")
|
|
74
|
+
return
|
|
75
|
+
|
|
76
|
+
logger.info(f"Scanning videos in {video_dir}...")
|
|
77
|
+
video_files = list(video_dir.glob("*.mp4")) + list(video_dir.glob("*.mov"))
|
|
78
|
+
logger.info(f"Found {len(video_files)} videos.")
|
|
79
|
+
|
|
80
|
+
manifest_entries = []
|
|
81
|
+
|
|
82
|
+
for video_path in video_files:
|
|
83
|
+
# Match with ground truth
|
|
84
|
+
# AP3D often has matching names, e.g., video1.mp4 -> video1.pkl or video1.npy
|
|
85
|
+
gt_path_pkl = gt_dir / f"{video_path.stem}.pkl"
|
|
86
|
+
gt_path_npy = gt_dir / f"{video_path.stem}.npy"
|
|
87
|
+
|
|
88
|
+
gt_path = None
|
|
89
|
+
if gt_path_pkl.exists():
|
|
90
|
+
gt_path = gt_path_pkl
|
|
91
|
+
elif gt_path_npy.exists():
|
|
92
|
+
gt_path = gt_path_npy
|
|
93
|
+
|
|
94
|
+
if not gt_path:
|
|
95
|
+
logger.warning(f"No ground truth found for {video_path.name}, skipping.")
|
|
96
|
+
continue
|
|
97
|
+
|
|
98
|
+
metadata = get_video_metadata(video_path)
|
|
99
|
+
if not metadata:
|
|
100
|
+
logger.warning(f"Could not read metadata for {video_path.name}, skipping.")
|
|
101
|
+
continue
|
|
102
|
+
|
|
103
|
+
entry = {
|
|
104
|
+
"video_path": str(video_path.relative_to(ap3d_root)),
|
|
105
|
+
"gt_path": str(gt_path.relative_to(ap3d_root)),
|
|
106
|
+
"metadata": metadata,
|
|
107
|
+
"movement_type": video_path.stem.split("-")[0] if "-" in video_path.stem else "unknown"
|
|
108
|
+
}
|
|
109
|
+
manifest_entries.append(entry)
|
|
110
|
+
|
|
111
|
+
if not manifest_entries:
|
|
112
|
+
logger.error("No valid video/ground-truth pairs found.")
|
|
113
|
+
return
|
|
114
|
+
|
|
115
|
+
# Shuffle and split
|
|
116
|
+
random.seed(seed)
|
|
117
|
+
random.shuffle(manifest_entries)
|
|
118
|
+
|
|
119
|
+
num_total = len(manifest_entries)
|
|
120
|
+
num_train = int(num_total * train_split)
|
|
121
|
+
num_val = int(num_total * val_split)
|
|
122
|
+
|
|
123
|
+
train_entries = manifest_entries[:num_train]
|
|
124
|
+
val_entries = manifest_entries[num_train:num_train+num_val]
|
|
125
|
+
test_entries = manifest_entries[num_train+num_val:]
|
|
126
|
+
|
|
127
|
+
manifest = {
|
|
128
|
+
"dataset": "AthletePose3D",
|
|
129
|
+
"mapping": COCO_TO_MEDIAPIPE,
|
|
130
|
+
"splits": {
|
|
131
|
+
"train": train_entries,
|
|
132
|
+
"validation": val_entries,
|
|
133
|
+
"test": test_entries
|
|
134
|
+
},
|
|
135
|
+
"summary": {
|
|
136
|
+
"total": num_total,
|
|
137
|
+
"train": len(train_entries),
|
|
138
|
+
"validation": len(val_entries),
|
|
139
|
+
"test": len(test_entries)
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
manifest_path = ap3d_root / "manifest.json"
|
|
144
|
+
with open(manifest_path, "w") as f:
|
|
145
|
+
json.dump(manifest, f, indent=2)
|
|
146
|
+
|
|
147
|
+
logger.info(f"Manifest generated at {manifest_path}")
|
|
148
|
+
logger.info(f"Total: {num_total} (Train: {len(train_entries)}, Val: {len(val_entries)}, Test: {len(test_entries)})")
|
|
149
|
+
|
|
150
|
+
if __name__ == "__main__":
|
|
151
|
+
main()
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Baseline validation script for AthletePose3D.
|
|
4
|
+
Runs validation on the test split and generates a report.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import click
|
|
11
|
+
from scripts.ap3d.ap3d_validator import AP3DValidator
|
|
12
|
+
|
|
13
|
+
# Configure logging
|
|
14
|
+
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
@click.command()
|
|
18
|
+
@click.option("--ap3d-root", type=click.Path(exists=True, path_type=Path), default="data/athletepose3d", help="Root directory of AP3D dataset")
|
|
19
|
+
@click.option("--split", type=str, default="test", help="Split to validate (train, validation, test)")
|
|
20
|
+
@click.option("--output-report", type=click.Path(path_type=Path), default="reports/ap3d_baseline_validation.md", help="Path to save validation report")
|
|
21
|
+
def main(ap3d_root: Path, split: str, output_report: Path) -> None:
|
|
22
|
+
"""Run baseline validation on AP3D dataset."""
|
|
23
|
+
logger.info(f"Starting AP3D validation on '{split}' split...")
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
validator = AP3DValidator(ap3d_root)
|
|
27
|
+
summary = validator.validate_split(split)
|
|
28
|
+
|
|
29
|
+
if not summary:
|
|
30
|
+
logger.error(f"No results found for split '{split}'.")
|
|
31
|
+
return
|
|
32
|
+
|
|
33
|
+
# Ensure reports directory exists
|
|
34
|
+
output_report.parent.mkdir(parents=True, exist_ok=True)
|
|
35
|
+
|
|
36
|
+
validator.generate_report(summary, output_report)
|
|
37
|
+
|
|
38
|
+
logger.info("Validation complete!")
|
|
39
|
+
logger.info(f"Mean MPJPE: {summary.get('mean_mpjpe'):.2f} px")
|
|
40
|
+
logger.info(f"Report saved to: {output_report}")
|
|
41
|
+
|
|
42
|
+
except Exception as e:
|
|
43
|
+
logger.error(f"Validation failed: {e}")
|
|
44
|
+
import traceback
|
|
45
|
+
logger.error(traceback.format_exc())
|
|
46
|
+
|
|
47
|
+
if __name__ == "__main__":
|
|
48
|
+
main()
|
|
@@ -203,6 +203,17 @@ class VideoProcessor:
|
|
|
203
203
|
"""Release video capture."""
|
|
204
204
|
self.cap.release()
|
|
205
205
|
|
|
206
|
+
def __iter__(self) -> "VideoProcessor":
|
|
207
|
+
"""Make the processor iterable."""
|
|
208
|
+
return self
|
|
209
|
+
|
|
210
|
+
def __next__(self) -> np.ndarray:
|
|
211
|
+
"""Get the next frame during iteration."""
|
|
212
|
+
frame = self.read_frame()
|
|
213
|
+
if frame is None:
|
|
214
|
+
raise StopIteration
|
|
215
|
+
return frame
|
|
216
|
+
|
|
206
217
|
def __enter__(self) -> "VideoProcessor":
|
|
207
218
|
return self
|
|
208
219
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/api/supabase-authentication-setup-guide.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/authentication/supabase-quick-start-guide.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/codebase/codebase-architecture-overview.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/backend-code-coverage-analysis.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.64.0 → kinemotion-0.65.0}/.basic-memory/development/claude-code-hook-configuration.md
RENAMED
|
File without changes
|
|
File without changes
|