基于 YOLOv8 模型框架训练课堂教师老师行为检测数据集建立基于深度学习的教师行为检测 识别老师玩手机书写 指导学生等

基于 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)

仅供参考,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值