SeiyaCM commited on
Commit
31d865d
·
verified ·
1 Parent(s): fea18c0

Add README.md (model/dataset card)

Browse files
Files changed (1) hide show
  1. README.md +195 -0
README.md ADDED
@@ -0,0 +1,195 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ language:
4
+ - ja
5
+ - en
6
+ tags:
7
+ - image-classification
8
+ - onnx
9
+ - resnet
10
+ - posture-detection
11
+ - fatigue-detection
12
+ datasets:
13
+ - SeiyaCM/KandenAiHackathonPosture2
14
+ pipeline_tag: image-classification
15
+ ---
16
+
17
+ # Posture Classifier — エンジニア姿勢分類モデル
18
+
19
+ > **English Summary**
20
+ > A ResNet18-based posture classifier that detects four sitting postures of engineers (good, slouch, chin rest, stretch) for real-time fatigue monitoring. Trained on 52,500 synthetic images generated with Stable Diffusion + ControlNet, achieving **97.33 % validation accuracy** with zero false positives on slouch detection. Exported as a lightweight ONNX model (~42 MB) for edge deployment on DGX Spark.
21
+
22
+ ---
23
+
24
+ ## モデル概要
25
+
26
+ 本モデルは、**空間AIブレイン** プロジェクトの一部として開発された、エンジニアの座り姿勢をリアルタイムに分類する画像分類モデルです。Webカメラ映像から以下の4つの姿勢を検出し、疲労度のスコアリングに活用されます。
27
+
28
+ | クラスID | クラス名 | 説明 | 疲労マッピング |
29
+ |----------|---------|------|--------------|
30
+ | 0 | `good` | 正しい姿勢で作業中 | 0.0(疲労なし) |
31
+ | 1 | `slouch` | 猫背で前傾した疲労姿勢 | 0.7(高疲労) |
32
+ | 2 | `chin_rest` | 頬杖をつく(ストレス・集中力低下) | 0.9(非常に高疲労) |
33
+ | 3 | `stretch` | ストレッチ・伸び(休憩・回復行動) | 0.3(軽度) |
34
+
35
+ ---
36
+
37
+ ## ベースモデル / Base Model
38
+
39
+ - **アーキテクチャ**: ResNet18 (`torchvision.models.resnet18`)
40
+ - **事前学習**: ImageNet (ResNet18_Weights.DEFAULT)
41
+ - **変更箇所**: 最終全結合層を `nn.Linear(512, 4)` に置換
42
+
43
+ ---
44
+
45
+ ## 学習方法 / Training
46
+
47
+ - **手法**: Full fine-tuning(全レイヤーを再学習)
48
+ - **GPU環境**: NVIDIA RTX A5000 × 4 (DataParallel)
49
+ - **オプティマイザ**: AdamW (lr=5e-4, weight_decay=1e-4)
50
+ - **スケジューラ**: CosineAnnealingLR (T_max=30, eta_min=1e-6)
51
+ - **損失関数**: CrossEntropyLoss(クラス不均衡補正の重み付き)
52
+ - **エポック数**: 30
53
+ - **バッチサイズ**: 256
54
+ - **データ分割**: 90 % train / 10 % validation (seed=42)
55
+ - **データ拡張** (学習時):
56
+ - Resize(256) → RandomCrop(224)
57
+ - RandomRotation(10°)
58
+ - RandomHorizontalFlip
59
+ - ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2)
60
+ - ImageNet正規化 (mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
61
+
62
+ ---
63
+
64
+ ## 使用データ / Training Data
65
+
66
+ - **データセット**: [SeiyaCM/KandenAiHackathonPosture2](https://huggingface.co/datasets/SeiyaCM/KandenAiHackathonPosture2)
67
+ - **枚数**: 52,500枚の合成画像
68
+ - **生成方法**: Stable Diffusion v1.5 + ControlNet (Depth) — ベース画像の深度マップを制御信号として多様なバリエーションを生成
69
+ - **フォーマット**: Parquet (image, label, prompt)
70
+
71
+ ---
72
+
73
+ ## 性能・評価指標 / Performance
74
+
75
+ | 指標 | 値 |
76
+ |------|-----|
77
+ | **検証精度 (Validation Accuracy)** | **97.33 %** |
78
+ | 猫背 (slouch) 誤検知率 | **0 %**(False Positive ゼロ) |
79
+
80
+ ---
81
+
82
+ ## 入出力仕様 / Input & Output
83
+
84
+ ### 入力 (Input)
85
+
86
+ | 名前 | 形状 | 型 | 説明 |
87
+ |------|------|-----|------|
88
+ | `image` | `(batch, 3, 224, 224)` | float32 | RGB画像。ImageNet正規化済み |
89
+
90
+ **前処理パイプライン**:
91
+ 1. BGR → RGB 変換
92
+ 2. 224×224 にリサイズ
93
+ 3. [0, 255] → [0.0, 1.0] に正規化
94
+ 4. HWC → CHW 転置
95
+ 5. ImageNet正規化: `(pixel - mean) / std`
96
+ - mean = [0.485, 0.456, 0.406]
97
+ - std = [0.229, 0.224, 0.225]
98
+
99
+ ### 出力 (Output)
100
+
101
+ | 名前 | 形状 | 型 | 説明 |
102
+ |------|------|-----|------|
103
+ | `logits` | `(batch, 4)` | float32 | 各クラスのロジット値。softmax で確率に変換 |
104
+
105
+ ---
106
+
107
+ ## 推論方法 / Inference
108
+
109
+ ### ONNX Runtime (Python)
110
+
111
+ ```python
112
+ import numpy as np
113
+ import onnxruntime as ort
114
+ import cv2
115
+
116
+ # モデルのロード
117
+ session = ort.InferenceSession("posture_classifier.onnx")
118
+
119
+ # 前処理
120
+ MEAN = np.array([0.485, 0.456, 0.406], dtype=np.float32).reshape(3, 1, 1)
121
+ STD = np.array([0.229, 0.224, 0.225], dtype=np.float32).reshape(3, 1, 1)
122
+ CLASSES = ["good", "slouch", "chin_rest", "stretch"]
123
+
124
+ def preprocess(bgr_frame):
125
+ rgb = cv2.cvtColor(bgr_frame, cv2.COLOR_BGR2RGB)
126
+ resized = cv2.resize(rgb, (224, 224))
127
+ tensor = resized.astype(np.float32) / 255.0
128
+ tensor = tensor.transpose(2, 0, 1) # HWC → CHW
129
+ tensor = (tensor - MEAN) / STD
130
+ return tensor[np.newaxis, ...] # (1, 3, 224, 224)
131
+
132
+ # 推論
133
+ frame = cv2.imread("test_image.jpg")
134
+ input_tensor = preprocess(frame)
135
+ logits = session.run(["logits"], {"image": input_tensor})[0]
136
+
137
+ # Softmax → クラス予測
138
+ exp = np.exp(logits - np.max(logits, axis=-1, keepdims=True))
139
+ probs = exp / exp.sum(axis=-1, keepdims=True)
140
+ class_idx = int(np.argmax(probs[0]))
141
+ print(f"Predicted: {CLASSES[class_idx]} ({probs[0][class_idx]:.2%})")
142
+ ```
143
+
144
+ ---
145
+
146
+ ## 想定ユースケース / Intended Use
147
+
148
+ - エンジニアのリアルタイム疲労モニタリング
149
+ - オフィス環境でのウェルネス管理システム
150
+ - スマートホームとの連携による自動環境制御
151
+
152
+ ## 非推奨ユースケース / Out-of-Scope Use
153
+
154
+ - 監視・プライバシー侵害を目的とした利用
155
+ - 医療診断や健康評価の根拠としての利用
156
+ - 屋外や非オフィス環境での姿勢判定
157
+ - 人事評価や勤怠管理への直接的な利用
158
+
159
+ ---
160
+
161
+ ## 制約・限界・バイアス / Limitations & Bias
162
+
163
+ - **合成データのみで学習**: 実際の人物写真ではなく、Stable Diffusionで生成された合成画像で学習しています。実環境の多様な照明・背景・服装条件では精度が低下する可能性があります
164
+ - **単一人物を想定**: 複数人がフレーム内に映る場合の動作は未検証です
165
+ - **カメラ角度依存**: 学習データはWebカメラの正面〜やや上方アングルを想定しています。極端な角度では精度が低下します
166
+ - **文化的バイアス**: 生成プロンプトに特定の属性(年齢、性別等)のバリエーションを含めていますが、完全な多様性は保証されません
167
+ - **4クラスのみ**: 「居眠り」「離席」等の姿勢には対応していません
168
+
169
+ ---
170
+
171
+ ## ライセンス / License
172
+
173
+ Apache License 2.0
174
+
175
+ ---
176
+
177
+ ## 引用 / Citation
178
+
179
+ ```bibtex
180
+ @misc{kanden_posture_model_2025,
181
+ title = {Posture Classifier: ResNet18-based Engineer Fatigue Posture Detection},
182
+ author = {Team NANIWA-Factory},
183
+ year = {2025},
184
+ url = {https://huggingface.co/SeiyaCM/KandenAiHackathonPostureModel},
185
+ note = {Kanden AI Hackathon — Space AI Brain Project}
186
+ }
187
+ ```
188
+
189
+ ---
190
+
191
+ ## 関連リンク / Related Links
192
+
193
+ - **GitHub**: [SeiyaCM/kanden-ai-hackathon](https://github.com/SeiyaCM/kanden-ai-hackathon)
194
+ - **HuggingFace モデル**: [SeiyaCM/KandenAiHackathonPostureModel](https://huggingface.co/SeiyaCM/KandenAiHackathonPostureModel)
195
+ - **学習データ**: [SeiyaCM/KandenAiHackathonPosture2](https://huggingface.co/datasets/SeiyaCM/KandenAiHackathonPosture2)