Download average.py from Akjava/mediapipe-head-pose-estimation: direct link, hf CLI and curl.
- Browser
- Download file 3.59 kB
-
https://huggingface.co/spaces/Akjava/mediapipe-head-pose-estimation/resolve/main/average.py
- Command line
-
hf download hf://spaces/Akjava/mediapipe-head-pose-estimation/average.py
-
curl -L -o average.py https://huggingface.co/spaces/Akjava/mediapipe-head-pose-estimation/resolve/main/average.py
3.59 kB
| import numpy as np | |
| def analyze_3d_data(data): | |
| """ | |
| 3Dデータポイントのリストを受け取り、トリム平均とSTD法による外れ値を返す | |
| Args: | |
| data: [(x1, y1, z1), (x2, y2, z2), ...] 形式のリスト | |
| Returns: | |
| dict: | |
| { | |
| 'trimmed_mean': (x_mean, y_mean, z_mean), # トリム平均 | |
| 'std_outliers': { | |
| 'x': [x_outlier1, x_outlier2, ...], # x座標の外れ値 | |
| 'y': [y_outlier1, y_outlier2, ...], # y座標の外れ値 | |
| 'z': [z_outlier1, z_outlier2, ...] # z座標の外れ値 | |
| }, | |
| 'trimmed_data': { | |
| 'x': [x1, x2, ...], # トリム平均に使用したx座標データ | |
| 'y': [y1, y2, ...], # トリム平均に使用したy座標データ | |
| 'z': [z1, z2, ...] # トリム平均に使用したz座標データ | |
| } | |
| } | |
| """ | |
| # データを x, y, z 座標ごとに整理 | |
| x_coords = [point[0] for point in data] | |
| y_coords = [point[1] for point in data] | |
| z_coords = [point[2] for point in data] | |
| def trimmed_data_and_mean(coords): | |
| """ | |
| 最小値と最大値を除外したデータとトリム平均を返す | |
| """ | |
| coords_sorted = sorted(coords) | |
| trimmed_coords = coords_sorted[1:-1] # 最小値と最大値を除外 | |
| return trimmed_coords, np.mean(trimmed_coords) | |
| # 各座標のトリム平均を計算 | |
| x_trimmed, x_trimmed_mean = trimmed_data_and_mean(x_coords) | |
| y_trimmed, y_trimmed_mean = trimmed_data_and_mean(y_coords) | |
| z_trimmed, z_trimmed_mean = trimmed_data_and_mean(z_coords) | |
| def detect_outliers_std(data, multiplier=2): | |
| """ | |
| 標準偏差に基づく外れ値検出 (multiplier=2) | |
| """ | |
| mean = np.mean(data) | |
| std = np.std(data) | |
| lower_bound = mean - multiplier * std | |
| upper_bound = mean + multiplier * std | |
| outliers = [x for x in data if x < lower_bound or x > upper_bound] | |
| return outliers | |
| # トリム後のデータに対して STD 法を適用 | |
| x_outliers_std = detect_outliers_std(x_trimmed, multiplier=2) | |
| y_outliers_std = detect_outliers_std(y_trimmed, multiplier=2) | |
| z_outliers_std = detect_outliers_std(z_trimmed, multiplier=2) | |
| return { | |
| 'trimmed_mean': (round(x_trimmed_mean,2), round(y_trimmed_mean,2), round(z_trimmed_mean,2)), | |
| 'std_outliers': { | |
| 'x': x_outliers_std, | |
| 'y': y_outliers_std, | |
| 'z': z_outliers_std, | |
| }, | |
| 'trimmed_data': { | |
| 'x': x_trimmed, | |
| 'y': y_trimmed, | |
| 'z': z_trimmed | |
| } | |
| } | |
| """ | |
| # 使用例 (元のデータを使用) | |
| data = { | |
| 'hgbr-15': [-5.4, 1.56, -2.92], | |
| 'hgbr-45': [-4.5, 1.2, -1.76], | |
| 'hgbr-90': [1.58, 1.82, -3.35], | |
| 'lgbm-15dart': [-6.18, 3.11, -2.46], | |
| 'lgbm-15': [-5.65, 1.76, -2.59], | |
| 'lgbm-45': [-7.18, 1.42, -2.71], | |
| 'lgbm-90': [-3.58, 3.94, -2.5], | |
| } | |
| # 辞書型のデータをリスト型に変換 | |
| data_list = list(data.values()) | |
| # 関数を呼び出し | |
| result = analyze_3d_data(data_list) | |
| # 結果を表示 | |
| print("トリム平均:", result['trimmed_mean']) | |
| print("STD法による外れ値 (multiplier=2):") | |
| print(" x:", result['std_outliers']['x']) | |
| print(" y:", result['std_outliers']['y']) | |
| print(" z:", result['std_outliers']['z']) | |
| print("トリム平均に使用したデータ:") | |
| print(" x:", result['trimmed_data']['x']) | |
| print(" y:", result['trimmed_data']['y']) | |
| print(" z:", result['trimmed_data']['z']) | |
| """ | |