基于cnn和resnet和mobilenet对比实现驾驶员分心检测

演示效果及获取项目源码点击文末名片

本项目旨在通过深度学习技术,结合卷积神经网络(CNN)模型、ResNet模型和MobileNet模型,实现对驾驶员分心行为的自动检测。我们通过训练这些模型来识别不同的驾驶员分心行为,包括如发短信、通话、喝水等行为。使用的数据集包含驾驶员行为的图片,并且针对每个行为标注了相应的标签(例如"正常驾驶"、"右手发短信"等)。
MobileNetV2 是 Google 于 2018 年提出的一种轻量级卷积神经网络架构,专为在移动设备和嵌入式系统上高效部署而设计。其相比传统的深度卷积神经网络(如 ResNet、VGG 等),在保证较高分类准确率的同时,显著减少了模型的参数数量和计算量。
在本课程中,我们选用 MobileNetV2 作为图像分类的基础模型,兼顾了性能、精度与速度,非常适合部署在资源受限的环境中(如智能汽车终端、边缘设备等)。
二、关键技术点

  1. 深度可分离卷积(Depthwise Separable Convolution)
    MobileNetV2 的核心构建模块基于深度可分离卷积,它将标准卷积操作拆分为:
  • Depthwise 卷积:对每个通道独立进行空间卷积;
  • Pointwise 卷积:使用 1×1 卷积对通道进行线性组合。
    这种分离大大减少了运算量,提升了运行效率。
  1. 线性瓶颈结构(Linear Bottleneck)
    传统的网络在通过 ReLU 激活函数后会引入信息丢失,而 MobileNetV2 引入了线性瓶颈层,在某些层不使用 ReLU,从而避免特征表达的退化。
  2. 倒残差结构(Inverted Residuals)
    与 ResNet 的“先压缩后扩展”不同,MobileNetV2 采用“先扩展后压缩”的倒残差结构,有利于保持特征信息,提升建模能力。
    模型对比分析:MobileNetV2 vs ResNet vs EfficientNet
    暂时无法在飞书文档外展示此内容
    项目结构
    该项目包含多个部分,包括数据预处理、模型训练、评估以及单张图片预测。我们使用了三个不同的深度学习模型(CNN、ResNet、MobileNet)进行比较,以下是针对项目中每个部分的详细说明。
    代码结构说明
  3. 数据集准备
    首先,我们通过自定义的DriverDistractionDataset类加载并处理数据集。该类通过读取CSV文件获取每个图像的路径,并检查图像是否存在。如果图像存在,则保存其路径和标签,确保数据集的完整性。
    关于数据:
    dict_list_zh = {
    ‘c0’: ‘正常驾驶’,
    “c1”: ‘右手发短信’,
    “c2”: ‘右手通话’,
    “c3”: ‘左手发短信’,
    “c4”: ‘左手通话’,
    “c5”: ‘操作收音机’,
    “c6”: ‘喝水’,
    “c7”: ‘回头’,
    “c8”: ‘整理头发’,
    “c9”: ‘与乘客交谈’
    }
    [图片]
    [图片]
    [图片]

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. 模型选择与加载
本项目使用了三个不同的模型进行对比:

  • CNN:标准的卷积神经网络。
  • ResNet:采用残差连接的深度网络。
  • MobileNet:高效的轻量化网络。
    每次运行代码时,只需选择一个模型,并进行训练。以下是使用MobileNetV2模型的代码片段,其他模型更换时,只需修改模型名称即可。

加载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}')

你可能感兴趣的:(cnn,人工智能,神经网络)