01 / 05 · 2019.07 — 2020.07
北京云上作科技有限公司
在 AI + 教育方向做算法落地与全栈开发:用 Mask R-CNN + ResNet 做课堂行为实时分析与预警,搭建内部数据标注与训练平台,并负责线上巡课统计后台、人脸核身与截图识别服务。
- 职位
- 软件开发工程师
- 行业
- AI + 教育
- 地点
- 北京
- 团队
- 5 人
- 在职
- 1 年 1 个月
关键成果
6 类
课堂行为分类(抬头、低头、站立、趴桌、扭头、举手);置信度低于 0.95 记为“不确定”,不强行判定
21 个路由
线上巡课统计引擎后端(约 1650 行 Tornado),基于 Elasticsearch 聚合查询
1 万+ 张
微信截图识别项目中自己标注的截图数量(另有 1 千+ 张图标)
在这里做的项目
PROJECTS · 42019 – 2020 · 全栈工程师(算法 · 后端 · 内部训练平台) · 团队 5人
AI 课堂行为分析系统
用教室摄像头识别学生的上课行为(抬头、低头、举手、趴桌、扭头等),通过人脸识别对应到具体学生,再提供实时预警和多层级的课堂报表。我开发了两个子系统:面向学校的实时分析与预警平台,以及内部使用的数据标注与模型训练平台。
- 两阶段识别:Mask R-CNN(R-101-FPN)检测学生 → ResNet18 做行为分类(6 类,置信度低于 0.95 记为“不确定”);比让检测模型直接分类更准,且行为类别调整时只需重训小的分类器
- 实时分析:OpenCV 读 RTSP 流,视频时间戳落后于实际时间就丢帧以保证实时;每个班级一个独立 GPU 进程,启动前用 nvidia-smi 检查剩余显存
- 跨帧跟踪与身份识别:自研 5 秒窗口的双向重叠率跟踪;face_recognition(dlib)提取 128 维特征与班级人脸库比对,同一轨迹内取出现最多的学生 ID 投票,低头、侧脸时身份仍能认对
- 趴桌 / 扭头实时告警:裁出学生头像(base64)写入告警;最新结果与逐帧历史分开存入 MongoDB
- Tornado 后端:账户与三种角色、预警与报表(学生・课堂・年级・学校四个层级)、微信小程序 API 与第三方平台开放 API;对接产品经理的原型并设计接口协议字段
- 用 scikit-learn 分析行为数据,输出每位学生的周报、月报与学期报告,推送到家长的微信小程序
- 内部数据标注与训练平台:视频剪辑 → Mask R-CNN 预标注(生成 labelme JSON)→ 人工修正 → 裁图 → 建数据集 → ResNet18 训练(断点续训、loss / 准确率曲线)→ 验证;整节课离线分析模块即实时算法的原型
- 交付:核心跟踪算法用 Cython 编译为 .so,配合 supervisor 守护与加密狗授权,在多个客户处私有化部署
- Python
- Tornado
- PyTorch
- maskrcnn-benchmark
- face_recognition (dlib)
- OpenCV
- FFmpeg
- MongoDB
- scikit-learn
- Cython
- ECharts
- jQuery
运行演示
实时分析平台:班级监控总览 校长视角大屏 多班级实时画面
系统架构
2020 · 统计引擎后端、管理后台前端、参与算法分析
AI 诊断性巡课系统
在线英语课场景(疫情的原因改为线上课程)下实时采集师生音视频,经 ASR / CV / VAD 结构化后:对红线行为(说中文、老师说话过久、学生参与过少、离开镜头、黑屏或掉线)做准实时告警;并输出教质指标报表,按总部 / 分公司 / 校区、课程、教师、学生多维度对比排名。
- 统计引擎后端(Tornado,约 1650 行、21 个路由):课堂 / 教师 / 学生的列表、详情与历史趋势,教学态度时序曲线,样板课堂 TopN
- Elasticsearch 查询:bool + terms + range 组合,terms 聚合下嵌套 avg 子聚合(按课堂算教师平均 happy 概率、词数、语速),大结果集用 scan / scroll 遍历;CV 与 ASR 多源结果在应用层合并后排序
- 管理后台前端(vue-element-admin 4.4):基于角色的动态路由权限、数据大屏、课堂 / 教师 / 学生列表与详情、排名、趋势、筛选;ECharts 可视化,Docker 化与多环境配置
- 参与算法分析:综合学员说话比例、连贯表达与情绪正向程度,找出约 30 秒的“高光时刻”片段,并标记噪音、课件语音干扰、家长陪同等异常,用于给家长的学员表现报告
- Python
- Tornado
- Elasticsearch
- Redis
- Vue 2
- Element UI
- ECharts
- MQTT
- Docker
- Alibaba Cloud
系统架构
2020 · 算法与服务开发
FaceID 人脸核身与人脸检索
为在线教育客户做的人脸核身:从上课视频中确认出镜学员是否为本人,并支持全库 / 增量 / 指定人的人脸检索,用来发现“一人多号”或“多人共号”。
- 推理流程:随机抽帧 → YuFaceDetectNet 检测 + 5 点关键点 → 仿射对齐 → 遮挡 / 姿态模糊 / 年龄三个模型过滤 → ResNet18 提取特征并做余弦相似度比对;取年龄最小的人脸(< 17 岁)锁定学员本人、排除家长
- 多框架混合推理:检测与特征提取用 PyTorch,遮挡、姿态、年龄用 MXNet Gluon,统一跑在 CPU 上;从 v1.0 到 v3.4 持续迭代(dlib 68 点 + Laplacian 模糊检测 → 更换模型与对齐 → 加入三个质量模型 → 重写全库检索与视频校验)
- 用 Redis 存放特征,支持全局、增量、指定人三种检索;全库两两比对按代码注释估算约 4000 万次
- 商业授权控制:调用次数、到期时间、每日额度经 AES 加密存入 Redis,SETNX 做分布式锁,校验设备 SN;核心模块用 Cython 编译为 .so 交付
- 配置按“命令行参数 > 环境变量 > JSON / YAML”的优先级读取;Docker 部署,构建时从 OSS 拉取模型权重
- Python
- PyTorch
- MXNet
- dlib
- ResNet18
- Redis
- Cython
- Docker
- OSS
系统架构
2020 · 训练、推理、服务与部署
微信截图智能识别(朋友圈广告投放核查)
对上传的微信截图做自动识别,用于核查朋友圈广告投放:判定截图类型(会话 / 朋友圈列表 / 朋友圈详情),提取发布时间、广告文案、海报 ID、二维码链接以及点赞与评论数。
- YOLOv5s 主检测(7 类界面元素)并用规则判定截图类型;自行标注 1 万多张截图与 1 千多张点赞 / 评论图标,k-means 聚类先验框
- 朋友圈详情:PaddleOCR(PP-OCR,DB 检测 + CRNN 识别)按版面位置取发布时间、广告文案与海报 ID;二维码解码;右下角裁剪后用 YOLOv5 检测点赞 / 评论图标,再用 3 层 CNN 识别数字
- Tornado + PyTorch + PaddlePaddle 服务:token 与 MD5 完整性校验,nanoid 请求追踪,原图存 OSS,全量结果与耗时写入 Elasticsearch,用于排查线上异常返回
- 升级 PP-OCR 模型版本,提高海报 ID 与发布时间的识别率
- Python
- PyTorch
- YOLOv5
- PaddleOCR
- PaddlePaddle
- Tornado
- Elasticsearch
- OSS
- Docker
系统架构
系统数据流
抽象示意 · 不含内部细节教室摄像头
RTSP 实时视频流
OpenCV 读流
时间戳落后则丢帧
Mask R-CNN 检测
定位学生 · 置信度 ≥ 0.7
▲ 我负责的部分
ResNet18 行为分类
6 类 · 趴桌 / 扭头即告警
▲ 我负责的部分
人脸识别 + 跟踪
128 维特征 · 轨迹内投票
▲ 我负责的部分
MongoDB → Tornado
实时告警 · 报表 · 小程序
在这里学到了什么
毕业后入职 AI + 教育行业,走出校园,在工作中应用并学习了更多的语言。在业务逻辑中基于 PyTorch 实现物体检测与分类(Mask R-CNN、ResNet);Web 服务采用 Tornado,公司前端架构也由 HTML / JS / CSS 转向 Vue。
做课堂行为分析时,学到的是把问题拆开:先检测人、再分类行为,识别不确定时单独归类而不是强行判定;用跨帧跟踪和轨迹内投票补足单帧识别的不足,用丢帧策略保证实时。也第一次系统地做了交付工程:Cython 保护算法源码、supervisor 守护进程、多客户私有化部署,以及线上巡课里 Elasticsearch 聚合查询的写法。
TECH STACK
- Python
- PyTorch
- Mask R-CNN
- ResNet
- YOLOv5
- MXNet
- PaddleOCR
- dlib
- Tornado
- Elasticsearch
- MongoDB
- Redis
- Cython
- Vue 2
- Docker