简介本资源是一份面向教育技术研究者、AI算法工程师及高校教学管理人员的深度学习实践方案聚焦课堂场景下学生异常行为如睡觉、玩手机的自动检测与分析问题。文档基于VGG迁移学习框架构建CNN模型详述了从燕山大学真实课堂视频采集105名学生、3000标注图像、数据增强策略、网络结构微调到多目标区域分割与行为统计报告生成的完整技术路径具备较强工程落地参考价值。资源为单个PDF文件大小1.48MB内容涵盖系统架构、实验设计、准确率对比平均85.28%睡觉识别达95.15%、代码工具说明MatConvNet及典型识别结果可视化结构清晰、图文并茂。目前已有1756人学习下载适合希望复现课堂行为分析模型、理解视频分析中特征提取与模式分类实现细节的中级以上深度学习学习者。1. 为什么课堂里“低头玩手机”“突然趴桌”“频繁转头”不能靠规则引擎硬写——一个真实落地的深度学习异常行为检测系统长什么样去年帮一所高职院校做教学督导数字化升级时教务处提的需求很朴素“能不能自动标出学生上课睡觉、玩手机、交头接耳的视频片段”他们试过用 OpenCV 写阈值逻辑比如人脸朝下持续5秒算趴桌手部区域快速移动屏幕反光区域突增算玩手机。结果上线一周误报率超68%——阳光斜射进教室触发“屏幕反光”学生整理头发被识别为“玩手机”后排两人讨论问题被标成“交头接耳”。规则越补越多维护成本飙升最后连值班老师都懒得看告警。这恰恰暴露了传统方法的死穴课堂行为是上下文强耦合、姿态多变、光照干扰大、个体差异显著的复合事件。低头≠睡觉可能记笔记转头≠交头接耳可能看板书单帧图像无法建模行为时序性。而“基于深度学习的学生课堂异常行为检测与分析系统”这个标题本质是用端到端可学习的方式把“行为语义”从像素流中解耦出来先定位人检测再理解动作时序建模最后关联教学场景分析。它不追求100%准确但要求在真实教室录像非实验室打光、含走动教师、多角度摄像头、常见遮挡下对“趴桌/玩手机/左顾右盼/站立走动”四类高频异常行为达到F1≥0.75且能输出带时间戳的结构化行为日志供督导回溯。适合一线教育信息化工程师、高校计算机毕设学生、智慧校园方案集成商——你不需要从零造轮子但得清楚每一步为什么这么选、参数怎么调、哪里容易翻车。2. 从视频流到行为标签检测-跟踪-识别三阶段 pipeline 如何搭建这套系统不是端到端黑盒而是分层解耦的工业级 pipeline检测框住人 → 跟踪绑定ID → 识别行为语义。分层的好处是模块可替换、错误可定位、资源可分级比如边缘设备只跑检测云端跑识别。下面按实际部署顺序展开所有命令和代码均在 Ubuntu 22.04 PyTorch 2.0 CUDA 11.8 环境验证通过。2.1 用 YOLOv8n 检测学生轻量、快、泛化好别碰 YOLOv5sYOLO 系列在课堂场景的检测任务中v8nnano 版本是经过实测的甜点选择。对比测试过 v5s、v7-tiny、v8sv5s 在低光照下漏检严重尤其穿深色衣服的学生v7-tiny 对小目标如前排学生手部召回率不足v8s 推理速度掉到 12 FPS教室通常需 ≥25 FPS 实时处理。而 v8n 在 RTX 3060 上达 38 FPSmAP0.5 达 0.81自建教室数据集标注 2,147 张图含遮挡/侧脸/背影。# 安装 ultralytics官方维护非 fork pip install ultralytics8.2.59 # 下载预训练权重官方提供非第三方魔改 wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt # 训练命令关键参数说明见下文 yolo train \ datastudent_classroom.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch32 \ nameyolov8n_classroom \ device0 \ workers4 \ patience10 \ lr00.01 \ lrf0.01 \ cos_lrTrue \ augmentTrue \ hsv_h0.015 \ hsv_s0.7 \ hsv_v0.4 \ degrees2.5 \ translate0.1 \ scale0.5 \ shear0.0 \ perspective0.0 \ flipud0.0 \ fliplr0.5 \ mosaic1.0 \ mixup0.1 \ copy_paste0.1参数说明imgsz640教室摄像头多为 1080p640 是速度与精度平衡点若用 4K 摄像头可升至 736需显存 ≥12GBbatch32RTX 3060 显存 12GB 刚好吃满若用 309024GB可提至 64hsv_s0.7hsv_v0.4大幅增强饱和度与明度扰动对抗教室常见白墙反光、投影仪强光干扰fliplr0.5必须开启教室左右对称布局水平翻转能提升模型对“侧身坐姿”的鲁棒性mosaic1.0mixup0.1Mosaic 全开模拟多学生拥挤场景Mixup 降为 0.1避免不同行为样本混合导致标签污染。训练完成后runs/detect/yolov8n_classroom/weights/best.pt即为可用检测模型。注意不要用 detect.py 直接推理——它默认输出 bbox 坐标而后续跟踪需要高置信度、低冗余的检测结果。我们改用自定义 infer 脚本# infer_detector.py import cv2 import numpy as np from ultralytics import YOLO model YOLO(runs/detect/yolov8n_classroom/weights/best.pt) cap cv2.VideoCapture(classroom_20231015.mp4) while cap.isOpened(): ret, frame cap.read() if not ret: break # 关键设置 conf0.5, iou0.45过滤低质检测框 results model(frame, conf0.5, iou0.45, verboseFalse) boxes results[0].boxes.xyxy.cpu().numpy() # [x1,y1,x2,y2] confs results[0].boxes.conf.cpu().numpy() # 可视化仅调试用 for i, box in enumerate(boxes): x1, y1, x2, y2 map(int, box) cv2.rectangle(frame, (x1, y1), (x2, y2), (0,255,0), 2) cv2.putText(frame, f{confs[i]:.2f}, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) cv2.imshow(Detection, frame) if cv2.waitKey(1) ord(q): break cap.release() cv2.destroyAllWindows()这段代码输出的是干净的检测框序列为下一步跟踪铺路。记住检测只是起点它的质量直接决定后续所有环节的上限。2.2 用 ByteTrack 跟踪学生 ID解决跨帧 ID 一致性的核心检测框每帧独立但督导需要知道“3号学生在10:02:15-10:02:22持续趴桌”。这就需要多目标跟踪MOT。我们放弃 DeepSORT依赖 ReID在教室小目标上特征提取不准、FairMOT需额外训练 ReID 分支工程复杂选用ByteTrack——它用“高置信度检测框”和“低置信度检测框”的联合匹配策略在遮挡恢复、ID 切换上表现极稳。实测在 30 人教室视频中ID 切换次数比 DeepSORT 降低 63%。# 安装 bytetrack官方 GitHub 仓库 git clone https://github.com/ifzhang/ByteTrack.git cd ByteTrack pip install -r requirements.txt # 编译 cython必须否则速度慢 5 倍 cd yolox python setup.py build_ext --inplace跟踪脚本需与检测结果对接。关键点ByteTrack 输入必须是 [x1,y1,x2,y2,conf,cls] 格式且 conf 必须 0.1哪怕检测器输出 conf0.05 的框也要传进去这是它利用低置信框恢复 ID 的秘密# track_student.py import cv2 import numpy as np from byte_tracker import BYTETracker # 初始化 tracker参数针对教室优化 tracker BYTETracker( track_thresh0.5, # 高置信框匹配阈值 track_buffer30, # 轨迹缓存帧数教室视频 30 帧≈1.2 秒覆盖短暂遮挡 match_thresh0.8, # 匈牙利匹配 IOU 阈值提高匹配严格性减少 ID 混淆 frame_rate25 # 视频帧率影响轨迹平滑 ) cap cv2.VideoCapture(classroom_20231015.mp4) frame_id 0 while cap.isOpened(): ret, frame cap.read() if not ret: break # 复用前面的检测逻辑但保留低置信框conf0.1 results model(frame, conf0.1, iou0.45, verboseFalse) dets results[0].boxes.data.cpu().numpy() # [x1,y1,x2,y2,conf,cls] # ByteTrack 要求输入为 [x1,y1,x2,y2,conf]且 cls 必须为 0学生类别 # 过滤非学生框如有教师检测cls1则跳过 student_dets dets[dets[:,5]0][:,:5] # 只取学生且只留前5列 online_targets tracker.update(student_dets, [frame.shape[0], frame.shape[1]], [frame.shape[0], frame.shape[1]]) # online_targets 是 list[STrack]每个含 tlbr坐标、track_id、score for t in online_targets: tlbr t.tlbr.astype(int) tid t.track_id cv2.rectangle(frame, (tlbr[0], tlbr[1]), (tlbr[2], tlbr[3]), (255,0,0), 2) cv2.putText(frame, fID:{tid}, (tlbr[0], tlbr[1]-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,0,0), 2) cv2.imshow(Tracking, frame) frame_id 1 if cv2.waitKey(1) ord(q): break cap.release() cv2.destroyAllWindows()为什么 track_buffer30教室常见遮挡教师走动挡住学生、学生起立遮挡后排、窗帘晃动。实测 25 帧1 秒不够恢复30 帧1.2 秒可覆盖 92% 遮挡场景设为 60 帧会导致 ID 滞后新学生进入画面时旧 ID 未及时释放。跟踪完成后你得到的是每个学生 ID 的完整轨迹(frame_id, x1,y1,x2,y2)序列。下一步就是从这些轨迹中“读出行为”。2.3 用 ST-GCN 识别行为时空图卷积为何比 3D-CNN 更适配课堂行为识别有两大流派3D-CNN如 I3D、SlowFast和图卷积ST-GCN。我们选ST-GCNSpatial-Temporal Graph Convolutional Network原因直击痛点3D-CNN 输入是整帧视频块如 16×224×224计算量大且把背景、教师、黑板全卷进去了噪声极大ST-GCN 只输入人体关节点坐标序列如 300 帧 × 18 关节点 × 2 维天然聚焦人体运动抗背景干扰教室场景中学生常坐姿固定关键动作在上半身头、手、肩ST-GCN 的图结构骨骼连接能精准建模这种局部运动。我们用开源实现 st-gcn-pytorch 但必须重训——原版在 NTURGBD实验室采集上训练对教室俯拍、侧拍、遮挡完全不适应。数据准备是关键用 MediaPipe 提取 300 帧视频中每帧的 18 关节点简化版去脚部保头/手/肩/髋格式为(C, T, V) (2, 300, 18)C坐标维度T帧数V关节点数。标注规则趴桌头部 y 坐标持续低于肩部 y 坐标 1.5 倍标准差且持续 ≥8 帧玩手机左手/右手关节点在躯干前方快速小幅度移动速度 0.8 px/frame且手部区域存在矩形高亮用 HSV 阈值粗筛左顾右盼头部旋转角用鼻尖-左耳-右耳三点计算绝对值 25°且左右切换频率 ≥0.3 Hz站立走动髋部 y 坐标突增站起随后整体位移 15px走动。训练命令使用 2×RTX 3090# 数据目录结构 # data/ # ├── nturgbd_skeletons/ # 原始 NTU 数据用于迁移学习 # └── classroom_stgcn/ # 自建教室数据train/val/test # ├── train_data.npy # (N, 2, 300, 18) # ├── train_label.pkl # list[N]每个元素为 int 类别 # └── ... # 启动训练关键参数 python main.py \ --config config/st_gcn/classroom.yaml \ --phase train \ --save_dir ./work_dir/classroom_stgcn \ --log_dir ./log/classroom_stgcn \ --num_epoch 80 \ --base_lr 0.1 \ --lr_decay_strategy step \ --step 40 60 \ --weight_decay 0.0001 \ --optimizer SGD \ --batch_size 32 \ --test_batch_size 64 \ --num_worker 8 \ --model_args dict(graphgraph.ntu_rgb_d.Graph, ...)classroom.yaml中最关键的配置model_args: graph: graph.ntu_rgb_d.Graph # 复用 NTU 图结构已验证有效 in_channels: 2 # 只用 x,y 坐标不用置信度 num_class: 4 # 四类异常行为 dropout: 0.5 # 防止过拟合教室数据量小 edge_importance_weighting: True # 动态调整骨骼边权重适应坐姿变化训练收敛后work_dir/classroom_stgcn/epoch80_model.pt即为行为识别模型。它接收(2,300,18)关节点张量输出[0.1, 0.7, 0.05, 0.15]四维概率对应“趴桌/玩手机/左顾右盼/站立走动”。至此pipeline 闭环检测 → 跟踪 → 关节点提取 → 行为分类。下一章我们直面最痛的坑。3. 检测框漂移、ID 切换、行为误判课堂场景三大避坑指南这套系统在真实教室部署时80% 的问题集中在三个环节。以下是我踩过的血泪坑按“现象→原因→解决”列出每一条都来自至少 3 所学校的现场调试记录。3.1 现象检测框在学生肩膀处高频抖动导致跟踪 ID 频繁切换原因YOLOv8 默认的 anchor-free 设计对小目标如远距离学生定位敏感加上教室常见风扇震动、摄像头散热微抖造成 bbox 坐标每帧微偏±2~3pxByteTrack 认为这是新目标触发 ID 新建。解决在检测后加卡尔曼滤波平滑非对跟踪器加而是对检测框本身# kalman_smooth.py from filterpy.kalman import KalmanFilter import numpy as np class BBoxKalman: def __init__(self): self.kf KalmanFilter(dim_x4, dim_z2) # 状态[x,y,vx,vy]观测[x,y] self.kf.x np.array([0, 0, 0, 0]) # 初始状态 self.kf.F np.array([[1,0,1,0], [0,1,0,1], [0,0,1,0], [0,0,0,1]]) # 状态转移 self.kf.H np.array([[1,0,0,0], [0,1,0,0]]) # 观测矩阵 self.kf.P * 1000 # 初始协方差 self.kf.R np.array([[5,0], [0,5]]) # 观测噪声教室抖动经验值 self.kf.Q np.array([[1,0,0,0], [0,1,0,0], [0,0,1,0], [0,0,0,1]]) * 0.1 # 过程噪声 def update(self, x1, y1, x2, y2): # 将 bbox 中心作为观测 z np.array([(x1x2)/2, (y1y2)/2]) self.kf.predict() self.kf.update(z) cx, cy self.kf.x[:2] # 保持宽高比不变用历史宽高均值 w, h x2-x1, y2-y1 return int(cx-w/2), int(cy-h/2), int(cxw/2), int(cyh/2) # 在检测后调用 smooth_kf BBoxKalman() for i, box in enumerate(boxes): x1, y1, x2, y2 map(int, box) x1s, y1s, x2s, y2s smooth_kf.update(x1, y1, x2, y2) boxes[i] [x1s, y1s, x2s, y2s]同时关闭 YOLOv8 的agnostic_nmsFalse默认 True让同类框 NMS 更严格减少重叠框。3.2 现象两个学生并排坐时ID 互相交换A ID 变成 BB 变成 A原因ByteTrack 的匹配依赖 IOU当两学生 bbox 高度重叠如并排记笔记IOU 0.8匈牙利算法随机分配 ID。解决强制加入外观特征ReID但不用重型网络。我们用轻量OSNet仅 2.2M 参数提取 bbox 内部特征与 IOU 融合# 在 tracker.update() 前为每个检测框提取 OSNet 特征 from torchreid import models reid_model models.build_model( nameosnet_x0_25, num_classes1000, pretrainedTrue ).cuda().eval() # ...预处理 bbox 图像送入 reid_model... # 得到特征向量 feats [N, 512] # 修改 tracker.update()传入 feats 作为额外参数 online_targets tracker.update(student_dets, [h,w], [h,w], appearance_featsfeats)关键技巧只对 bbox 重叠率 0.6 的候选对启用 ReID 匹配其他仍用 IOU兼顾速度与精度。3.3 现象学生举手回答问题被误判为“玩手机”原因ST-GCN 输入关节点但 MediaPipe 在手臂抬高时对手腕、手指关节点估计误差增大透视缩短导致“手部快速移动”特征被错误激活。解决行为识别层加后处理规则Rule-based Post-processing# behavior_postprocess.py def postprocess_behavior(pred_probs, keypoints_seq, frame_ids): # pred_probs: [4] 概率向量 # keypoints_seq: (2,300,18) 关节点序列 # 提取手腕移动速度仅在躯干前方时计算 wrist_x keypoints_seq[0, :, 10] # left_wrist x wrist_y keypoints_seq[1, :, 10] # left_wrist y shoulder_x keypoints_seq[0, :, 6] # left_shoulder x shoulder_y keypoints_seq[1, :, 6] # left_shoulder y # 判断手腕是否在躯干前方x 方向 in_front (wrist_x shoulder_x) (np.abs(wrist_y - shoulder_y) 50) # 计算手腕速度仅在前方时 if in_front.sum() 10: # 至少10帧在前方 speed np.sqrt(np.diff(wrist_x[in_front])**2 np.diff(wrist_y[in_front])**2) avg_speed speed.mean() if avg_speed 0.8 and pred_probs[1] 0.6: # 玩手机概率高且速度快 # 检查是否举手手腕 y 肩膀 y 100px典型举手高度 if wrist_y[in_front].max() shoulder_y[in_front].mean() 100: pred_probs[1] * 0.3 # 大幅降低玩手机概率 pred_probs[2] max(pred_probs[2], 0.4) # 提升左顾右盼举手常伴随转头 return pred_probs永远不要相信单一模型输出。课堂行为是模糊的必须用领域知识兜底。4. 从“检测到行为”到“生成督导报告”分析系统的三层设计检测和识别只是技术基础真正让系统落地的是“分析”——把原始行为数据转化为教学改进依据。我们设计了三层分析基础统计、行为模式挖掘、归因建议。全部用 Python Pandas Plotly 实现无需数据库输出 HTML 报告。4.1 基础统计层每节课的量化画像输入behavior_log.csv格式为frame_id,student_id,behavior_class,confidence,start_time,end_time 1250,7,play_phone,0.82,10:02:15,10:02:22 1280,3,sleep,0.91,10:02:28,10:02:35 ...输出report_basic.html含 4 个核心指标异常行为发生率Σ(各行为持续帧数) / 总帧数 × 100%学生参与度分布按 ID 统计“无异常”时长占比生成箱线图识别沉默学生行为时段热力图横轴为上课时间0-45min纵轴为行为类型颜色深浅发生频次教师互动关联统计教师提问后 30 秒内学生“左顾右盼”“站立走动”发生率判断问题设计有效性# report_basic.py import pandas as pd import plotly.express as px from datetime import timedelta df pd.read_csv(behavior_log.csv) df[start_sec] pd.to_datetime(df[start_time]).dt.second pd.to_datetime(df[start_time]).dt.minute * 60 df[duration] (pd.to_datetime(df[end_time]) - pd.to_datetime(df[start_time])).dt.total_seconds() # 1. 异常行为发生率 total_frames 45 * 60 * 25 # 45分钟×60秒×25FPS abnormal_duration df[duration].sum() rate abnormal_duration / total_frames * 100 # 2. 学生参与度无异常时长占比 student_total df.groupby(student_id)[duration].sum().reindex(range(1,31), fill_value0) # 假设30人 student_total.name abnormal_duration all_duration 45*60 # 每人总时长秒数 participation 100 - (student_total / all_duration * 100) # 3. 时段热力图 df[time_bin] (df[start_sec] // 60).astype(int) # 每分钟一格 heatmap_data df.groupby([time_bin, behavior_class]).size().unstack(fill_value0) fig px.imshow(heatmap_data, labelsdict(x上课分钟, y行为类型, color发生次数), title行为时段热力图) fig.write_html(report_basic.html, include_plotlyjscdn)为什么用分钟粒度教师反馈他们不关心“10:02:15”而关心“第2分钟发生了什么”。分钟级热力图能一眼看出前5分钟趴桌多学生未进入状态25分钟玩手机激增注意力衰减临界点后10分钟站立走动多小组讨论环节。4.2 行为模式挖掘层发现隐藏的教学规律基础统计只看单点模式挖掘看关联。我们用Apriori 关联规则发现行为组合规律。例如{趴桌} ⇒ {玩手机}支持度 0.62置信度 0.85 → 趴桌学生大概率在玩手机需干预{左顾右盼} ∧ {教师提问}⇒{站立走动}置信度 0.71 → 教师提问方式可能引发学生离座。# pattern_mining.py from mlxtend.frequent_patterns import apriori, association_rules import numpy as np # 构建事务矩阵每行一节课每列行为类型教师事件1发生0未发生 # 例如[1,0,1,0,1] 表示该课有趴桌、左顾右盼、教师提问 transactions [] for lesson_id in df[lesson_id].unique(): lesson_df df[df[lesson_id]lesson_id] row np.zeros(8) # 4行为 4教师事件提问/板书/走动/播放视频 for _, r in lesson_df.iterrows(): if r[behavior_class] sleep: row[0] 1 elif r[behavior_class] play_phone: row[1] 1 # ...其他行为 if r[teacher_event] ask_question: row[4] 1 # ...其他事件 transactions.append(row) trans_df pd.DataFrame(transactions, columns[sleep,play_phone,look_around,stand_up,ask_q,write_bb,walk,play_vid]) frequent_itemsets apriori(trans_df, min_support0.2, use_colnamesTrue) rules association_rules(frequent_itemsets, metricconfidence, min_threshold0.6) # 输出 rules 到 report_pattern.html教师最认可的规则{教师板书} ⇒ {趴桌}置信度 0.78。这印证了“板书时间学生易走神”的经验督导据此建议教师每板书5分钟插入一次提问。4.3 归因建议层给教师可执行的改进建议分析不能止于“发现了什么”要给出“怎么办”。我们构建了一个规则引擎 LLM 辅助生成的混合系统规则引擎处理确定性归因如“趴桌率30% ⇒ 建议调整座位避免背光”对复杂模式如“趴桌玩手机集中发生在第20-25分钟”调用本地部署的Phi-3-mini3.8B 参数CPU 可跑输入上下文生成建议。# generate_recommendation.py from transformers import AutoTokenizer, AutoModelForSeq2SeqLM tokenizer AutoTokenizer.from_pretrained(microsoft/Phi-3-mini-4k-instruct) model AutoModelForSeq2SeqLM.from_pretrained(microsoft/Phi-3-mini-4k-instruct).to(cpu) def generate_advice(pattern_desc, class_context): prompt f你是一名资深教学督导专家。请根据以下课堂行为分析结果给出3条具体、可操作、不空泛的教学改进建议。 行为模式{pattern_desc} 课程背景{class_context} 要求每条建议以建议开头用中文不超过20字避免加强注重等虚词。 inputs tokenizer(prompt, return_tensorspt).to(cpu) outputs model.generate(**inputs, max_new_tokens100, temperature0.3) return tokenizer.decode(outputs[0], skip_special_tokensTrue) # 示例调用 advice generate_advice( 趴桌率在第20-25分钟达峰值42%同期玩手机率35%, 高职《Python编程》课学生基础薄弱当前讲授文件读写语法 ) print(advice) # 输出示例 # 建议插入1个文件读写小实验 # 建议用学生学号作文件名示例 # 建议将语法拆成3个10分钟微任务为什么用 Phi-3-mini 而非更大模型实测 GPT-4 生成建议质量高但延迟大8秒教师不愿等Llama3-8B 在 CPU 上需 25 秒。Phi-3-mini 在 i7-11800H 上仅 1.2 秒且指令遵循能力强生成建议 92% 被教师采纳。5. 部署到边缘设备用 TensorRT 加速让 4K 教室视频在 Jetson Orin 上实时跑系统最终要装进教室的边缘盒子Jetson Orin NX而非依赖云端。Orin NX16GB的算力只有 RTX 3060 的 1/3必须做极致优化。我们放弃“全栈 Python”用TensorRT 加速核心模型并重构 pipeline 为 C 流水线。5.1 YOLOv8n 的 TensorRT 引擎生成FP16 动态 shapeYOLOv8 官方不支持 TRT我们用 WongKinYiu/yolov8 的 TRT 导出分支。关键输入 shape 必须动态教室摄像头分辨率不一1080p/4KTRT 引擎需支持[1,3,640,640]到[1,3,1280,1280]用 FP16 精度Orin 的 FP16 算力是 FP32 的 2 倍且精度损失 0.3% mAP禁用不必要的后处理TRT 引擎只输出 raw logitsNMS 由 C 代码实现更可控。# 导出 ONNXPyTorch python export.py --weights runs/detect/yolov8n_classroom/weights/best.pt \ --include onnx \ --dynamic \ --opset 17 \ --simplify # 转 TRT 引擎在 Orin 上运行 trtexec --onnxyolov8n_classroom.onnx \ --saveEngineyolov8n_classroom.trt \ --fp16 \ --workspace4096 \ --minShapesinput:1x3x640x640 \ --optShapesinput:1x3x640x640 \ --maxShapesinput:1x3x1280x1280 \ --buildOnlytrtexec 参数详解--workspace4096分配 4GB 显存作构建工作区Orin NX 16GB 显存够用--min/opt/maxShapes定义动态 shape 范围必须覆盖教室所有摄像头--buildOnly只构建引擎不测试本文还有配套的精品资源点击获取