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.
Files changed (64) hide show
  1. {pyfaceau-1.3.5/pyfaceau.egg-info → pyfaceau-1.3.6}/PKG-INFO +1 -1
  2. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/pipeline.py +21 -7
  3. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/processor.py +2 -1
  4. {pyfaceau-1.3.5 → pyfaceau-1.3.6/pyfaceau.egg-info}/PKG-INFO +1 -1
  5. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyproject.toml +1 -1
  6. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/setup.py +1 -1
  7. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/LICENSE +0 -0
  8. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/MANIFEST.in +0 -0
  9. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/README.md +0 -0
  10. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/__init__.py +0 -0
  11. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/alignment/__init__.py +0 -0
  12. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/alignment/calc_params.py +0 -0
  13. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/alignment/face_aligner.py +0 -0
  14. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/alignment/numba_calcparams_accelerator.py +0 -0
  15. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/alignment/paw.py +0 -0
  16. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/config.py +0 -0
  17. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/data/__init__.py +0 -0
  18. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/data/hdf5_dataset.py +0 -0
  19. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/data/quality_filter.py +0 -0
  20. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/data/training_data_generator.py +0 -0
  21. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/__init__.py +0 -0
  22. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/extract_mtcnn_weights.py +0 -0
  23. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/openface_mtcnn.py +0 -0
  24. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/pfld.py +0 -0
  25. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/pymtcnn_detector.py +0 -0
  26. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/detectors/retinaface.py +0 -0
  27. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/download_weights.py +0 -0
  28. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/features/__init__.py +0 -0
  29. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/features/histogram_median_tracker.py +0 -0
  30. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/features/pdm.py +0 -0
  31. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/features/triangulation.py +0 -0
  32. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/__init__.py +0 -0
  33. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/au_prediction_inference.py +0 -0
  34. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/au_prediction_net.py +0 -0
  35. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/fast_pipeline.py +0 -0
  36. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/landmark_pose_inference.py +0 -0
  37. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/landmark_pose_net.py +0 -0
  38. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/train_au_prediction.py +0 -0
  39. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/nn/train_landmark_pose.py +0 -0
  40. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/parallel_pipeline.py +0 -0
  41. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/__init__.py +0 -0
  42. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/au_predictor.py +0 -0
  43. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/batched_au_predictor.py +0 -0
  44. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/model_parser.py +0 -0
  45. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/online_au_correction.py +0 -0
  46. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/running_median.py +0 -0
  47. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/prediction/running_median_fallback.py +0 -0
  48. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/refinement/__init__.py +0 -0
  49. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/refinement/pdm.py +0 -0
  50. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/refinement/svr_patch_expert.py +0 -0
  51. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/refinement/targeted_refiner.py +0 -0
  52. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/utils/__init__.py +0 -0
  53. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/utils/cython_extensions/cython_histogram_median.pyx +0 -0
  54. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/utils/cython_extensions/cython_rotation_update.pyx +0 -0
  55. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau/utils/cython_extensions/setup.py +0 -0
  56. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/SOURCES.txt +0 -0
  57. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/dependency_links.txt +0 -0
  58. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/entry_points.txt +0 -0
  59. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/not-zip-safe +0 -0
  60. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/requires.txt +0 -0
  61. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau.egg-info/top_level.txt +0 -0
  62. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/pyfaceau_gui.py +0 -0
  63. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/requirements.txt +0 -0
  64. {pyfaceau-1.3.5 → pyfaceau-1.3.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyfaceau
3
- Version: 1.3.5
3
+ Version: 1.3.6
4
4
  Summary: Pure Python OpenFace 2.2 AU extraction with CLNF landmark refinement
5
5
  Home-page: https://github.com/johnwilsoniv/face-analysis
6
6
  Author: John Wilson
@@ -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
- print(f"Progress: {frame_idx + 1}/{total_frames} frames ({progress:.1f}%) - "
622
- f"Success: {total_processed}, Failed: {total_failed}", flush=True)
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()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyfaceau
3
- Version: 1.3.5
3
+ Version: 1.3.6
4
4
  Summary: Pure Python OpenFace 2.2 AU extraction with CLNF landmark refinement
5
5
  Home-page: https://github.com/johnwilsoniv/face-analysis
6
6
  Author: John Wilson
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyfaceau"
7
- version = "1.3.5"
7
+ version = "1.3.6"
8
8
  description = "Pure Python OpenFace 2.2 AU extraction with CLNF landmark refinement"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -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.5",
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