基于 YOLOv8 模型框架训练课堂教师老师行为检测数据集建立基于深度学习的教师行为检测 识别老师玩手机书写 指导学生等
文章目录
以下文字及代码仅供参考。
教师行为检测数据集
3898张,yolo和voc标注,
6类,标注数量:
Crossing legs:跷二郎腿,1192
Using a phone:使用手机,1295
Teaching or asking:教学或提问,564
Looking at the screen:看屏幕,289
Writing:书写,312
Guiding students:指导学生,626
image num:图像数量,3898
教师行为检测 目标检测数据集,如何从 数据准备 → 数据划分 → 环境搭建 → 模型训练 → 推理部署 → 性能评估 的全过程,
仅供参考
—
✅ 一、项目总览
阶段 | 内容 |
---|---|
数据准备 | YOLO/VOC标注转换、类别映射 |
数据划分 | 训练集/验证集(9:1) |
环境搭建 | 安装YOLOv8、配置依赖包 |
数据配置 | 编写 data.yaml |
模型训练 | 使用预训练模型 fine-tune |
配置超参数 | 学习率、epoch、batch size等 |
模型推理 | 单张图、视频、批量推理 |
性能评估 | mAP、精确度、召回率 |
✅ 二、数据结构要求(YOLO格式)
假设你已将数据整理为如下格式:
teacher_behavior_dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
每张图片对应一个 .txt
文件,内容如下(YOLO格式):
class_id x_center y_center width height
例如:
0 0.5 0.4 0.2 0.3 # 表示“Crossing legs”类在图像中间
✅ 三、类别名称列表(classes.txt)
创建 classes.txt
文件,列出所有6个类别:
cross_legs
using_phone
teaching_asking
looking_screen
writing
guiding_students
✅ 四、VOC XML 转 YOLO txt 格式脚本(如有需要)
VOC XML 格式,可以运行以下 Python 脚本进行转换:
import xml.etree.ElementTree as ET
import os
import glob
def convert(size, box):
dw = 1. / size[0]
dh = 1. / size[1]
x = (box[0] + box[1]) / 2.0
y = (box[2] + box[3]) / 2.0
w = box[1] - box[0]
h = box[3] - box[2]
return x * dw, y * dh, w * dw, h * dh
def convert_annotation(xml_file, out_file, class_mapping):
tree = ET.parse(xml_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
with open(out_file, 'w') as out:
for obj in root.iter('object'):
cls = obj.find('name').text
if cls not in class_mapping:
continue
cls_id = class_mapping[cls]
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text),
float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
bb = convert((w, h), b)
out.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
# 示例用法
class_names = {
'cross_legs': 0,
'using_phone': 1,
'teaching_asking': 2,
'looking_screen': 3,
'writing': 4,
'guiding_students': 5
}
xml_files = glob.glob("path/to/xml/*.xml")
for xml in xml_files:
base_name = os.path.splitext(os.path.basename(xml))[0]
out_path = f"path/to/labels/train/{base_name}.txt"
convert_annotation(xml, out_path, class_names)
✅ 五、数据划分:训练集和验证集(9:1)
pip install scikit-learn
from sklearn.model_selection import train_test_split
import shutil
import os
image_files = [f for f in os.listdir("images") if f.endswith(".jpg")]
train_files, val_files = train_test_split(image_files, test_size=0.1, random_state=42)
os.makedirs("images/train", exist_ok=True)
os.makedirs("images/val", exist_ok=True)
os.makedirs("labels/train", exist_ok=True)
os.makedirs("labels/val", exist_ok=True)
for f in train_files:
shutil.copy(f"images/{f}", f"images/train/{f}")
shutil.copy(f"labels/{f.replace('.jpg', '.txt')}", f"labels/train/{f.replace('.jpg', '.txt')}")
for f in val_files:
shutil.copy(f"images/{f}", f"images/val/{f}")
shutil.copy(f"labels/{f.replace('.jpg', '.txt')}", f"labels/val/{f.replace('.jpg', '.txt')}")
✅ 六、创建 data.yaml 文件
train: ./teacher_behavior_dataset/images/train
val: ./teacher_behavior_dataset/images/val
nc: 6
names: ['cross_legs', 'using_phone', 'teaching_asking', 'looking_screen', 'writing', 'guiding_students']
✅ 七、环境安装(YOLOv8)
pip install ultralytics
✅ 八、模型训练代码(Python API)
from ultralytics import YOLO
# 加载预训练模型(推荐从官方下载 yolov8s.pt)
model = YOLO("yolov8s.pt") # 可替换为 yolov8n.pt, yolov8m.pt 等
# 开始训练
results = model.train(
data="data.yaml",
epochs=100,
imgsz=640,
batch=16,
name="teacher_behavior_yolov8s",
device=0 if torch.cuda.is_available() else None,
workers=4,
optimizer='AdamW',
lr0=0.001,
pretrained=True,
augment=True,
close_mosaic=10,
save=True,
project="runs/teacher",
)
✅ 九、性能评估与验证
# 使用最佳权重进行验证
model = YOLO("runs/teacher/teacher_behavior_yolov8s/weights/best.pt")
metrics = model.val(data="data.yaml", split="val")
print(metrics.box.map) # mAP@0.5:0.95
print(metrics.box.p) # Precision
print(metrics.box.r) # Recall
✅ 十、推理代码(推理+批量+保存结果)
🔹 单张图像推理
model = YOLO("runs/teacher/teacher_behavior_yolov8s/weights/best.pt")
results = model("test_images/teacher.jpg")
for r in results:
r.show() # 显示结果
r.save(filename="result.jpg") # 保存结果
🔹 视频流实时检测(摄像头)
import cv2
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
results = model(frame)
annotated_frame = results[0].plot()
cv2.imshow("Teacher Behavior Detection", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
🔹 批量图像推理(文件夹)
from glob import glob
image_paths = glob("test_images/*.jpg")
for img_path in image_paths:
results = model(img_path)
for r in results:
r.save(filename=f"outputs/{os.path.basename(img_path)}")
✅ 十一、构建深度学习教师行为识别系统(Web 应用示例)
你可以使用 Flask 构建一个简单的 Web 检测系统,接收上传的图片并返回检测结果。以下是简化版本:
from flask import Flask, request, jsonify
from ultralytics import YOLO
import cv2
import numpy as np
app = Flask(__name__)
model = YOLO("runs/teacher/teacher_behavior_yolov8s/weights/best.pt")
@app.route('/detect', methods=['POST'])
def detect():
file = request.files['image']
img = cv2.imdecode(np.frombuffer(file.read(), np.uint8), cv2.IMREAD_COLOR)
results = model(img)
res_plotted = results[0].plot()
_, buffer = cv2.imencode('.jpg', res_plotted)
return jsonify({"result": buffer.tobytes().hex()})
启动服务:
flask run
发送 POST 请求即可获取检测结果。
✅ 十二、建议优化方向
优化项 | 描述 |
---|---|
多尺度训练 | 提高小目标和大目标检测能力 |
自定义锚框 | 使用 k-means 聚类生成更合适的 anchor |
增强策略 | 添加 Mosaic、Mixup 等增强方式 |
模型选择 | 根据硬件资源选择 yolov8n/s/m/l/x |
导出ONNX | 用于部署到边缘设备或移动端 |
十三、总结
个 教师行为检测系统 的全流程,包括:
- 数据准备(VOC转YOLO)
- 数据划分(train/val)
- 环境搭建(YOLOv8)
- 模型训练(定制化Fine-tuning)
- 推理与部署(图像、视频、Web API)
- 性能评估(mAP、P、R)
仅供参考,