pyfaceau 1.3.9__tar.gz → 1.3.11__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 (187) hide show
  1. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/MANIFEST.in +3 -3
  2. pyfaceau-1.3.11/PKG-INFO +244 -0
  3. pyfaceau-1.3.11/README.md +193 -0
  4. pyfaceau-1.3.11/pyfaceau/__init__.py +46 -0
  5. pyfaceau-1.3.11/pyfaceau/download_weights.py +270 -0
  6. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/features/pdm.py +6 -1
  7. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/pipeline.py +6 -7
  8. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/prediction/batched_au_predictor.py +1 -1
  9. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/prediction/model_parser.py +1 -1
  10. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/processor.py +31 -5
  11. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/refinement/targeted_refiner.py +1 -1
  12. pyfaceau-1.3.11/pyfaceau.egg-info/PKG-INFO +244 -0
  13. pyfaceau-1.3.11/pyfaceau.egg-info/SOURCES.txt +179 -0
  14. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau.egg-info/entry_points.txt +1 -0
  15. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau.egg-info/requires.txt +7 -0
  16. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyproject.toml +9 -1
  17. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/requirements.txt +2 -0
  18. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/setup.py +2 -1
  19. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_10_dynamic.dat +3 -0
  20. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_10_static.dat +3 -0
  21. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_12_dynamic.dat +3 -0
  22. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_12_static.dat +3 -0
  23. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_14_dynamic.dat +3 -0
  24. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_14_static.dat +3 -0
  25. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_15_dynamic.dat +3 -0
  26. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_15_static.dat +3 -0
  27. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_17_dynamic.dat +3 -0
  28. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_17_static.dat +3 -0
  29. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_1_dynamic.dat +3 -0
  30. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_1_static.dat +3 -0
  31. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_20_dynamic.dat +3 -0
  32. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_20_static.dat +3 -0
  33. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_23_dynamic.dat +3 -0
  34. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_23_static.dat +3 -0
  35. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_25_dynamic.dat +3 -0
  36. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_25_static.dat +3 -0
  37. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_26_dynamic.dat +3 -0
  38. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_26_static.dat +3 -0
  39. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_28_dynamic.dat +3 -0
  40. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_28_static.dat +3 -0
  41. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_2_dynamic.dat +3 -0
  42. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_2_static.dat +3 -0
  43. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_45_dynamic.dat +3 -0
  44. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_45_static.dat +3 -0
  45. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_4_dynamic.dat +3 -0
  46. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_4_static.dat +3 -0
  47. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_5_dynamic.dat +3 -0
  48. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_5_static.dat +3 -0
  49. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_6_dynamic.dat +3 -0
  50. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_6_static.dat +3 -0
  51. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_7_dynamic.dat +3 -0
  52. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_7_static.dat +3 -0
  53. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_9_dynamic.dat +3 -0
  54. pyfaceau-1.3.11/weights/AU_predictors/svm_combined/AU_9_static.dat +3 -0
  55. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_12_dyn.dat +3 -0
  56. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_12_stat.dat +3 -0
  57. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_15_dyn.dat +3 -0
  58. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_15_stat.dat +3 -0
  59. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_17_dyn.dat +3 -0
  60. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_17_stat.dat +3 -0
  61. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_1_dyn.dat +3 -0
  62. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_1_stat.dat +3 -0
  63. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_20_dyn.dat +3 -0
  64. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_20_stat.dat +3 -0
  65. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_25_dyn.dat +3 -0
  66. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_25_stat.dat +3 -0
  67. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_26_dyn.dat +3 -0
  68. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_26_stat.dat +3 -0
  69. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_2_dyn.dat +3 -0
  70. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_2_stat.dat +3 -0
  71. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_4_dyn.dat +3 -0
  72. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_4_stat.dat +3 -0
  73. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_5_dyn.dat +3 -0
  74. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_5_stat.dat +3 -0
  75. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_6_dyn.dat +3 -0
  76. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_6_stat.dat +3 -0
  77. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_9_dyn.dat +3 -0
  78. pyfaceau-1.3.11/weights/AU_predictors/svm_disfa/AU_9_stat.dat +3 -0
  79. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_10_static_intensity_comb.dat +3 -0
  80. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_12_static_intensity_comb.dat +3 -0
  81. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_14_static_intensity.dat +3 -0
  82. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_15_dynamic_intensity_comb.dat +3 -0
  83. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_15_static_intensity_comb.dat +3 -0
  84. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_17_dynamic_intensity_comb.dat +3 -0
  85. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_17_static_intensity_comb.dat +3 -0
  86. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_1_dynamic_intensity_comb.dat +3 -0
  87. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_1_static_intensity.dat +3 -0
  88. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_1_static_intensity_comb.dat +3 -0
  89. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_20_dynamic_intensity.dat +3 -0
  90. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_20_static_intensity.dat +3 -0
  91. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_23_dynamic_intensity_comb.dat +3 -0
  92. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_23_static_intensity_comb.dat +3 -0
  93. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_25_dynamic_intensity_comb.dat +3 -0
  94. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_25_static_intensity.dat +3 -0
  95. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_26_dynamic_intensity_comb.dat +3 -0
  96. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_26_static_intensity_comb.dat +3 -0
  97. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_2_dynamic_intensity_comb.dat +3 -0
  98. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_2_static_intensity_comb.dat +3 -0
  99. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_45_dynamic_intensity_comb.dat +3 -0
  100. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_45_static_intensity_comb.dat +3 -0
  101. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_4_static_intensity_comb.dat +3 -0
  102. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_5_dynamic_intensity.dat +3 -0
  103. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_5_static_intensity.dat +3 -0
  104. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_6_static_intensity_comb.dat +3 -0
  105. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_7_static_intensity_comb.dat +3 -0
  106. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_9_dynamic_intensity.dat +3 -0
  107. pyfaceau-1.3.11/weights/AU_predictors/svr_combined/AU_9_static_intensity.dat +3 -0
  108. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_12_dynamic_intensity.dat +3 -0
  109. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_12_static_intensity.dat +3 -0
  110. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_15_dynamic_intensity.dat +3 -0
  111. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_15_static_intensity.dat +3 -0
  112. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_17_dynamic_intensity.dat +3 -0
  113. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_17_static_intensity.dat +3 -0
  114. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_1_dynamic_intensity.dat +3 -0
  115. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_1_static_intensity.dat +3 -0
  116. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_20_dynamic_intensity.dat +3 -0
  117. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_20_static_intensity.dat +3 -0
  118. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_25_dynamic_intensity.dat +3 -0
  119. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_25_static_intensity.dat +3 -0
  120. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_26_dynamic_intensity.dat +3 -0
  121. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_26_static_intensity.dat +3 -0
  122. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_2_dynamic_intensity.dat +3 -0
  123. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_2_static_intensity.dat +3 -0
  124. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_4_dynamic_intensity.dat +3 -0
  125. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_4_static_intensity.dat +3 -0
  126. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_5_dynamic_intensity.dat +3 -0
  127. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_5_static_intensity.dat +3 -0
  128. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_6_dynamic_intensity.dat +3 -0
  129. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_6_static_intensity.dat +3 -0
  130. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_9_dynamic_intensity.dat +3 -0
  131. pyfaceau-1.3.11/weights/AU_predictors/svr_disfa/AU_9_static_intensity.dat +3 -0
  132. pyfaceau-1.3.11/weights/patch_experts/cen_patches_0.25_of.dat +3 -0
  133. pyfaceau-1.3.11/weights/patch_experts/cen_patches_0.35_of.dat +3 -0
  134. pyfaceau-1.3.11/weights/patch_experts/cen_patches_0.50_of.dat +3 -0
  135. pyfaceau-1.3.11/weights/patch_experts/cen_patches_1.00_of.dat +3 -0
  136. pyfaceau-1.3.9/PKG-INFO +0 -84
  137. pyfaceau-1.3.9/README.md +0 -39
  138. pyfaceau-1.3.9/pyfaceau/__init__.py +0 -19
  139. pyfaceau-1.3.9/pyfaceau/download_weights.py +0 -134
  140. pyfaceau-1.3.9/pyfaceau.egg-info/PKG-INFO +0 -84
  141. pyfaceau-1.3.9/pyfaceau.egg-info/SOURCES.txt +0 -62
  142. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/LICENSE +0 -0
  143. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/alignment/__init__.py +0 -0
  144. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/alignment/calc_params.py +0 -0
  145. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/alignment/face_aligner.py +0 -0
  146. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/alignment/numba_calcparams_accelerator.py +0 -0
  147. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/alignment/paw.py +0 -0
  148. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/config.py +0 -0
  149. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/data/__init__.py +0 -0
  150. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/data/hdf5_dataset.py +0 -0
  151. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/data/quality_filter.py +0 -0
  152. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/data/training_data_generator.py +0 -0
  153. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/detectors/__init__.py +0 -0
  154. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/detectors/extract_mtcnn_weights.py +0 -0
  155. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/detectors/openface_mtcnn.py +0 -0
  156. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/detectors/pfld.py +0 -0
  157. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/detectors/pymtcnn_detector.py +0 -0
  158. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/detectors/retinaface.py +0 -0
  159. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/features/__init__.py +0 -0
  160. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/features/histogram_median_tracker.py +0 -0
  161. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/features/triangulation.py +0 -0
  162. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/nn/__init__.py +0 -0
  163. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/nn/au_prediction_inference.py +0 -0
  164. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/nn/au_prediction_net.py +0 -0
  165. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/nn/fast_pipeline.py +0 -0
  166. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/nn/landmark_pose_inference.py +0 -0
  167. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/nn/landmark_pose_net.py +0 -0
  168. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/nn/train_au_prediction.py +0 -0
  169. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/nn/train_landmark_pose.py +0 -0
  170. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/parallel_pipeline.py +0 -0
  171. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/prediction/__init__.py +0 -0
  172. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/prediction/au_predictor.py +0 -0
  173. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/prediction/online_au_correction.py +0 -0
  174. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/prediction/running_median.py +0 -0
  175. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/prediction/running_median_fallback.py +0 -0
  176. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/refinement/__init__.py +0 -0
  177. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/refinement/pdm.py +0 -0
  178. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/refinement/svr_patch_expert.py +0 -0
  179. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/utils/__init__.py +0 -0
  180. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/utils/cython_extensions/cython_histogram_median.pyx +0 -0
  181. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/utils/cython_extensions/cython_rotation_update.pyx +0 -0
  182. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau/utils/cython_extensions/setup.py +0 -0
  183. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau.egg-info/dependency_links.txt +0 -0
  184. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau.egg-info/not-zip-safe +0 -0
  185. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau.egg-info/top_level.txt +0 -0
  186. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/pyfaceau_gui.py +0 -0
  187. {pyfaceau-1.3.9 → pyfaceau-1.3.11}/setup.cfg +0 -0
@@ -21,9 +21,9 @@ global-exclude *.pyo
21
21
  global-exclude __pycache__
22
22
  global-exclude .DS_Store
23
23
 
24
- # Exclude weights (too large for PyPI, users must download separately)
25
- exclude weights/*
26
- recursive-exclude weights *
24
+ # Include weights for git-based installs (but these are excluded from PyPI sdist)
25
+ # Users installing from git will get weights; PyPI users must download separately
26
+ recursive-include weights *.txt *.dat
27
27
 
28
28
  # Exclude development files
29
29
  exclude .gitignore
@@ -0,0 +1,244 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyfaceau
3
+ Version: 1.3.11
4
+ Summary: Pure Python OpenFace 2.2 AU extraction with CLNF landmark refinement
5
+ Home-page: https://github.com/johnwilsoniv/face-analysis
6
+ Author: John Wilson
7
+ Author-email:
8
+ License: CC BY-NC 4.0
9
+ Project-URL: Homepage, https://github.com/johnwilsoniv/pyfaceau
10
+ Project-URL: Documentation, https://github.com/johnwilsoniv/pyfaceau
11
+ Project-URL: Repository, https://github.com/johnwilsoniv/pyfaceau
12
+ Project-URL: Bug Tracker, https://github.com/johnwilsoniv/pyfaceau/issues
13
+ Keywords: facial-action-units,openface,computer-vision,facial-analysis,emotion-recognition
14
+ Classifier: Development Status :: 5 - Production/Stable
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
17
+ Classifier: Topic :: Scientific/Engineering :: Image Recognition
18
+ Classifier: License :: Other/Proprietary License
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Operating System :: OS Independent
24
+ Requires-Python: >=3.10
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE
27
+ Requires-Dist: numpy>=1.20.0
28
+ Requires-Dist: opencv-python>=4.5.0
29
+ Requires-Dist: pandas>=1.3.0
30
+ Requires-Dist: onnxruntime>=1.10.0
31
+ Requires-Dist: scipy>=1.7.0
32
+ Requires-Dist: scikit-learn>=1.0.0
33
+ Requires-Dist: tqdm>=4.62.0
34
+ Requires-Dist: numba>=0.56.0
35
+ Requires-Dist: torch>=2.0.0
36
+ Requires-Dist: pyfhog>=0.1.0
37
+ Requires-Dist: pyclnf>=0.2.0
38
+ Requires-Dist: pymtcnn>=0.1.0
39
+ Provides-Extra: dev
40
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
41
+ Requires-Dist: black>=22.0.0; extra == "dev"
42
+ Requires-Dist: flake8>=4.0.0; extra == "dev"
43
+ Provides-Extra: accel
44
+ Requires-Dist: onnxruntime-coreml>=1.10.0; extra == "accel"
45
+ Provides-Extra: training
46
+ Requires-Dist: torch>=2.0.0; extra == "training"
47
+ Requires-Dist: h5py>=3.0.0; extra == "training"
48
+ Dynamic: home-page
49
+ Dynamic: license-file
50
+ Dynamic: requires-python
51
+
52
+ # pyfaceau
53
+
54
+ A python-based implementation of OpenFace 2.2's Facial Action Unit extraction pipeline with an accurate dlib substitute (ptmtcnn, pyclnf).
55
+
56
+ **Accuracy: r = 0.97 correlation with C++ OpenFace 2.2**
57
+
58
+ ## Installation
59
+
60
+ ### Option 1: Install from GitHub (Recommended for Development)
61
+
62
+ This includes model weights:
63
+
64
+ ```bash
65
+ # Clone repository with weights
66
+ git clone https://github.com/johnwilsoniv/pyfaceau.git
67
+ cd pyfaceau
68
+
69
+ # Create conda environment (recommended)
70
+ conda create -n pyfaceau python=3.11
71
+ conda activate pyfaceau
72
+
73
+ # Install in editable mode
74
+ pip install -e .
75
+ ```
76
+
77
+ ### Option 2: Install from PyPI
78
+
79
+ ```bash
80
+ pip install pyfaceau
81
+ ```
82
+
83
+ This automatically installs dependencies:
84
+ - [pyclnf](https://github.com/johnwilsoniv/pyclnf) - Facial landmark detection (68 points)
85
+ - [pymtcnn](https://github.com/johnwilsoniv/pymtcnn) - Face detection
86
+ - [pyfhog](https://github.com/johnwilsoniv/pyfhog) - FHOG feature extraction
87
+
88
+ ### Model Weights
89
+
90
+ Model weights (~50MB) are downloaded automatically on first use. If auto-download fails, download manually:
91
+
92
+ ```bash
93
+ # Download weights
94
+ python -m pyfaceau.download_weights
95
+
96
+ # Or after pip install
97
+ pyfaceau-download-weights
98
+ ```
99
+
100
+ Weights are stored in `~/.pyfaceau/weights/`. You can customize this location:
101
+
102
+ ```bash
103
+ # Set custom weights directory
104
+ export PYFACEAU_WEIGHTS_DIR=/path/to/your/weights
105
+ ```
106
+
107
+ ### Troubleshooting: "PDM file not found"
108
+
109
+ If you see this error:
110
+ 1. **First try**: Run `python -m pyfaceau.download_weights`
111
+ 2. **Manual fix**: Copy the `weights/` folder from the GitHub repo to `~/.pyfaceau/weights/`
112
+ 3. **Alternative**: Set `PYFACEAU_WEIGHTS_DIR` environment variable to point to your weights
113
+
114
+ ## Quick Start
115
+
116
+ ### Video Processing (Recommended)
117
+
118
+ ```python
119
+ from pyfaceau import OpenFaceProcessor
120
+
121
+ # Initialize processor
122
+ processor = OpenFaceProcessor(verbose=True)
123
+
124
+ # Process video to CSV (same format as OpenFace)
125
+ processor.process_video("input.mp4", "output.csv")
126
+ ```
127
+
128
+ ### Batch Processing
129
+
130
+ ```python
131
+ from pyfaceau import process_videos
132
+
133
+ # Process all videos in a directory
134
+ process_videos(
135
+ directory_path="/path/to/videos",
136
+ output_dir="/path/to/output"
137
+ )
138
+ ```
139
+
140
+ ### Frame-by-Frame Processing
141
+
142
+ ```python
143
+ from pyfaceau import FullPythonAUPipeline
144
+ from pathlib import Path
145
+ import cv2
146
+
147
+ # Initialize pipeline with model paths
148
+ weights_dir = Path("weights")
149
+ pipeline = FullPythonAUPipeline(
150
+ pdm_file=str(weights_dir / "In-the-wild_aligned_PDM_68.txt"),
151
+ au_models_dir=str(weights_dir / "AU_predictors"),
152
+ triangulation_file=str(weights_dir / "tris_68_full.txt"),
153
+ patch_expert_file=str(weights_dir / "svr_patches_0.25_general.txt")
154
+ )
155
+
156
+ # Process single frame
157
+ image = cv2.imread("face.jpg")
158
+ image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
159
+
160
+ result = pipeline.process_frame(image_rgb, frame_num=0)
161
+
162
+ if result['success']:
163
+ print("AU intensities:", result['au_intensities'])
164
+ print("Landmarks shape:", result['landmarks_2d'].shape) # (68, 2)
165
+ print("Pose (pitch, yaw, roll):", result['pose'])
166
+ ```
167
+
168
+ ## Output Format
169
+
170
+ ### CSV Output Columns
171
+
172
+ The output CSV matches OpenFace format:
173
+ - `frame` - Frame number
174
+ - `timestamp` - Time in seconds
175
+ - `confidence` - Detection confidence
176
+ - `success` - Whether face was detected
177
+ - `AU01_r` through `AU45_r` - AU intensities (0.0 - 5.0)
178
+ - `pose_Rx`, `pose_Ry`, `pose_Rz` - Head pose in radians
179
+ - `x_0` through `x_67`, `y_0` through `y_67` - 68 landmark coordinates
180
+
181
+ ### Action Units
182
+
183
+ 17 facial action units with intensity values (0.0 - 5.0):
184
+
185
+ | AU | Description |
186
+ |----|-------------|
187
+ | AU01 | Inner Brow Raiser |
188
+ | AU02 | Outer Brow Raiser |
189
+ | AU04 | Brow Lowerer |
190
+ | AU05 | Upper Lid Raiser |
191
+ | AU06 | Cheek Raiser |
192
+ | AU07 | Lid Tightener |
193
+ | AU09 | Nose Wrinkler |
194
+ | AU10 | Upper Lip Raiser |
195
+ | AU12 | Lip Corner Puller |
196
+ | AU14 | Dimpler |
197
+ | AU15 | Lip Corner Depressor |
198
+ | AU17 | Chin Raiser |
199
+ | AU20 | Lip Stretcher |
200
+ | AU23 | Lip Tightener |
201
+ | AU25 | Lips Part |
202
+ | AU26 | Jaw Drop |
203
+ | AU45 | Blink |
204
+
205
+ ## Accuracy
206
+
207
+ Validated against C++ OpenFace 2.2
208
+
209
+ | Metric | Correlation |
210
+ |--------|-------------|
211
+ | **Overall Mean** | r = 0.97 |
212
+ | **Overall Median** | r = 0.996 |
213
+ | Static AUs | r = 0.98 |
214
+ | Dynamic AUs | r = 0.96 |
215
+
216
+ Per-AU correlations:
217
+ - AU01: 0.997, AU02: 0.999, AU04: 0.989, AU05: 0.999
218
+ - AU06: 0.999, AU07: 0.996, AU09: 0.997, AU10: 0.994
219
+ - AU12: 0.998, AU14: 0.974, AU15: 0.893, AU17: 0.948
220
+ - AU20: 0.817, AU23: 0.996, AU25: 0.984, AU26: 0.902, AU45: 0.998
221
+
222
+ ## Requirements
223
+
224
+ - Python 3.8+
225
+ - numpy
226
+ - opencv-python
227
+ - torch
228
+ - scipy
229
+
230
+ ## Acknowledgments
231
+
232
+ Based on OpenFace 2.2:
233
+
234
+ > Baltrusaitis, T., Zadeh, A., Lim, Y. C., & Morency, L. P. (2018). OpenFace 2.0: Facial Behavior Analysis Toolkit. IEEE International Conference on Automatic Face and Gesture Recognition.
235
+
236
+ ## Citation
237
+
238
+ If you use this in research, please cite:
239
+
240
+ > Wilson IV, J., Rosenberg, J., Gray, M. L., & Razavi, C. R. (2025). A split-face computer vision/machine learning assessment of facial paralysis using facial action units. *Facial Plastic Surgery & Aesthetic Medicine*. https://doi.org/10.1177/26893614251394382
241
+
242
+ ## License
243
+
244
+ CC BY-NC 4.0 - Free for non-commercial use with attribution.
@@ -0,0 +1,193 @@
1
+ # pyfaceau
2
+
3
+ A python-based implementation of OpenFace 2.2's Facial Action Unit extraction pipeline with an accurate dlib substitute (ptmtcnn, pyclnf).
4
+
5
+ **Accuracy: r = 0.97 correlation with C++ OpenFace 2.2**
6
+
7
+ ## Installation
8
+
9
+ ### Option 1: Install from GitHub (Recommended for Development)
10
+
11
+ This includes model weights:
12
+
13
+ ```bash
14
+ # Clone repository with weights
15
+ git clone https://github.com/johnwilsoniv/pyfaceau.git
16
+ cd pyfaceau
17
+
18
+ # Create conda environment (recommended)
19
+ conda create -n pyfaceau python=3.11
20
+ conda activate pyfaceau
21
+
22
+ # Install in editable mode
23
+ pip install -e .
24
+ ```
25
+
26
+ ### Option 2: Install from PyPI
27
+
28
+ ```bash
29
+ pip install pyfaceau
30
+ ```
31
+
32
+ This automatically installs dependencies:
33
+ - [pyclnf](https://github.com/johnwilsoniv/pyclnf) - Facial landmark detection (68 points)
34
+ - [pymtcnn](https://github.com/johnwilsoniv/pymtcnn) - Face detection
35
+ - [pyfhog](https://github.com/johnwilsoniv/pyfhog) - FHOG feature extraction
36
+
37
+ ### Model Weights
38
+
39
+ Model weights (~50MB) are downloaded automatically on first use. If auto-download fails, download manually:
40
+
41
+ ```bash
42
+ # Download weights
43
+ python -m pyfaceau.download_weights
44
+
45
+ # Or after pip install
46
+ pyfaceau-download-weights
47
+ ```
48
+
49
+ Weights are stored in `~/.pyfaceau/weights/`. You can customize this location:
50
+
51
+ ```bash
52
+ # Set custom weights directory
53
+ export PYFACEAU_WEIGHTS_DIR=/path/to/your/weights
54
+ ```
55
+
56
+ ### Troubleshooting: "PDM file not found"
57
+
58
+ If you see this error:
59
+ 1. **First try**: Run `python -m pyfaceau.download_weights`
60
+ 2. **Manual fix**: Copy the `weights/` folder from the GitHub repo to `~/.pyfaceau/weights/`
61
+ 3. **Alternative**: Set `PYFACEAU_WEIGHTS_DIR` environment variable to point to your weights
62
+
63
+ ## Quick Start
64
+
65
+ ### Video Processing (Recommended)
66
+
67
+ ```python
68
+ from pyfaceau import OpenFaceProcessor
69
+
70
+ # Initialize processor
71
+ processor = OpenFaceProcessor(verbose=True)
72
+
73
+ # Process video to CSV (same format as OpenFace)
74
+ processor.process_video("input.mp4", "output.csv")
75
+ ```
76
+
77
+ ### Batch Processing
78
+
79
+ ```python
80
+ from pyfaceau import process_videos
81
+
82
+ # Process all videos in a directory
83
+ process_videos(
84
+ directory_path="/path/to/videos",
85
+ output_dir="/path/to/output"
86
+ )
87
+ ```
88
+
89
+ ### Frame-by-Frame Processing
90
+
91
+ ```python
92
+ from pyfaceau import FullPythonAUPipeline
93
+ from pathlib import Path
94
+ import cv2
95
+
96
+ # Initialize pipeline with model paths
97
+ weights_dir = Path("weights")
98
+ pipeline = FullPythonAUPipeline(
99
+ pdm_file=str(weights_dir / "In-the-wild_aligned_PDM_68.txt"),
100
+ au_models_dir=str(weights_dir / "AU_predictors"),
101
+ triangulation_file=str(weights_dir / "tris_68_full.txt"),
102
+ patch_expert_file=str(weights_dir / "svr_patches_0.25_general.txt")
103
+ )
104
+
105
+ # Process single frame
106
+ image = cv2.imread("face.jpg")
107
+ image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
108
+
109
+ result = pipeline.process_frame(image_rgb, frame_num=0)
110
+
111
+ if result['success']:
112
+ print("AU intensities:", result['au_intensities'])
113
+ print("Landmarks shape:", result['landmarks_2d'].shape) # (68, 2)
114
+ print("Pose (pitch, yaw, roll):", result['pose'])
115
+ ```
116
+
117
+ ## Output Format
118
+
119
+ ### CSV Output Columns
120
+
121
+ The output CSV matches OpenFace format:
122
+ - `frame` - Frame number
123
+ - `timestamp` - Time in seconds
124
+ - `confidence` - Detection confidence
125
+ - `success` - Whether face was detected
126
+ - `AU01_r` through `AU45_r` - AU intensities (0.0 - 5.0)
127
+ - `pose_Rx`, `pose_Ry`, `pose_Rz` - Head pose in radians
128
+ - `x_0` through `x_67`, `y_0` through `y_67` - 68 landmark coordinates
129
+
130
+ ### Action Units
131
+
132
+ 17 facial action units with intensity values (0.0 - 5.0):
133
+
134
+ | AU | Description |
135
+ |----|-------------|
136
+ | AU01 | Inner Brow Raiser |
137
+ | AU02 | Outer Brow Raiser |
138
+ | AU04 | Brow Lowerer |
139
+ | AU05 | Upper Lid Raiser |
140
+ | AU06 | Cheek Raiser |
141
+ | AU07 | Lid Tightener |
142
+ | AU09 | Nose Wrinkler |
143
+ | AU10 | Upper Lip Raiser |
144
+ | AU12 | Lip Corner Puller |
145
+ | AU14 | Dimpler |
146
+ | AU15 | Lip Corner Depressor |
147
+ | AU17 | Chin Raiser |
148
+ | AU20 | Lip Stretcher |
149
+ | AU23 | Lip Tightener |
150
+ | AU25 | Lips Part |
151
+ | AU26 | Jaw Drop |
152
+ | AU45 | Blink |
153
+
154
+ ## Accuracy
155
+
156
+ Validated against C++ OpenFace 2.2
157
+
158
+ | Metric | Correlation |
159
+ |--------|-------------|
160
+ | **Overall Mean** | r = 0.97 |
161
+ | **Overall Median** | r = 0.996 |
162
+ | Static AUs | r = 0.98 |
163
+ | Dynamic AUs | r = 0.96 |
164
+
165
+ Per-AU correlations:
166
+ - AU01: 0.997, AU02: 0.999, AU04: 0.989, AU05: 0.999
167
+ - AU06: 0.999, AU07: 0.996, AU09: 0.997, AU10: 0.994
168
+ - AU12: 0.998, AU14: 0.974, AU15: 0.893, AU17: 0.948
169
+ - AU20: 0.817, AU23: 0.996, AU25: 0.984, AU26: 0.902, AU45: 0.998
170
+
171
+ ## Requirements
172
+
173
+ - Python 3.8+
174
+ - numpy
175
+ - opencv-python
176
+ - torch
177
+ - scipy
178
+
179
+ ## Acknowledgments
180
+
181
+ Based on OpenFace 2.2:
182
+
183
+ > Baltrusaitis, T., Zadeh, A., Lim, Y. C., & Morency, L. P. (2018). OpenFace 2.0: Facial Behavior Analysis Toolkit. IEEE International Conference on Automatic Face and Gesture Recognition.
184
+
185
+ ## Citation
186
+
187
+ If you use this in research, please cite:
188
+
189
+ > Wilson IV, J., Rosenberg, J., Gray, M. L., & Razavi, C. R. (2025). A split-face computer vision/machine learning assessment of facial paralysis using facial action units. *Facial Plastic Surgery & Aesthetic Medicine*. https://doi.org/10.1177/26893614251394382
190
+
191
+ ## License
192
+
193
+ CC BY-NC 4.0 - Free for non-commercial use with attribution.
@@ -0,0 +1,46 @@
1
+ """
2
+ pyfaceau - Pure Python OpenFace 2.2 AU Extraction
3
+
4
+ A complete Python implementation of OpenFace 2.2's AU extraction pipeline
5
+ with high-performance parallel processing support and CLNF landmark refinement.
6
+ """
7
+
8
+ __version__ = "1.3.11"
9
+
10
+ # Weight management functions can be imported without heavy dependencies
11
+ from .download_weights import (
12
+ download_weights,
13
+ ensure_weights,
14
+ get_weights_dir,
15
+ weights_exist
16
+ )
17
+
18
+
19
+ def __getattr__(name):
20
+ """Lazy import of heavy modules to speed up package loading."""
21
+ if name == 'FullPythonAUPipeline':
22
+ from .pipeline import FullPythonAUPipeline
23
+ return FullPythonAUPipeline
24
+ elif name == 'ParallelAUPipeline':
25
+ from .parallel_pipeline import ParallelAUPipeline
26
+ return ParallelAUPipeline
27
+ elif name == 'OpenFaceProcessor':
28
+ from .processor import OpenFaceProcessor
29
+ return OpenFaceProcessor
30
+ elif name == 'process_videos':
31
+ from .processor import process_videos
32
+ return process_videos
33
+ raise AttributeError(f"module 'pyfaceau' has no attribute '{name}'")
34
+
35
+
36
+ __all__ = [
37
+ 'FullPythonAUPipeline',
38
+ 'ParallelAUPipeline',
39
+ 'OpenFaceProcessor',
40
+ 'process_videos',
41
+ # Weight management
42
+ 'download_weights',
43
+ 'ensure_weights',
44
+ 'get_weights_dir',
45
+ 'weights_exist',
46
+ ]