pyfaceau 1.3.5__tar.gz → 1.3.6__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.
- {pyfaceau-1.3.5/pyfaceau.egg-info → pyfaceau-1.3.6}/PKG-INFO +1 -1
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/pipeline.py +21 -7
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/processor.py +2 -1
- {pyfaceau-1.3.5 → pyfaceau-1.3.6/pyfaceau.egg-info}/PKG-INFO +1 -1
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyproject.toml +1 -1
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/setup.py +1 -1
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/LICENSE +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/MANIFEST.in +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/README.md +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/__init__.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/alignment/__init__.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/alignment/calc_params.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/alignment/face_aligner.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/alignment/numba_calcparams_accelerator.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/alignment/paw.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/config.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/data/__init__.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/data/hdf5_dataset.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/data/quality_filter.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/data/training_data_generator.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/__init__.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/extract_mtcnn_weights.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/openface_mtcnn.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/pfld.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/pymtcnn_detector.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/retinaface.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/download_weights.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/features/__init__.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/features/histogram_median_tracker.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/features/pdm.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/features/triangulation.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/__init__.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/au_prediction_inference.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/au_prediction_net.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/fast_pipeline.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/landmark_pose_inference.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/landmark_pose_net.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/train_au_prediction.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/train_landmark_pose.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/parallel_pipeline.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/__init__.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/au_predictor.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/batched_au_predictor.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/model_parser.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/online_au_correction.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/running_median.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/running_median_fallback.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/refinement/__init__.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/refinement/pdm.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/refinement/svr_patch_expert.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/refinement/targeted_refiner.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/utils/__init__.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/utils/cython_extensions/cython_histogram_median.pyx +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/utils/cython_extensions/cython_rotation_update.pyx +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/utils/cython_extensions/setup.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/SOURCES.txt +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/dependency_links.txt +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/entry_points.txt +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/not-zip-safe +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/requires.txt +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/top_level.txt +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau_gui.py +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/requirements.txt +0 -0
- {pyfaceau-1.3.5 → pyfaceau-1.3.6}/setup.cfg +0 -0
|
@@ -22,7 +22,7 @@ import numpy as np
|
|
|
22
22
|
import pandas as pd
|
|
23
23
|
import cv2
|
|
24
24
|
from pathlib import Path
|
|
25
|
-
from typing import Dict, List, Optional, Tuple
|
|
25
|
+
from typing import Callable, Dict, List, Optional, Tuple
|
|
26
26
|
import argparse
|
|
27
27
|
import sys
|
|
28
28
|
import time
|
|
@@ -524,7 +524,8 @@ class FullPythonAUPipeline:
|
|
|
524
524
|
self,
|
|
525
525
|
video_path: str,
|
|
526
526
|
output_csv: Optional[str] = None,
|
|
527
|
-
max_frames: Optional[int] = None
|
|
527
|
+
max_frames: Optional[int] = None,
|
|
528
|
+
progress_callback: Optional[Callable[[int, int, float], None]] = None
|
|
528
529
|
) -> pd.DataFrame:
|
|
529
530
|
"""
|
|
530
531
|
Process a video and extract AUs for all frames
|
|
@@ -533,6 +534,8 @@ class FullPythonAUPipeline:
|
|
|
533
534
|
video_path: Path to input video
|
|
534
535
|
output_csv: Optional path to save CSV results
|
|
535
536
|
max_frames: Optional limit on frames to process (for testing)
|
|
537
|
+
progress_callback: Optional callback function(current, total, fps)
|
|
538
|
+
for progress updates to GUI
|
|
536
539
|
|
|
537
540
|
Returns:
|
|
538
541
|
DataFrame with columns: frame, timestamp, success, AU01_r, AU02_r, ...
|
|
@@ -541,14 +544,15 @@ class FullPythonAUPipeline:
|
|
|
541
544
|
self.stored_features = []
|
|
542
545
|
|
|
543
546
|
# Use direct processing implementation
|
|
544
|
-
return self._process_video_impl(video_path, output_csv, max_frames)
|
|
547
|
+
return self._process_video_impl(video_path, output_csv, max_frames, progress_callback)
|
|
545
548
|
|
|
546
549
|
|
|
547
550
|
def _process_video_impl(
|
|
548
551
|
self,
|
|
549
552
|
video_path: str,
|
|
550
553
|
output_csv: Optional[str] = None,
|
|
551
|
-
max_frames: Optional[int] = None
|
|
554
|
+
max_frames: Optional[int] = None,
|
|
555
|
+
progress_callback: Optional[Callable[[int, int, float], None]] = None
|
|
552
556
|
) -> pd.DataFrame:
|
|
553
557
|
"""Internal implementation of video processing"""
|
|
554
558
|
|
|
@@ -615,11 +619,21 @@ class FullPythonAUPipeline:
|
|
|
615
619
|
else:
|
|
616
620
|
total_failed += 1
|
|
617
621
|
|
|
618
|
-
# Progress update
|
|
622
|
+
# Progress update (wrapped to handle BrokenPipeError in GUI contexts)
|
|
619
623
|
if self.verbose and (frame_idx + 1) % 10 == 0:
|
|
620
624
|
progress = (frame_idx + 1) / total_frames * 100
|
|
621
|
-
|
|
622
|
-
|
|
625
|
+
try:
|
|
626
|
+
print(f"Progress: {frame_idx + 1}/{total_frames} frames ({progress:.1f}%) - "
|
|
627
|
+
f"Success: {total_processed}, Failed: {total_failed}", flush=True)
|
|
628
|
+
except (BrokenPipeError, IOError):
|
|
629
|
+
pass # Stdout disconnected (e.g., GUI subprocess)
|
|
630
|
+
|
|
631
|
+
# GUI progress callback (called every frame for smooth updates)
|
|
632
|
+
if progress_callback is not None:
|
|
633
|
+
try:
|
|
634
|
+
progress_callback(frame_idx + 1, total_frames, fps)
|
|
635
|
+
except Exception:
|
|
636
|
+
pass # Don't let callback errors stop processing
|
|
623
637
|
|
|
624
638
|
frame_idx += 1
|
|
625
639
|
|
|
@@ -128,7 +128,8 @@ class OpenFaceProcessor:
|
|
|
128
128
|
df = self.pipeline.process_video(
|
|
129
129
|
video_path=str(video_path),
|
|
130
130
|
output_csv=str(output_csv_path),
|
|
131
|
-
max_frames=None
|
|
131
|
+
max_frames=None,
|
|
132
|
+
progress_callback=progress_callback
|
|
132
133
|
)
|
|
133
134
|
|
|
134
135
|
success_count = df['success'].sum()
|
|
@@ -11,7 +11,7 @@ long_description = (this_directory / "README.md").read_text()
|
|
|
11
11
|
|
|
12
12
|
setup(
|
|
13
13
|
name="pyfaceau",
|
|
14
|
-
version="1.3.
|
|
14
|
+
version="1.3.6",
|
|
15
15
|
author="John Wilson",
|
|
16
16
|
author_email="", # Add email if desired
|
|
17
17
|
description="Pure Python OpenFace 2.2 AU extraction with PyMTCNN face detection and CLNF refinement",
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/utils/cython_extensions/cython_histogram_median.pyx
RENAMED
|
File without changes
|
{pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/utils/cython_extensions/cython_rotation_update.pyx
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
|