转自AI Studio,原文链接:基于PaddleX的PP-LCNet模型的玩手机状态识别 - 飞桨AI Studio

基于PaddleX的PP-LCNet模型的玩手机状态识别


项目背景

如今,手机已成为大众离不开的生活工具,而且它的迅速发展使得它的功能不再以通讯为主,手机逐渐发展为可移动的大众传播媒体终端设备,甚至可以比作为第五媒体。当今的大学生群体是智能手机使用者中的一支巨大的的队伍,零零后大学生在进入大学以来,学习生活中过度的依赖手机,甚至上课时忘记携带手机便会手足无措,神情恍惚。本比赛要求通过监控摄像头等拍摄到的画面判断画面中的人物是否正在使用手机

数据集介绍

本比赛采用的数据集中,训练集共2180张使用手机的图片(位于目录train/0_phone/)、1971张没有使用手机的图片(位于目录train/1_no_phone/) 测试集共1849张图片,无标注信息

In [1]


!unzip -oq /home/aistudio/data/data146247/train.zip
!unzip -oq /home/aistudio/data/data146247/test.zip  #解压数据集

总体思路

本方案采用飞桨全新发布的PP-LCNet模型架构,该模型比起其他的轻量级的 SOTA 模型,该骨干网络可以在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的 SOTA 模型。

PP-LCNet网络结构图如下:


In [14]

!pip install paddlex

In [3]

!paddlex --split_dataset --format ImageNet --dataset_dir train/ --val_value 0.2

1. 预处理

* 划分数据集
* 生成标签

0.8的训练集,0.2的测试集.Train数量为: 3323、Eval 数量为: 830

2022-05-17 15:18:49 [INFO]	Dataset split starts...
2022-05-17 15:18:49 [INFO]	Dataset split done.
2022-05-17 15:18:49 [INFO]	Train samples: 3323
2022-05-17 15:18:49 [INFO]	Eval samples: 830
2022-05-17 15:18:49 [INFO]	Test samples: 0
2022-05-17 15:18:49 [INFO]	Split files saved in train/

2. 训练

* PP-LCNet模型组网
* 调整训练参数

In [5]

import paddlex as pdx
from paddlex import transforms as T


# 定义训练和验证时的transforms
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/transforms/transforms.md
train_transforms = T.Compose(
    [T.RandomCrop(crop_size=224), T.RandomHorizontalFlip(), T.Normalize()])

eval_transforms = T.Compose([
    T.ResizeByShort(short_size=256), T.CenterCrop(crop_size=224), T.Normalize()
])

# 定义训练和验证所用的数据集
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/datasets.md
train_dataset = pdx.datasets.ImageNet(
    data_dir='train/',
    file_list='train/train_list.txt',
    label_list='train/labels.txt',
    transforms=train_transforms,
    shuffle=True)

eval_dataset = pdx.datasets.ImageNet(
    data_dir='train/',
    file_list='train/val_list.txt',
    label_list='train/labels.txt',
    transforms=eval_transforms)

# 初始化模型,并进行训练
# 可使用VisualDL查看训练指标,参考https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/visualdl.md
num_classes = len(train_dataset.labels)
model = pdx.cls.PPLCNet(num_classes=num_classes, scale=1)

# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/models/classification.md
# 各参数介绍与调整说明:https://github.com/PaddlePaddle/PaddleX/tree/develop/docs/parameters.md
model.train(
    num_epochs=100,
    pretrain_weights='IMAGENET',
    train_dataset=train_dataset,
    train_batch_size=64,
    eval_dataset=eval_dataset,
    lr_decay_epochs=[4, 6, 8],
    learning_rate=0.1,
    save_dir='output/pplcnet',
    log_interval_steps=10,
    label_smoothing=.1,
    use_vdl=True)

3. 训练结果

* 最终训练结果acc1=0.88,训练的效果非常不错,可以达到应用级的效果
2022-05-17 15:51:34 [INFO]	[TRAIN] Epoch=100/100, Step=1/51, loss=0.257778, acc1=0.953125, acc2=1.000000, lr=0.000025, time_each_step=0.22s, eta=0:0:10
2022-05-17 15:51:36 [INFO]	[TRAIN] Epoch=100/100, Step=11/51, loss=0.303550, acc1=0.921875, acc2=1.000000, lr=0.000016, time_each_step=0.18s, eta=0:0:7
2022-05-17 15:51:38 [INFO]	[TRAIN] Epoch=100/100, Step=21/51, loss=0.300562, acc1=0.937500, acc2=1.000000, lr=0.000009, time_each_step=0.18s, eta=0:0:5
2022-05-17 15:51:40 [INFO]	[TRAIN] Epoch=100/100, Step=31/51, loss=0.326883, acc1=0.906250, acc2=1.000000, lr=0.000004, time_each_step=0.18s, eta=0:0:3
2022-05-17 15:51:42 [INFO]	[TRAIN] Epoch=100/100, Step=41/51, loss=0.302294, acc1=0.953125, acc2=1.000000, lr=0.000001, time_each_step=0.18s, eta=0:0:1
2022-05-17 15:51:43 [INFO]	[TRAIN] Epoch=100/100, Step=51/51, loss=0.351020, acc1=0.875000, acc2=1.000000, lr=0.000000, time_each_step=0.19s, eta=0:0:0
2022-05-17 15:51:44 [INFO]	[TRAIN] Epoch 100 finished, loss=0.30315697, acc1=0.9347426, acc2=1.0 .
2022-05-17 15:51:44 [INFO]	Start to evaluate(total_samples=830, total_steps=13)...
2022-05-17 15:51:48 [INFO]	[EVAL] Finished, Epoch=100, acc1=0.871123, acc2=1.000000 .
2022-05-17 15:51:48 [INFO]	Current evaluated best model on eval_dataset is epoch_98, acc1=0.8806994557380676
2022-05-17 15:51:48 [INFO]	Model saved in output/pplcnet/epoch_100.

4. 训练结果可视化

 

预测

在训练100个epoch后,本项目的最终得分为0.88,达到了比较好的效果

模型训练好之后就可以开始预测,本项目随机抽取test里的数据,预测结果如下,可以看出预测的非常准确

In [16]

import paddlex as pdx
test_jpg = 'test/yHZmx4XqRhAnaMdKuJIlbFCgVGUBP8Es.jpg'
model = pdx.load_model('output/pplcnet/best_model')
result = model.predict(test_jpg)
print("Predict Result: ", result)

2022-05-17 16:21:25 [INFO]	Model[PPLCNet] loaded.
Predict Result:  [{'category_id': 0, 'category': '0_phone', 'score': 0.9331609}]

后续改进方向

  1. 如果希望效果更好的话,可以尝试采用更深层的神经网络,Transformer,darknet等
  2. 可以对训练集进行数据增强从而增大训练数据量以提升模型泛化能力
  3. 可以在基线模型的基础上通过调参及模型优化进一步提升效果
Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐