21 binary heads partial-label BCE MobileNetV3-L 訓練日期:2026-04-30 | 來源:cvat2 project 5(66K imgs / 163K person crops)
| Attribute | AP | F1 | P | R | thr | TP | FP | FN | Valid |
|---|
cvat2 project 5(factory_ppe_v20260426_pool):132 tasks, ~120K imgs。每張 person bbox 切 crop(15% padding)→ 307,569 person crops(p5+p12 合併)。
| Split | Crops |
|---|---|
| Train | ~140 K |
| Validation | ~21 K |
| Test | ~13 K |
import torch, torch.nn as nn
import timm
from PIL import Image
import torchvision.transforms as T
ckpt = torch.load("factory_ppe_v20260503_best.pt", weights_only=False)
class GenericClassifier(nn.Module):
def __init__(self, backbone, n_attr, feat_dim):
super().__init__()
self.backbone = timm.create_model(backbone, pretrained=False, num_classes=0, global_pool="avg")
self.dropout = nn.Dropout(0.3); self.cls = nn.Linear(feat_dim, n_attr)
def forward(self, x): return self.cls(self.dropout(self.backbone(x)))
model = GenericClassifier(ckpt["backbone_name"], len(ckpt["attrs"]), ckpt["feat_dim"]).cuda().eval()
model.load_state_dict(ckpt["model_state"])
attrs = ckpt["attrs"]; thr = ckpt["thresholds"]
tf = T.Compose([T.Resize((384,192)), T.ToTensor(),
T.Normalize([0.485,0.456,0.406], [0.229,0.224,0.225])])
def predict(person_crop_pil):
x = tf(person_crop_pil).unsqueeze(0).cuda()
with torch.no_grad():
probs = torch.sigmoid(model(x))[0].cpu().numpy()
return {a: (float(probs[i]), float(probs[i]) >= thr[a]) for i, a in enumerate(attrs)}
已部署 http://192.168.53.21:7860/。 做為 PPE21 與 forklift_ppe(cascade pipeline)兩個 handler 的分類器。
| Backbone | mobilenetv3_large_100.ra_in1k(pretrained) |
|---|---|
| Optimizer | AdamW (lr=3e-4, wd=0.01) |
| Batch | 128 |
| Image size | 384 × 192 |
| Epochs run | 19 / 40(patience=8 觸發) |
| Best epoch | 11(val_mAP=0.9822) |
| Augmentation | strong + mixup α=0.2 |
| Loss | partial-label BCE:(value, mask) 雙欄,mask=0 跳過 loss |
R2: https://pub-478929a98a5c440cb22c2241c0bde314.r2.dev/factory_ppe_v20260503/best.pt
Generated 2026-04-30 | 回到目錄