1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| import torch import torch.nn as nn
class CNNBiLSTMTransfer(nn.Module): """ CNN-BiLSTM + 知识迁移框架 CNN: 提取空间特征(面部/手部/姿态) BiLSTM: 建模时序依赖(分心行为序列) 知识迁移: 从乘用车预训练→公交车微调 """ def __init__(self, num_classes=10, pretrained=True): super().__init__() self.backbone = self._build_backbone(pretrained) self.bilstm = nn.LSTM( input_size=512, hidden_size=256, num_layers=2, batch_first=True, bidirectional=True ) self.classifier = nn.Sequential( nn.Linear(512, 128), nn.ReLU(), nn.Dropout(0.3), nn.Linear(128, num_classes) ) def _build_backbone(self, pretrained): """构建CNN骨干网络""" import torchvision.models as models resnet = models.resnet18(pretrained=pretrained) return nn.Sequential(*list(resnet.children())[:-1]) def forward(self, x): """ Args: x: 视频帧序列, shape=(B, T, C, H, W) T=帧数(时序窗口) """ B, T, C, H, W = x.shape x = x.view(B * T, C, H, W) cnn_features = self.backbone(x) cnn_features = cnn_features.view(B, T, -1) lstm_out, _ = self.bilstm(cnn_features) output = self.classifier(lstm_out[:, -1, :]) return output
class KnowledgeTransfer: """ 三阶段知识迁移 Stage 1: ImageNet → 乘用车DMS (源域) Stage 2: 乘用车DMS → 公交车DMS (目标域) Stage 3: 公交车DMS微调 """ def __init__(self): self.model = CNNBiLSTMTransfer(pretrained=True) def stage1_source_train(self, car_dms_data): """Stage 1: 在乘用车DMS数据集上训练""" optimizer = torch.optim.Adam(self.model.parameters(), lr=1e-4) pass def stage2_domain_adapt(self, bus_data_limited): """Stage 2: 领域自适应""" for param in self.model.backbone[:-2].parameters(): param.requires_grad = False self.domain_discriminator = nn.Sequential( nn.Linear(512, 256), nn.ReLU(), nn.Linear(256, 2) ) optimizer = torch.optim.Adam( filter(lambda p: p.requires_grad, self.model.parameters()), lr=1e-5 ) pass def stage3_finetune(self, bus_data): """Stage 3: 在公交车数据上微调""" for param in self.model.parameters(): param.requires_grad = True optimizer = torch.optim.Adam( self.model.parameters(), lr=1e-6 ) pass
|