1. 项目概述
在智慧教室方案中,补课场景是线下教学业务的痛点和刚需。线下教学业务中,通过回放教学视频,可以解决学生未出勤、知识点复习等问题,因此,通过AI盒子和摄像头,实现线下课堂数据的在线化成为必不可少的任务。
然而在实际录制线下视频时,存在及其录制的视频镜头太大无法看清板书和课件等问题,针对该问题我们提出了板书检测方案,通过板书检测可以智能识别老师板书姿态,实现课堂重点的智能划分,通过利用AI算法捕捉老师板书姿态,智能切分课堂精讲和高清课件,学生可以有重点的复习巩固。
2. 技术难点
模型调度频繁,模型需要保证高效,现有关键点检测模型较大
教师写板书行为边界不好判断
教室场景复杂,需要大量数据训练
3. 解决方案
考虑到模型的调度问题,我们选择在移动端部署模型,因此需要一个轻量级的网络结构
为了提高模型对教师写板书行为的判断精度,我们在训练检测模型时使用了蒸馏的策略进行模型训练,同时骨骼点检测模型后面增加了一个骨骼点行为识别模型进行更为精准的判断
同时,通过推进智慧教室规范化部署,标准化摄像头拍摄位置,可以减少过大角度变换造成的场景过于复杂的问题
4. 数据准备
4.1 数据集介绍
%cd /home/aistudio/WritingArmDetection/data_sample
!tar -xvf /home/aistudio/data/data130683/data.tar
5. 模型训练
%cd /home/aistudio/WritingArmDetection训练模型基于ResNet50_v1的模型,命令如下:!python train_simple_pose.py --backbone resnet50_v1 --save_prefix model/resnet50_v1/ --pretrain pretrain/resnet50_v1_paddle_pretrain.pdparams 训练命令支持的一些参数解释如下:
参数 | 类型 | 缺省值 | 描述 |
---|---|---|---|
batch_size | int | 64 | 批量大小 |
lr | float | 0.001 | 学习率 |
epoch | int | 200 | 训练回合数 |
workers | int | 16 | 用于加载数据的子进程个数 |
workers | int | 16 | 用于加载数据的子进程个数 |
save_step | int | 5 | 每训练多少个回合后保存一次模型 |
save_prefix | str | model/ | 模型保存路径 |
only_eval | bool | False | 是否只进行评估 |
weights | str | “” | 加载已有模型权重继续训练 |
backbone | str | mobilenet_v2 | 模型骨干网络,可以选择 resnet50_v1 或 mobilenetv2_05 |
start_epoch | int | 0 | 开始回合数 |
pretrain | str | ‘’ | 预训练模型路径 |
训练模型基于MobileNet_v2的模型,命令如下:!python train_simple_pose.py --backbone mobilenetv2_05 --save_prefix model/mobilenet_v2/ --pretrain pretrain/mobilenet_v2_paddle_pretrain.pdparams
6. 模型评估
按照我们提供的参数训练需要跑200个epoch,时间较长,如果想直接验证评估和推理等结果,也可直接使用我们提供的 best_model_resnet.pdparams
来进行模型评估。
基于ResNet的模型评估命令如下:!python train_simple_pose.py --backbone resnet50_v1
--weights model/resnet_best_model.pdparams --only_eval
True基于MobileNet的模型评估命令如下:!python train_simple_pose.py --backbone
mobilenet_v2 --weights model/mobilenet_best_model.pdparams --only_eval
True注意
这里可以解释下比较重要的评估指标的含义
7. 模型推理
我们可以选取一张图片或一组图对模型进行测试,获得模型对写板书动作的关键点检测结果。这里我们以ResNet50的推理命令为例,如需推理MobileNet模型,可以更换 --backbone 为 mobilenet_v2。
对单张图片推理命令如下:
!python writing_arm.py --params model/resnet_best_model.pdparams
--backbone resnet50_v1 --image_path ./data_sample/test_image.jpg
--save_path output_result/ --single_image True对于一个文件夹的图片进行推理:!python
writing_arm.py --params model/resnet_best_model.pdparams --backbone
resnet50_v1 --folder_path ./data_sample/val/ --save_path
output_result/对于一个视频进行推理:!python forearm_demo.py --params
model/resnet_best_model.pdparams --backbone resnet50_v1 --input dataset/
--output output_video/
8. 模型部署
在实际应用中,考虑到模型会部署到移动端或服务器上使用,而在部署前,需要将保存的动态图模型转为静态图模型。导出静态图模型命令如下:!python export_model.py --params model/resnet_best_model.pdparams --backbone resnet50_v1 --save_path output_infer/ --model_name output_infer_resnetPaddle Inference是飞桨原生推理库,功能特性丰富、性能优异,针对不同平台不同应用场景进行了深度的适配优化,做到高吞吐、低时延,保证了飞桨模型在服务器端即训即用,快速部署。基于Paddle Inference完成部署的方案如下:!python infer_image.py --pdmodel_path output_infer/output_infer_resnet.pdmodel --pdiparams_path output_infer/output_infer_resnet.pdiparams --single_image True --image_path ./data_sample/test_image.jpg --save_path infer_result/!python infer_image.py --pdmodel_path output_infer/output_infer_resnet.pdmodel --pdiparams_path output_infer/output_infer_resnet.pdiparams --folder_path ./data_sample/val/ --save_path infer_result/!python infer_video.py --input dataset/ --output output_infer_video/ --pdmodel_path output_infer/output_infer_resnet.pdmodel --pdiparams_path output_infer/output_infer_resnet.pdiparamsPaddle Serving是飞桨服务化部署框架,能够帮助开发者轻松实现从移动端、服务器端调用深度学习模型的远程预测服务。 Paddle Serving围绕常见的工业级深度学习模型部署场景进行设计,具备完整的在线服务能力,支持的功能包括多模型管理、模型热加载、基于Baidu-RPC的高并发低延迟响应能力、在线模型A/B实验等,并提供简单易用的Client API。Paddle Serving可以与飞桨训练框架联合使用,从而训练与远程部署之间可以无缝过度,让用户轻松实现预测服务部署,大大提升了用户深度学习模型的落地效率。基于Paddle Serving的部署需要在本地操作,具体流程和命令如下:
1. 安装环境
docker 环境安装:
# 拉取并进入 Paddle Serving 的GPU Dockerdocker pull paddlepaddle/serving:0.7.0-cuda10.2-cudnn7-devel nvidia-docker run -p 9292:9292 --name test -dit paddlepaddle/serving:0.7.0-cuda10.2-cudnn7-devel bash nvidia-docker exec -it test bash
安装Paddle Serving四个安装包:
pip install paddle-serving-client==0.7.0 pip install paddle-serving-server-gpu==0.7.0.post102 # GPU with CUDA10.2 + TensorRT6pip install paddle-serving-app==0.7.0 pip install paddlepaddle-gpu==2.2.2
2. 准备服务化部署模型
将inference模型转换为服务化部署模型:
python -m paddle_serving_client.convert \ --dirname output_infer/ \ --model_filename output_infer_resnet.pdmodel \ --params_filename output_infer_resnet.pdiparams \ --serving_server serving_server \ --serving_client serving_client
3. 启动模型预测服务
在一个终端运行以下命令:
cd WritingArmDetection/ python -m paddle_serving_server.serve --model serving_server --port 9292 --gpu_id 0
4. 客户端访问服务
# 单张图片python client_image.py --single_image True --image_path data_sample/test_image.jpg --save_path client_output/ --backbone resnet50_v1# 图片文件夹python client_image.py --folder_path data_sample/val/ --save_path client_output/ --backbone resnet50_v1# 视频python client_video.py --input dataset/ --output client_video/