恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

两万张疲劳打哈欠图像分类:从数据清洗到实时部署

  • 首页
  • 资讯中心
  • /
  • 两万张疲劳打哈欠图像分类:从数据清洗到实时部署

相关资讯

VSCode+PlatformIO替代Keil开发STC89C52单片机指南 2026/9/28 8:36:04
大模型调用账单对账:从token口径到请求级差异排查实战 2026/9/28 8:36:04
ADS2020交叉耦合VCO设计与相位噪声优化实战 2026/9/28 8:36:04

最新资讯

C++安全编程避坑指南:从编译警告到内存与并发安全
AI Skills实战指南:从提示词到TypeScript代码评审Agent技能
Python GIL详解:多线程为何跑不满CPU?绕开GIL的实用方案
AutoGen多智能体框架实战:从环境搭建到代码执行器闭环
新手向 OpenClaw 部署教程:Windows 可视化安装、config.toml 骨架与常见报错处理(含安装包)
智慧校园WebGIS地图控件开发:配置、自定义与避坑指南

今日推荐

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量
制作网页比较方便的软件怎么选?一文搞懂避坑指南
BootCamp6.1.7071驱动包手动安装与回滚全攻略

本周热门

从像素到笔画:srt-whiteboard-animation骨架笔迹追踪实现(Zhang-Suen细化+8邻接追踪)
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
新手入门看这篇:建设网站加盟避坑指南与SEO实操

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

两万张疲劳打哈欠图像分类:从数据清洗到实时部署

发布时间:2026/9/28 8:36:04
两万张疲劳打哈欠图像分类:从数据清洗到实时部署 简介面向疲劳状态识别与图像分类任务一套已标注的疲劳与打哈欠图像分类数据集包含约20,000张图片涵盖疲劳、打哈欠两个类别。数据集已按训练集、验证集划分同类图片存放于对应目录同时提供json格式的类别说明文件便于检查标签和自定义加载训练与验证目录采用常见分类格式可直接被多数深度学习框架的数据加载器识别。内置show脚本可快速查看样本图像便于确认图像与类别对应关系帮助预处理与质量检查能够对接TensorFlow、PyTorch等框架进行二分类模型训练与评估。压缩包共2000个文件其中1998张jpg图片为数据主体1个json文件保存分类与划分信息1个Python脚本负责可视化预览整体大小约334.72MB。资源面向驾驶员疲劳监测、课堂专注度分析等实用场景已有158人学习/下载适合需要已标注数据快速搭建分类模型、开展数据增强或对比实验的初学者与研究者。1. 疲劳与打哈欠图像分类数据集约两万张已标注图像到底能解决什么问题运行中的驾驶疲劳预警系统核心输入往往就是这个“疲劳与打哈欠图像分类数据集”——约20,000张、已标注的图片。多数从业者以为拿到标注数据就等于拿到了可用模型实际上中间至少还要做三次决策标注格式怎么读、类别不均衡怎么处理、基座模型选哪一款。这篇笔记按大多数项目落地时的动作顺序把两万张图变成能部署的疲劳分类模型并在验证集、误报和分辨率层面记下几处常见雷区。适合正在用PyTorch或YOLOv8跑图像分类训练的人如果你只是大体了解分类任务跟着下面的脚本和参数说明也能跑通。2. 第一步是查标注目录结构、坏图检测与分层切分工序解压后的两万张图放在面前不建议直接开训。一个“已标注”的图像分类数据集在落地时至少要过三关格式能读、图像能解码、类别划分不泄漏。绕开这三关后面所有训练都会在某个节点暴露成浪费时间的现象——loss下不去、验证集突然崩掉、现场视频误报成灾难。2.1 先分清楚是文件夹式还是CSV映射表再确定读取方案“已标注”在图像分类里最常见的是两种组织方式。一种是按类别分目录像train/normal/、train/yawn/、train/eye_close/目录名就是标签另一种是给一张CSV映射表每一行是图像路径和类别字段。用PyTorch做文件夹式读取时torchvision.datasets.ImageFolder会按子目录名生成类别索引默认顺序是文件夹名的字典序。举例import torchvision train_data torchvision.datasets.ImageFolder(roottrain) print(train_data.class_to_idx) # 输出类似 {eye_close: 0, normal: 1, yawn: 2}这里的class_to_idx非常重要。如果训练和验证时目录拼写不一致比如一边是eye_close、另一边是eyeclosed索引就会整套错位训练指标再好都白搭。我一般会把类别映射保存成一个JSON文件固定下来以后加载模型推理时直接读同一份映射谁也不用猜。CSV映射表也容易踩坑。常见错误是直接用pandas读进来后不检查表头列名有的文件写path,label有的写成image_path,class_name。先做一个极简的完整性检查import pandas as pd import os df pd.read_csv(labels.csv, dtype{label: str}) # 过滤掉路径不存在的行防止训练中途 FileNotFoundError df df[df[path].apply(lambda p: os.path.exists(p))].reset_index(dropTrue) print(set(df[label]))参数说明dtype{label: str}是为了避免数字标签“0”“1”被读成数值类型和字符串标签混在一起时产生隐式错误。os.path.exists这一步虽然简单但在两万张图的交付包里经常会发现几条无效路径提前滤掉比训练到一半去排查稳妥得多。如果是Windows环境下运行的标注脚本生成CSV路径里可能带反斜杠。建议统一做一次df[path] df[path].str.replace(\\, /)防止后面把CSV移植到Linux服务器时读取失败。2.2 校验坏图、灰度图与类别均衡两万张数据集的临场检查图像数据集里出现几张无法解码的坏图并不少见。用一段脚本把坏图和非RGB图筛出来顺便统计各类别的数量import os import cv2 from collections import Counter root train sample_paths [] broken_images [] non_rgb_images [] for cls_name in os.listdir(root): cls_dir os.path.join(root, cls_name) if not os.path.isdir(cls_dir): continue for img_name in os.listdir(cls_dir): # 跳过隐藏文件、缩略图缓存和标注缓存 if img_name.startswith(.) or img_name.endswith((.db, .json)): continue img_path os.path.join(cls_dir, img_name) img cv2.imread(img_path) if img is None: broken_images.append(img_path) continue if img.ndim ! 3 or img.shape[2] ! 3: non_rgb_images.append(img_path) continue sample_paths.append((img_path, cls_name)) print(各类别样本数:, Counter(cls for _, cls in sample_paths)) print(坏图数量:, len(broken_images)) print(非RGB数量:, len(non_rgb_images))逻辑说明cv2.imread返回None表示解码失败这类文件通常已经损坏或扩展名与真实编码不一致。img.ndim ! 3能捕捉到灰度图因为灰度图只有两个维度shape[2]不等于 3 则可以发现带透明通道的PNG。分类网络输入约定是RGB三通道灰度图直接丢给网络会在数据加载阶段报维度错误。如果类别统计结果显示“打哈欠”样本明显少于“正常”样本不用急着删除正常样本。图像分类很少有人用欠采样来抹平数据因为正常驾驶背景本身也是有效特征。后续可以通过加权采样器把少数类抬上来这个到第4章再展开。2.3 按人员或按图分层切分固定随机种子避免身份泄漏两万张图即使随机切分训练集和验证集也有一个隐含风险同一个人的多张面部图像可能同时落进训练集和验证集。模型会记忆这个人特定的眼镜、肤色和车内背景验证集准确率虚高。换一个真实用户来测准确率断崖式下跌。如果文件名里带了受试者ID尽量按人切分import pandas as pd from sklearn.model_selection import train_test_split df pd.read_csv(train_split.csv) # 假设文件名形如 subject03_frame0123.jpg df[subject] df[path].apply(lambda p: p.split(/)[-1].split(_)[0]) subjects df[subject].unique() train_subjects, val_subjects train_test_split( subjects, test_size0.2, random_state42 ) train_df df[df[subject].isin(train_subjects)].reset_index(dropTrue) val_df df[df[subject].isin(val_subjects)].reset_index(dropTrue)说明random_state42只是保证每次运行切分结果一致这样训练脚本可以复现。train_test_split默认是随机切分但随机切分的是受试者ID不是图像行因此同一人不会同时出现在两边。这是更严格、也更贴近真实部署的评价方式。如果原数据集没有给出受试者ID只能退而求其次按图像随机切分。此时要在项目笔记里明确写一句“该划分存在身份泄漏风险”后续布到真实场景时用小批量实拍视频单独校验不能只看这个验证集指标。提示切分完成后任何数据增强都不能跨训练集和验证集计算统计量比如不能用全部图像的均值做归一化否则会造成轻微的信息泄漏。归一化参数只允许从训练集上计算。3. 选择基座模型ResNet18与Vision Transformer在疲劳打哈欠分类上的取舍两万张图对深度学习来说是不大不小的量级。从零训练一个深层卷积网络效果通常不理想在预训练权重上做迁移学习才是这条路上的常规打法。3.1 为什么必须用ImageNet预训练模型而不是从零训练CNN面部疲劳分类要识别的细节集中在眼睛闭合程度、嘴巴张开幅度、头部倾斜角度。这些特征在自然图像里都有相似的视觉基底比如“嘴角纹理”“眼部皮肤褶皱”。ImageNet预训练模型已经学会大量中低层视觉特征比如边缘、纹理、色彩过渡这些特征在驾驶舱图像里依然适用。从零训练意味着要重新学这些底层知识两万张图往往不够。我一般按以下顺序选型第一批先跑ResNet18作为稳定基线。它参数量小训练速度快不容易在小数据上剧烈过拟合。如果基线准确率不够或者对打哈欠这一类别的召回率偏低换ResNet50或ViT-B/16。如果目标是车机嵌入式部署算力有限再考虑MobileNetV3并用量化压缩权重。Vision Transformer 对全局结构更敏感嘴部张开的整体轮廓和周围面部肌肉的联动理论上比CNN看得更全。但它对训练策略更挑剔学习率稍高就发散数据增强不够就过拟合。所以在疲劳与打哈欠这个任务上我从不把ViT当默认首选而是等ResNet基线跑完、拿到混淆矩阵之后再决定要不要换。3.2 可复用的PyTorch图像分类训练脚本加载、增强、替换全连接层下面这段是能在大多数图像分类数据集上直接改用的训练框架。以二分类加打哈欠共三类为例模型用ResNet18import torch import torch.nn as nn import torchvision from torchvision import transforms from torch.utils.data import Dataset, DataLoader import pandas as pd from PIL import Image class ImageListDataset(Dataset): def __init__(self, df, transformNone): self.paths df[path].tolist() self.labels df[label].tolist() self.transform transform def __len__(self): return len(self.paths) def __getitem__(self, idx): img Image.open(self.paths[idx]).convert(RGB) if self.transform: img self.transform(img) return img, self.labels[idx] # 训练增强加一点随机裁剪和颜色抖动模拟驾驶舱不同光线 transform_train transforms.Compose([ transforms.Resize((256, 256)), transforms.RandomResizedCrop(224, scale(0.7, 1.0)), transforms.RandomHorizontalFlip(), transforms.ColorJitter(brightness0.2, contrast0.2), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ]) def build_model(num_classes3): model torchvision.models.resnet18( weightstorchvision.models.ResNet18_Weights.IMAGENET1K_V1 ) in_features model.fc.in_features model.fc nn.Linear(in_features, num_classes) return model逻辑说明model.fc是ResNet最后一层全连接替换成输出维度等于类别数的线性层。weightsIMAGENET1K_V1是PyTorch新版写法比旧版pretrainedTrue更明确。Normalize用的 ImageNet 均值与标准差不要随便改因为预训练权重就是基于这套归一化训练的。RandomResizedCrop(224, scale(0.7, 1.0))的参数含义是从缩放后的图中随机裁一块区域面积占原图的70%到100%最终缩放到224。这样模型不会过度依赖“嘴部永远在画面正中心”这个强先验。驾驶舱摄像头角度多样打哈欠时嘴部可能在画面偏左或偏右随机裁剪能让模型适应这种偏移。3.3 必调的三个训练参数学习率、batch_size、早停训练脚本可以抄但参数不能乱抄。结合20,000张这种量级我给出常用初始值参数推荐初始值说明learning rate1e-4迁移学习微调用1e-4比较稳新随机初始化的全连接层可以单独用1e-3batch_size328GB显存够用显存紧张就用16对应调低学习率weight_decay1e-4轻量正则防止全连接层过拟合early stopping patience5验证集acc连续5个epoch不涨就停max epochs50配合学习率余弦衰减通常20个epoch后就收敛了完整训练循环中包含两个容易被忽略的点。第一优化器只给新初始化的fc层一个更高学习率前面的特征提取层用小学习率微调。第二早停时保存的是验证集最优权重而不是最后一个epoch的权重。代码逻辑如下optimizer torch.optim.AdamW([ {params: model.conv1.parameters(), lr: 1e-5}, {params: model.layer1.parameters(), lr: 1e-5}, {params: model.layer2.parameters(), lr: 1e-5}, {params: model.layer3.parameters(), lr: 1e-5}, {params: model.layer4.parameters(), lr: 1e-5}, {params: model.fc.parameters(), lr: 1e-4}, ], weight_decay1e-4) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max20)参数说明AdamW是带权重衰减的Adam在迁移学习中比SGD更省心。前五层卷积用1e-5只有最后一层全连接用1e-4意图是尽量保留ImageNet学到的底层视觉特征让新增的分类头去适应疲劳数据的类别边界。CosineAnnealingLR(T_max20)让学习率在20个epoch内从当前值余弦降到接近0避免后期震荡。早停实现时每次验证集acc刷新就复制一份当前模型权重到CPU内存等到触发patience条件时再加载这份backup。很多人在这一步翻车训练停了取回的是最后一个epoch的权重而那个权重往往已经在验证集上过拟合。提示如果显存只够 batch_size8不要生硬地沿用1e-4建议下调到5e-5。batch越小梯度噪声越大学习率过高会导致loss在训练初期震荡甚至爆掉。4. 训练一套真正能用的疲劳与打哈欠模型采样器、日志读取与混淆矩阵模型结构定了脚本能跑接下来的问题才是疲劳数据特有的类别不均衡、单类召回率低、验证集和实际视频表现不一致。这一章讲怎么把训练过程从“准确率看着不错”推进到“每个类别都站得住”。4.1 类别不平衡时不用克隆少数类用加权采样器图像分类里少数类样本不足最常见的笨办法是把少数类复制几份。这会让模型反复看同一批图见过但没真正学会泛化。更靠谱的做法是用WeightedRandomSampler让每个类别在一个epoch内被抽中的期望概率均等from torch.utils.data import WeightedRandomSampler import pandas as pd train_df pd.read_csv(train_split.csv) labels train_df[label].tolist() class_counts pd.Series(labels).value_counts().to_dict() # 每个样本的权重 该类样本数的倒数 weights [1.0 / class_counts[label] for label in labels] sampler WeightedRandomSampler(weights, num_sampleslen(weights), replacementTrue)逻辑说明假设“正常”有14,000张“打哈欠”有4,000张“闭眼”有2,000张那么闭眼类每个样本的权重是1/2000正常类是1/14000。虽然每个epoch仍然取20,000个样本但闭眼类被选中的概率显著上升。replacementTrue表示有放回抽样少数类同一张图可以在一个epoch内出现多次。这个方案比复制少数类更温和因为它不会让模型在同一个epoch里连续看到完全相同的图。配合数据增强每次抽到同一张原图时裁剪位置和亮度都不同等效于制造了更多变体。使用采样器时要注意把DataLoader里的shuffleTrue去掉因为采样器本身已经决定了取数顺序。两者同时开启会导致打乱逻辑冲突训练日志里的loss曲线会出现周期性抖动。4.2 训练日志的三个关键指标loss、单类召回率、混淆矩阵只看top-1准确率在疲劳任务上是大坑。假如“正常”占样本70%“闭眼”只占10%一个什么都不学的模型只要全输出“正常”就有70%准确率。所以要打印每个类别的召回率和混淆矩阵from sklearn.metrics import classification_report, confusion_matrix def evaluate(model, val_loader): model.eval() all_preds [] all_labels [] correct 0 total 0 with torch.no_grad(): for images, labels in val_loader: images, labels images.cuda(), labels.cuda() outputs model(images) _, preds torch.max(outputs, 1) correct (preds labels).sum().item() total labels.size(0) all_preds.extend(preds.cpu().tolist()) all_labels.extend(labels.cpu().tolist()) print(fTop-1 Acc: {correct / total:.4f}) print(classification_report(all_labels, all_preds, target_names[normal, yawn, eye_close])) print(confusion_matrix(all_labels, all_preds)) return correct / total评估逻辑说明验证集如果按20,000张的20%切分大约4,000张单卡推理一遍在ResNet18上只需要几十秒。confusion_matrix的行是真值类别列是预测类别能直接看出“打哈欠被误判成正常”还是“正常被误判成打哈欠”。在疲劳预警场景里False Negative的代价高于False Positive。把一次真正的打哈欠漏掉意味着疲劳状态没有被及时发现把正常说话误判成打哈欠顶多是一次无效提醒。所以判断模型是否合格我习惯先看“yawn”和“eye_close”这两类的召回率是否都在0.85以上再回头去看整体准确率。4.3 验证集表现好不等于视频流里表现好先做对齐再做分类这个现象几乎每个做疲劳检测的团队都会遇到。数据集里的图片大多经过预处理人脸基本居中、正脸比例高而真实驾驶场景中驾驶员会侧头、低头、转头看后视镜人脸的尺度和角度差异很大。把分类器直接扔到全图上是一个常见错误。两万张分类数据集标注的对象是人脸或者人脸局部区域模型学到的是“这张脸处于疲劳状态”而不是“这个人在疲劳状态”。若摄像头画面里除了驾驶员还有副驾、窗外行人模型会把所有出现的人脸都判断一遍产生大量误报。我在项目里的做法是先用一个人脸检测器框出人脸区域再对裁切区域做疲劳分类。人脸检测可以用YOLOv8这类目标检测模型也可以用OpenCV的DNN人脸检测器。这样分类器只面对单个正脸区域输入分布与训练集更接近指标下降幅度会小很多。更严格的做法是做人脸对齐根据两只眼睛的坐标把图像旋转到双眼水平再缩放到统一尺寸。疲劳数据集中如果标注了眼睛位置哪怕只有一部分有也值得用来训练一个关键点模型如果没有就直接依赖人脸检测框不要额外增加复杂度。5. 疲劳与打哈欠分类数据集常见排雷五条踩坑记录与修复路径训练疲劳分类模型的过程中有几类问题反复出现。我把它们按“现象→原因→解决”写清楚方便你在复现时直接对照排查。5.1 训练准确率很高、验证准确率掉点增强不够而不是模型不对现象训练集top-1准确率到99%验证集只有82%且随epoch增加差距越拉越大。原因模型容量对两万张图来说偏大或者数据增强太弱。ResNet50在这种规模的数据上很容易记住训练集里的背景颜色、眼镜框、座位纹理等伪特征。解决先增强不是换模型。在transform_train里加入RandomRotation(10)和RandomAffine(0, translate(0.05, 0.05))模拟头部小幅转动。同时把RandomResizedCrop的scale下限从0.7降到0.5强制模型学习不同尺度的面部特征。若增强后验证集还是上不去才考虑从ResNet50退回ResNet18。5.2 打哈欠与低头、大笑互相混淆嘴部区域与面部姿态纠缠现象混淆矩阵显示“打哈欠”有15%被预测成“正常”“正常”里有8%被预测成“打哈欠”且错误样本集中在侧脸或低头角度。原因哈欠特征本质上是嘴部张开且保持一段时间这与大笑的嘴型相似。如果分类器只看到嘴巴张开程度这一局部特征自然分不清大笑和打哈欠。解决如果数据集里有连续帧信息可以做一个简单的时序特征——单帧分类结果不用连续3到5帧都判定为“yawn”才触发预警。如果只有单张图就把训练目标扩展为“打哈欠”与“大笑”同时作为独立类别训练让模型学会区分嘴角上扬和下巴下拉的差异。没有大笑样本时宁可把阈值调高到0.8以上也不要强行用0.5做二分类决策。5.3 “闭眼”类样本太少训练几轮都不收敛现象“eye_close”类召回率始终在0.6以下其他两类都正常。原因多数疲劳数据集中闭眼帧比哈欠帧更难采集因为驾驶员闭眼持续时间短标注人员也容易漏标。类别占比可能只有5%左右。解决先用4.1的加权采样器把采样权重拉平。然后单独对闭眼类做更强的光度增强比如加深对比度、随机调暗亮度让模型适应不同光照条件下的闭眼状态。仍然不够时去采集“眯眼”过渡状态的图像加入该类而不是人工裁剪几张闭眼图反复复制。眯眼到闭眼是一个连续状态模型需要看到中间过渡样本才能学会边界。5.4 图片通道顺序不一致cv2和Pillow的RGB翻车现场现象用opencv读取图像训练时准确率正常换用Pillow读取后验证集准确率突然掉到随机水平。原因cv2.imread默认返回BGR顺序PIL.Image.open返回RGB顺序。如果训练时用Pillow读取、推理时用opencv读取通道顺序不一致模型看到的颜色完全错位。图像分类数据集中一般不会明确标注这一点。解决全项目统一使用Pillow读取并在自定义Dataset里写死.convert(RGB)。若必须用opencv则在读取后手动执行cv2.cvtColor(img, cv2.COLOR_BGR2RGB)。把这条写进代码注释防止后来接手的人改坏。5.5 高分辨率图直接拉成224导致疲劳细节丢失现象模型在数据集上表现很好但用现场摄像头图像测试时眼睛区域细节模糊闭眼误判率上升。原因如果原图是1920x1080的驾驶室全景人脸可能只占300x300像素直接resize到224x224相当于把眼睛区域压成了不到20个像素的色块。此时网络根本看不到眼睑闭合的细节。解决先用人脸检测器框出人脸再把检测框适度外扩20%后裁切最后缩放到224。检测框的外扩很重要因为人脸检测框通常只包住脸的主体紧贴边缘会裁掉部分额头和下巴而疲劳判断需要看到完整的嘴部区域。裁切比例有讲究外扩太小丢信息外扩太大引入背景噪声。我常用1.2倍即框的宽高各放大20%在多数车内摄像头角度下表现最稳。6. 从分类模型到实时视频预警YOLOv8人脸框体与时序投票的衔接技巧6.1 人脸检测后裁切分类避免全图误判把分类模型接到视频流里时我不会直接对整帧图像做分类而是先用目标检测模型框出人脸区域再把裁切结果交给分类模型。这样可以规避前文说的尺度问题也减少车内其他物体对分类的干扰。以Ultralytics YOLOv8为例流程是from ultralytics import YOLO import cv2 face_detector YOLO(yolov8n-face.pt) classifier build_model(num_classes3) classifier.load_state_dict(torch.load(best_resnet18.pth, map_locationcpu)) frame cv2.imread(frame_from_camera.jpg) results face_detector(frame, conf0.4)[0] for box in results.boxes: x1, y1, x2, y2 [int(v) for v in box.xyxy[0]] face_crop frame[y1:y2, x1:x2] face_crop_rgb cv2.cvtColor(face_crop, cv2.COLOR_BGR2RGB) label classifier(face_crop_rgb) print(label)逻辑说明YOLOv8的conf0.4表示低于0.4的人脸框会被过滤避免远处的行人脸干扰。裁切后做BGR到RGB转换再送入用Pillow训练的模型。这里最容易犯的错是把face_crop直接送进分类器导致通道顺序错位。6.2 3秒滑动窗口连续N帧预测才算疲劳疲劳状态是一个持续过程人在打哈欠时通常会持续1到3秒。单帧预测的噪声很大眨眼瞬间容易被误判为闭眼。我习惯用滑动窗口做时序投票窗口大小触发规则适用场景3帧至少2帧预测为yawn算法对比测试15帧至少5帧预测为闭眼实验性部署30帧至少8帧预测为yawn车载真实预警窗口越长误报越少但延迟也越高。疲劳预警允许1到2秒延迟可以接受30帧窗口如果做实时交互提醒15帧窗口更合适。我保持的一个习惯是在部署后连续记录一周的帧级预测日志每天人工回看误报样本把误报图按月攒成增量数据集。半个月后你会发现模型在白天强光照下的误报和夜间红外画面下的误报完全不是同一类问题只有把这两类数据都补进训练集疲劳检测才能逐步逼近实用。这个做法没法靠一次训练到位但我认为它值得坚持希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号