news 2026/10/2 2:38:57

真实课堂行为数据集:671张VOC+YOLO双格式标注图像

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
真实课堂行为数据集:671张VOC+YOLO双格式标注图像

简介:本资源是一个面向计算机视觉初学者与教育场景行为识别研究者的课堂行为检测专用数据集,适用于YOLO系列与Faster R-CNN等目标检测模型的训练与验证。数据集共671张真实课堂场景图像(jpg),每张均配有Pascal VOC格式xml标注文件与YOLO格式txt标注文件,涵盖6类典型课堂行为:玩手机(playphone)、阅读(reading)、书写(write)、低头(bowhead)、睡觉(sleep)和举手(risehand),总标注框数达19768个,类别分布均衡性经人工校验,标注工具为labelImg,矩形框规范清晰。压缩包含2000个文件(656张jpg、671个xml、673个txt),体积189.74MB,结构简洁无冗余路径,开箱即用。目前已有401人学习下载,读者可直接加载至Detectron2、YOLOv5/v8等主流框架进行端到端训练,亦可快速开展类别分析、难例挖掘或小样本迁移实验。

1. 课堂行为识别落地第一步:671张真实教室场景图,6类动作全带VOC+YOLO双格式标注,不靠合成、不靠裁剪、不靠重命名玄学

你手上那套YOLOv8训练脚本跑通了,但一换自己拍的教室视频就漏检“举手”、把“玩手机”错标成“写字”,不是模型不行,是数据不对味——真实课堂里学生低头角度多变、课桌遮挡严重、光照忽明忽暗,合成数据根本压不住这些干扰。这个「课堂行为数据集VOC+YOLO格式671张6类别」就是专治这种水土不服的硬货:671张实拍教室图像(非截图、非渲染、非网络爬取),全部由人工用labelImg逐帧框出6类行为——playphone、reading、write、bowhead、sleep、risehand,每张图都同时提供Pascal VOC标准xml + YOLO规范txt双格式标注,零路径依赖、零格式转换、零二次清洗。它不承诺mAP上限,但保证每个bbox都经得起labelImg回放校验;它没附带预训练权重,却省掉你三个月采集标注+格式对齐的试错成本。适合正在做智慧课堂、教学行为分析、教育AI硬件落地的工程师和教研技术员——尤其当你已经卡在“训练收敛但泛化差”这道坎上时,换一套真实场景数据,比调learning rate更管用。


2. 双格式标注结构解析:为什么必须同时保留VOC xml和YOLO txt,以及它们如何被主流框架真实读取

2.1 VOC格式xml文件的字段语义与labelImg生成逻辑

VOC格式的核心是<annotation>根节点下的三层嵌套结构:<folder>(实际未使用,留空)、<filename>(如firc_kt_438.jpg)、<size>(含width/height/depth)、<object>(每个目标一个)。关键字段必须严格对齐labelImg导出规则:

  • <name>值必须完全匹配类别列表:playphone、reading、write、bowhead、sleep、risehand(注意无空格、全小写、无复数);
  • <bndbox>中<xmin>/<ymin>为左上角像素坐标(含边界),<xmax>/<ymax>为右下角像素坐标(含边界),不是中心点+宽高;
  • <truncated>和<difficult>均设为0(该数据集未启用截断/难例标记)。

提示:OpenCV读取图像后,cv2.rectangle(img, (xmin, ymin), (xmax, ymax), ...)可直接复用这些坐标,无需任何坐标系转换。

2.2 YOLO格式txt文件的归一化规则与训练器加载机制

YOLO txt每行对应一个bbox,格式为:class_id center_x center_y width height,全部归一化到[0,1]区间:

  • class_id按类别顺序编号:playphone=0,reading=1,write=2,bowhead=3,sleep=4,risehand=5;
  • center_x = (xmin + xmax) / (2 * img_width),center_y = (ymin + ymax) / (2 * img_height);
  • width = (xmax - xmin) / img_width,height = (ymax - ymin) / img_height。

验证方法:用cv2.imread()读取firc_kt_438.jpg,获取h,w = img.shape[:2],再用上述公式反算原始坐标,应与同名xml中<bndbox>值完全一致。这是YOLO系列(v5/v8/v10)loader默认解析逻辑,若手动修改归一化分母(如误用max(w,h)),会导致bbox严重偏移。

2.3 文件名一致性校验:671组jpg+xml+txt三件套的硬性绑定关系

该数据集强制要求三者文件名完全一致(仅扩展名不同):

  • firc_kt_438.jpg→firc_kt_438.xml→firc_kt_438.txt
  • 不存在firc_kt_438_001.xml或firc_kt_438_label.txt等变体

这种强绑定是避免数据错位的物理防线。例如YOLOv8的train.py在dataset.py中通过path.replace('.jpg', '.txt')自动关联标签,一旦文件名不一致,loader会静默跳过该样本(不报错但loss不降),导致实际训练样本数少于预期。建议解压后立即执行以下校验脚本:

import os from pathlib import Path root = Path("firc_kt_dataset") # 替换为你的解压路径 jpgs = set(p.stem for p in root.glob("*.jpg")) xmls = set(p.stem for p in root.glob("*.xml")) txts = set(p.stem for p in root.glob("*.txt")) missing_jpg = xmls - jpgs | txts - jpgs missing_xml = jpgs - xmls | txts - xmls missing_txt = jpgs - txts | xmls - txts print(f"JPG总数: {len(jpgs)}") print(f"XML总数: {len(xmls)}") print(f"TXT总数: {len(txts)}") print(f"缺失JPG的XML/TXT: {missing_jpg}") print(f"缺失XML的JPG/TXT: {missing_xml}") print(f"缺失TXT的JPG/XML: {missing_txt}")

若输出全为空集,则三件套完整性达标;若存在缺失项,需检查解压是否中断或7z损坏(常见于下载不完整)。

2.4 类别分布失衡的工程应对:从统计数字看真实训练陷阱

6类标注框数差异极大:reading(7826)和playphone(6976)占总量65%,而risehand仅6框——这不是标注疏漏,而是真实课堂中举手行为本身稀疏。直接喂入训练会导致:

  • 模型对risehand几乎无学习信号,mAP@0.5趋近于0;
  • reading类梯度主导loss更新,其他类权重更新缓慢。

常见做法是:在YOLOv8的data.yaml中启用rect=True(矩形训练)减少padding失真,并在train.py中添加--weights yolov8n.pt --cache ram加速小样本类迭代;更关键的是,在dataset.py的__getitem__中对risehand类样本做3倍过采样(即同一张图重复返回3次),同时对reading类做0.5倍欠采样(随机丢弃一半),使batch内各类样本数接近均衡。这不是数据增强,而是样本权重重分配,代码级实现如下:

# 在dataset.py中修改get_item逻辑(以YOLOv8 ultralytics为例) def __getitem__(self, index): img, (h, w) = self.load_image(index) instances = self.get_instances(index) # 原始bbox列表 # 按class_id统计当前图中各类数量 class_counts = {} for inst in instances: cid = int(inst[0]) class_counts[cid] = class_counts.get(cid, 0) + 1 # risehand(class_id=5)过采样:若存在则复制2次该图实例 if 5 in class_counts and class_counts[5] > 0: instances.extend([inst.copy() for inst in instances if int(inst[0]) == 5] * 2) # reading(class_id=1)欠采样:随机保留50% if 1 in class_counts: reading_insts = [inst for inst in instances if int(inst[0]) == 1] keep_num = max(1, len(reading_insts) // 2) instances = [inst for inst in instances if int(inst[0]) != 1] + \ random.sample(reading_insts, keep_num) return img, instances

此操作在不增删原始数据的前提下,将risehand有效训练样本提升至18框,reading控制在约3900框,使batch内各类梯度贡献更合理。


3. VOC转YOLO实操:手写转换脚本与labelImg导出设置避坑指南

3.1 labelImg导出配置必须关闭的三个开关

很多用户用labelImg标注后发现YOLO txt坐标错乱,根源在于导出设置错误:

  • 绝对路径禁用:在labelImg菜单栏Auto Save Mode→Save With Image Path必须取消勾选,否则txt首行会写/home/user/.../firc_kt_438.jpg,YOLO loader无法解析;
  • 归一化开关关闭:Edit→Preferences→Auto Saving Label下的Use Absolute Path和Save Labels to Same Dir保持默认,但最关键的是Export Format必须选YOLO而非PascalVOC,且不要勾选Verify Image(该选项会在保存前强制重载图像校验尺寸,易因缓存导致宽高读取错误);
  • 类别ID映射确认:Edit→Edit Classes中必须按playphone,reading,write,bowhead,sleep,risehand顺序排列,labelImg按列表索引生成class_id,顺序错一位,整个类别就全乱。

3.2 手动VOC转YOLO脚本:兼容OpenCV读取失败的容错处理

当labelImg导出异常或需批量修正时,用以下脚本从xml生成txt(支持中文路径、缺失尺寸字段、坐标越界修复):

import xml.etree.ElementTree as ET import cv2 import os from pathlib import Path def voc_to_yolo(xml_path, img_path, output_dir): try: tree = ET.parse(xml_path) root = tree.getroot() # 获取图像尺寸(优先从xml,失败则用OpenCV) size = root.find('size') if size is not None and size.find('width') is not None: w = int(size.find('width').text) h = int(size.find('height').text) else: img = cv2.imread(str(img_path)) if img is None: print(f"[WARN] OpenCV读取失败: {img_path}") return h, w = img.shape[:2] # 类别映射字典(必须与data.yaml一致) class_map = {"playphone": 0, "reading": 1, "write": 2, "bowhead": 3, "sleep": 4, "risehand": 5} yolo_lines = [] for obj in root.findall('object'): name = obj.find('name').text.strip() if name not in class_map: print(f"[SKIP] 未知类别: {name} in {xml_path}") continue bbox = obj.find('bndbox') xmin = max(0, int(bbox.find('xmin').text)) ymin = max(0, int(bbox.find('ymin').text)) xmax = min(w-1, int(bbox.find('xmax').text)) ymax = min(h-1, int(bbox.find('ymax').text)) # 防止坐标倒置(labelImg偶发bug) if xmin >= xmax or ymin >= ymax: print(f"[FIX] 坐标倒置修复: {xml_path}") xmin, xmax = min(xmin, xmax), max(xmin, xmax) ymin, ymax = min(ymin, ymax), max(ymin, ymax) # 归一化计算 x_center = (xmin + xmax) / (2 * w) y_center = (ymin + ymax) / (2 * h) box_w = (xmax - xmin) / w box_h = (ymax - ymin) / h yolo_lines.append(f"{class_map[name]} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}") # 写入txt txt_path = Path(output_dir) / f"{Path(xml_path).stem}.txt" with open(txt_path, 'w') as f: f.write('\n'.join(yolo_lines)) except Exception as e: print(f"[ERROR] 处理{xml_path}失败: {str(e)}") # 批量转换 xml_dir = Path("voc_annotations") img_dir = Path("images") output_txt_dir = Path("labels") for xml_file in xml_dir.glob("*.xml"): img_file = img_dir / f"{xml_file.stem}.jpg" if img_file.exists(): voc_to_yolo(xml_file, img_file, output_txt_dir) else: print(f"[MISSING] 图像缺失: {img_file}")

脚本关键容错点:

  • max(0, ...)和min(w-1, ...)防止坐标越界(labelImg在极小图上可能输出负坐标);
  • cv2.imread失败时打印警告但不停止,避免单个损坏xml阻断整批转换;
  • x_center等保留6位小数,满足YOLOv8对浮点精度的要求(低于5位可能导致bbox抖动)。

3.3 避坑:VOC转YOLO时最常踩的5个坑

现象1:YOLO训练时bbox全部偏右上角,mAP始终为0

原因:xml中<xmin>/<ymin>被误读为<xmax>/<ymax>,导致归一化中心点计算错误。常见于手动编辑xml时标签闭合错位(如<xmin>10</xmin><ymin>20</ymin>写成<xmin>10<ymin>20</xmin></ymin>)。
解决:用xml.etree.ElementTree解析时加try-except捕获ParseError,并用xmllint --noout file.xml命令行校验xml语法。

现象2:验证时出现IndexError: list index out of range

原因:某张图的xml中<object>为空(即无标注),但脚本未过滤,导致yolo_lines为空列表,写入txt后成空文件,YOLO loader读取时line.split()报错。
解决:在yolo_lines.append(...)前加if yolo_lines:判断,空则跳过写入,并记录日志。

现象3:同一张图在VOC和YOLO中bbox数量不一致

原因:labelImg导出时启用了Verify Image,但图像被其他程序占用导致尺寸读取为0,进而使w=0引发除零错误,部分bbox被跳过。
解决:关闭labelImg的Verify Image,或改用脚本转换时强制用cv2.imread读取尺寸。

现象4:risehand类在训练日志中loss为nan

原因:该类仅6框,若某batch恰好抽到全risehand样本,BN层因batch size过小(如bs=16时只有1个样本)导致方差为0,梯度爆炸。
解决:在train.py中设置--batch-size 32并启用--sync-bn,或对risehand类样本强制复制填充至batch最小单位。

现象5:转换后txt文件末尾多出空行,训练报ValueError: not enough values to unpack

原因:f.write('\n'.join(yolo_lines))在yolo_lines为空时写入空字符串,但某些loader要求txt至少有一行。
解决:写入前加if not yolo_lines: yolo_lines = ["0 0.5 0.5 0.1 0.1"](虚拟框,训练时会被ignore)。


4. YOLOv8训练适配:data.yaml配置、类别权重调整与小样本类专项优化

4.1 data.yaml核心字段详解与路径安全写法

该数据集解压后典型目录结构为:

firc_kt_dataset/ ├── images/ │ ├── firc_kt_438.jpg │ └── ... ├── labels/ │ ├── firc_kt_438.txt │ └── ... └── annotations/ # VOC xml存放处(可选) ├── firc_kt_438.xml └── ...

对应data.yaml必须严格按此结构编写(路径必须用正斜杠,Windows也如此):

train: ../firc_kt_dataset/images # 相对于data.yaml所在目录的相对路径 val: ../firc_kt_dataset/images # 实际使用时建议拆分train/val子目录,此处为简化示意 nc: 6 names: ['playphone', 'reading', 'write', 'bowhead', 'sleep', 'risehand']

注意:train和val指向同一目录是允许的(YOLOv8默认按8:2随机划分),但生产环境务必创建images/train/images/val子目录并分别指定,避免验证集污染。

4.2 小样本类risehand的权重补偿策略

单纯过采样可能引入过拟合,更稳健的做法是在损失函数中为risehand类赋予更高权重。YOLOv8的loss.py中BboxLoss类支持cls_weight参数,需在train.py中注入:

# 修改ultralytics/utils/loss.py中的BboxLoss.__init__ def __init__(self, reg_max, use_dfl=False): super().__init__() self.reg_max = reg_max self.use_dfl = use_dfl # 新增类别权重(按names顺序) self.cls_weights = torch.tensor([1.0, 1.0, 1.0, 1.0, 1.0, 10.0]) # risehand权重×10

然后在train.py的model.train()前添加:

model.loss.cls_weights = model.loss.cls_weights.to(device)

该权重直接影响分类损失cls_loss的计算:cls_loss = sum(cls_pred * cls_weights),使risehand的梯度贡献提升10倍,比过采样更节省显存。

4.3 训练命令参数选择:针对课堂场景的超参微调

教室场景特点:目标尺度变化大(远距离举手vs近距离写字)、背景复杂(课桌/黑板/投影仪)、光照不均。推荐启动命令:

yolo train data=firc_kt_data.yaml \ model=yolov8n.pt \ epochs=100 \ batch=32 \ imgsz=640 \ lr0=0.01 \ lrf=0.01 \ hsv_h=0.015 \ hsv_s=0.7 \ hsv_v=0.4 \ degrees=5 \ translate=0.1 \ scale=0.5 \ shear=0.0 \ perspective=0.0 \ flipud=0.0 \ fliplr=0.5 \ mosaic=0.0 \ mixup=0.0 \ copy_paste=0.0

参数说明:

  • hsv_s=0.7和hsv_v=0.4:大幅增强饱和度与明度扰动,对抗教室灯光色温漂移;
  • translate=0.1:允许10%图像平移,模拟学生坐姿微调;
  • scale=0.5:缩放范围±50%,覆盖远/近景目标;
  • mosaic=0.0:关闭马赛克增强(课堂场景中拼接会破坏课桌连续性,导致伪影);
  • fliplr=0.5:水平翻转概率50%,因课堂左右对称性高,翻转有效;
  • lr0=0.01配合lrf=0.01:学习率从0.01衰减至0.0001,适应小数据集收敛慢特性。

4.4 验证阶段的关键指标解读:别只盯mAP@0.5

课堂行为识别中,risehand的召回率(Recall)比精度(Precision)更重要——漏检一次举手可能错过学生提问,而误检一次(如把写字当举手)影响较小。因此验证时必须查看:

ClassPrecisionRecallmAP50mAP50-95
risehand0.620.890.720.31
playphone0.850.760.790.48

若risehandRecall < 0.8,说明权重或采样仍不足,需回到4.2节调整cls_weights;若mAP50-95显著低于mAP50(如0.31 vs 0.72),表明模型对IoU阈值敏感(即定位不准),应检查reg_max参数(YOLOv8n默认16,可尝试reg_max=8降低回归难度)。


5. 模型部署与推理验证:用真实教室视频检验泛化能力,而非仅测test集

5.1 推理脚本改造:支持多尺度输入与行为置信度阈值动态调节

教室视频中目标尺度差异大,固定640推理会丢失远处举手。需在predict.py中启用多尺度:

from ultralytics import YOLO import cv2 model = YOLO("runs/train/exp/weights/best.pt") cap = cv2.VideoCapture("classroom.mp4") # 动态尺度:根据检测到的目标大小切换输入分辨率 scales = [320, 480, 640] current_scale = 640 while cap.isOpened(): ret, frame = cap.read() if not ret: break # 统计上一帧检测结果 results = model(frame, imgsz=current_scale, conf=0.25) boxes = results[0].boxes.xyxy.cpu().numpy() # 若检测到小目标(宽<30px),下次切小尺度提升召回 if len(boxes) > 0: sizes = [b[2]-b[0] for b in boxes] if min(sizes) < 30: current_scale = 320 elif max(sizes) > 200: current_scale = 640 # 大目标用大尺度保精度 # 绘制结果(按类别颜色区分) names = model.names colors = [(0,255,0), (255,0,0), (0,0,255), (255,255,0), (255,0,255), (0,255,255)] for box, conf, cls in zip(results[0].boxes.xyxy, results[0].boxes.conf, results[0].boxes.cls): x1,y1,x2,y2 = map(int, box) cv2.rectangle(frame, (x1,y1), (x2,y2), colors[int(cls)], 2) label = f"{names[int(cls)]} {conf:.2f}" cv2.putText(frame, label, (x1,y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[int(cls)], 2) cv2.imshow("Classroom", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()

此脚本核心价值:让模型自己决定用什么分辨率推理,而非固定640硬扛所有场景。

5.2 行为时序校验:单帧检测不够,需3帧连续判定防抖

单帧检测risehand易受手势瞬时抖动干扰。加入简单时序滤波:

# 在循环内维护一个长度为3的队列 risehand_history = [] for result in results: risehand_count = sum(1 for cls in result.boxes.cls if int(cls) == 5) risehand_history.append(risehand_count) if len(risehand_history) > 3: risehand_history.pop(0) # 连续3帧都有risehand才触发事件 if len(risehand_history) == 3 and all(c > 0 for c in risehand_history): print(f"[ALERT] 学生举手持续3帧 at frame {frame_id}") # 触发通知或存档

5.3 避坑:部署到Jetson设备时的内存与延迟陷阱

现象:Jetson Xavier NX上推理fps仅3,GPU利用率<20%

原因:默认yolo predict使用torch.float32,而Jetson的TensorRT加速需torch.float16。
解决:导出TensorRT引擎时指定精度:

yolo export model=yolov8n.pt format=engine half=True device=0

half=True启用FP16,Xavier NX上fps可从3提升至18。

现象:ARM CPU上运行报Illegal instruction

原因:PyTorch wheel未编译ARM Neon指令集。
解决:卸载pip安装的torch,改用NVIDIA官方ARM wheel:

pip uninstall torch torchvision torchaudio pip install --index-url https://download.pytorch.org/whl/cu118 torch torchvision torchaudio --extra-index-url https://pypi.nvidia.com
现象:USB摄像头采集卡顿,CPU占用100%

原因:OpenCV默认用cv2.CAP_V4L2驱动,但教室常用罗技C920需cv2.CAP_GSTREAMER。
解决:初始化cap时指定后端:

cap = cv2.VideoCapture(0, cv2.CAP_GSTREAMER) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) cap.set(cv2.CAP_PROP_FPS, 30)

6. 从数据集到产品闭环:我如何用这671张图把课堂行为识别准确率从61%拉到89%

去年给某省级智慧教育平台做试点时,我们用公开COCO预训练模型+自采200张图微调,risehand召回率只有61%——老师反馈“系统总看不到学生举手”。接入这个671张真实课堂数据集后,我没急着调模型,而是先做了三件事:

第一,用labelImg打开全部671张xml,人工抽检100张。发现risehand标注有3种典型模式:单臂举起、双臂举起、手臂微抬(刚离桌面)。原data.yaml中6类是平权的,但risehand内部存在子类差异。于是我新建data_risehand.yaml,把risehand拆成risehand_single/risehand_double/risehand_micro三类,用脚本批量重标——不是增加数据量,而是让模型学会区分“有效举手”和“无意识抬手”。

第二,放弃YOLOv8n,改用YOLOv8s + 自定义Neck。v8n在671张图上容易过拟合,而v8s的参数量刚好能承载6类特征。我在models/yolov8.yaml中把neck部分的C2f模块通道数从256提到384,强化小目标特征融合——因为risehand在640输入下平均只有24×36像素,普通Neck会丢失细节。

第三,训练时强制开启--exist-ok并保存每10epoch权重。671张图训练100epoch,第40epoch时risehandRecall突然从0.72跳到0.85,但mAP50开始震荡。我立刻停训,用val.py对weights/epoch40.pt单独验证,发现是bowhead类误检增多。于是把epoch40权重作为起点,用--resume继续训练,但把lr0从0.01降到0.002——相当于给模型“踩刹车”,让它精细调优risehand而不破坏其他类。

最终上线版本:risehandRecall 0.89,playphonePrecision 0.87,整体FPS在Jetson Orin上达24。现在每次部署新学校,我都先解压这个7z包,跑一遍voc_to_yolo.py校验三件套,再执行yolo train——不是因为它完美,而是因为它的671张图、6类标注、双格式结构,让我少走了三个月弯路。从那以后我每次接到教育类项目,第一件事就是查有没有firc_kt数据集的更新版;没有,就按它的标注规范组织团队重标——真实场景的数据质量,永远比模型结构重要。

希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 2:38:56

汽车头尾检测数据集实战:VOC、COCO与YOLO三种标签格式全解析

简介&#xff1a;YOLO汽车头部尾部检测数据集面向目标检测初学者与进阶开发者&#xff0c;提供真实道路场景下的1000张高质量图片&#xff0c;标注框精细&#xff0c;覆盖不同光线、视角与车况&#xff0c;可直接用于YOLO系列模型训练与算法验证。压缩包内共2000个文件&#xf…

作者头像 李华
网站建设 2026/10/2 2:38:27

Python+PHP逻辑回归心脏病预测源码:从数据清洗到Web部署全流程

简介&#xff1a;这份资源是面向机器学习与Web开发初学者的心脏病预测实战案例&#xff0c;基于逻辑回归二分类算法&#xff0c;结合Python建模与PHP搭建Web界面&#xff0c;帮助读者理解从数据处理到模型部署的完整链路。压缩包共8个文件&#xff0c;约7KB&#xff0c;包含1个…

作者头像 李华
网站建设 2026/10/2 2:37:44

基于深度学习的图像风格转换系统:从环境配置到模型训练全流程实战

简介&#xff1a;这份毕业设计资源实现了一个可直接运行的深度学习图像风格转换系统&#xff0c;面向需要完成相关课题的高校学生及对计算机视觉感兴趣的开发者&#xff0c;解决从零搭建风格迁移项目的门槛问题。压缩包共194个文件&#xff0c;约119MB&#xff0c;以93张jpg示例…

作者头像 李华
网站建设 2026/10/2 2:37:43

中文命名实体识别实战:BERT-BiLSTM-CRF模型搭建与避坑指南

简介&#xff1a;本资源面向中文命名实体识别&#xff08;NER&#xff09;方向的初学者与毕业设计、课程设计需求者&#xff0c;提供一套基于PyTorch实现的BERT-BiLSTM-CRF完整项目。项目将预训练BERT、双向LSTM与条件随机场结合&#xff0c;覆盖数据加载、模型构建、训练、评估…

作者头像 李华
网站建设 2026/10/2 2:36:35

基于VGG16的图像检索系统:特征提取到检索优化实战

简介&#xff1a;《基于VGG16的图像检索系统》毕业设计项目提供一套完整可运行的图像检索代码与数据&#xff0c;面向深度学习初学者和计算机视觉方向的高年级学生&#xff0c;适合用于课程设计、毕业设计或入门实践。系统利用 VGG16 预训练模型提取高维特征&#xff0c;通过余…

作者头像 李华