演示效果及获取项目源码点击文末名片
本项目旨在通过深度学习技术,结合卷积神经网络(CNN)模型、ResNet模型和MobileNet模型,实现对驾驶员分心行为的自动检测。我们通过训练这些模型来识别不同的驾驶员分心行为,包括如发短信、通话、喝水等行为。使用的数据集包含驾驶员行为的图片,并且针对每个行为标注了相应的标签(例如"正常驾驶"、"右手发短信"等)。
MobileNetV2 是 Google 于 2018 年提出的一种轻量级卷积神经网络架构,专为在移动设备和嵌入式系统上高效部署而设计。其相比传统的深度卷积神经网络(如 ResNet、VGG 等),在保证较高分类准确率的同时,显著减少了模型的参数数量和计算量。
在本课程中,我们选用 MobileNetV2 作为图像分类的基础模型,兼顾了性能、精度与速度,非常适合部署在资源受限的环境中(如智能汽车终端、边缘设备等)。
二、关键技术点
class DriverDistractionDataset(Dataset):def init(self, data_csv, image_dir, transform=None):
self.data_csv = pd.read_csv(data_csv)
self.image_dir = image_dir
self.transform = transform
self.valid_data = self._prepare_data()
def _prepare_data(self):
valid_data = []for index, row in self.data_csv.iterrows():
img_name = row[‘img’]
classname = row[‘classname’]
img_path = f’./train/{classname}/{img_name}'检查图片是否存在if os.path.exists(img_path):
valid_data.append((classname, img_name))return valid_data
2. 数据增强与预处理
为了提高模型的鲁棒性,我们对输入数据进行了适当的预处理。使用torchvision.transforms模块进行图像尺寸调整、标准化以及转换为Tensor格式。标准化是根据ImageNet的均值和标准差进行的。
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
3. 模型选择与加载
本项目使用了三个不同的模型进行对比:
加载MobileNetV2模型
model = models.mobilenet_v2(pretrained=False)
model.load_state_dict(torch.load(‘mobilenet_v2-b0353104.pth’))
替换全连接层的输出类别数
model.classifier[1] = nn.Linear(model.classifier[1].in_features, 10)
4. 模型训练
训练过程使用了标准的交叉熵损失函数(CrossEntropyLoss)和Adam优化器。每个epoch会输出当前的损失值,并绘制训练过程中的损失曲线。
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
train_losses = []
num_epochs = 5for epoch in range(num_epochs):
model.train()
running_loss = 0.0for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
epoch_loss = running_loss / len(train_loader)
train_losses.append(epoch_loss)print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {epoch_loss}")
5. 模型评估与结果可视化
评估模型时,主要计算模型的准确率,并通过混淆矩阵来分析模型的分类效果。混淆矩阵的可视化使用了seaborn模块,提供了更加直观的分类结果展示。
def evaluate_model(model, data_loader):
model.eval()
all_preds = []
all_labels = []with torch.no_grad():for images, labels in data_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, preds = torch.max(outputs, 1)
all_preds.extend(preds.cpu().numpy())
all_labels.extend(labels.cpu().numpy())
accuracy = accuracy_score(all_labels, all_preds)print(f’准确率为: {accuracy * 100:.2f}%‘)
cm = confusion_matrix(all_labels, all_preds)
plt.figure(figsize=(10, 7))
sns.heatmap(cm, annot=True, fmt=‘d’, cmap=‘Blues’, xticklabels=[f’c{i}’ for i in range(10)], yticklabels=[f’c{i}’ for i in range(10)])
plt.xlabel(‘Predicted’)
plt.ylabel(‘True’)
plt.title(‘Confusion Matrix’)
plt.show()
6. 单张图片预测
为了测试模型的预测能力,我们提供了一个predict_image函数,用于输入一张图片并预测其分心行为类别。该函数将输入的图片转换为Tensor格式,并将其传递给训练好的模型进行预测。
def predict_image(image_path):
model.eval()
image = Image.open(image_path).convert(‘RGB’)
image = transform(image).unsqueeze(0).to(device)
with torch.no_grad():
outputs = model(image)
_, predicted_class = torch.max(outputs, 1)
res = ‘c’+str(predicted_class.item())
result = dict_list_zh[res]print(f’预测结果分类结果为: {res}:{result}')