基于Python卷积神经网络的人脸识别驾驶员疲劳检测与预警系统实战
简介这份毕业设计资源面向计算机相关专业学生与Python初学者提供一套基于卷积神经网络的人脸识别驾驶员疲劳检测与预警系统完整源码可用于课程设计、毕设答辩或深度学习入门实践。压缩包共15个文件约2.8MB包含3个py主程序脚本、1个ui界面文件、1个whl离线安装包、4个xml工程配置、2个txt依赖与说明文档以及md说明、png需求图等辅助材料覆盖从界面搭建到模型调用的主要环节。资源中附带dlib离线安装包与requirements依赖清单便于在Python 3.6环境下快速还原运行环境main.py与main_ui.py分工明确配合README可理清项目结构与调用逻辑。目前已有364人学习下载适合需要参考疲劳检测实现思路、人脸识别工程组织方式或直接复用界面与检测流程的读者也可作为二次开发与功能扩展的基础模板。1. 从一张答辩现场照片说起这套疲劳检测系统到底在做什么答辩季我帮人看过不少毕设演示最尴尬的一幕是摄像头对着脸PPT 上写着疲劳检测准确率 98%结果演示者打了个哈欠界面纹丝不动。问题不在模型在于整条链路没打通——人脸没框准、眼睛开合度算错、报警阈值拍脑袋定的。这套「基于 Python 卷积神经网络的人脸识别驾驶员疲劳检测与预警系统」本质就是把三件事串成一条流水线先用 OpenCV 加人脸检测把人脸抠出来再用一个轻量 CNN 判断眼睛和嘴巴的状态最后按连续帧的闭眼/打哈欠时长触发预警。它适合两类人一是做毕设、需要一套能跑通、能讲清原理、能现场演示的学生二是想入门计算机视觉落地、拿一个完整小项目练手的 Python 开发者。下面我按自己搭这套东西的顺序把选型、代码、参数和翻车点全摊开讲。2. 疲劳检测的技术选型为什么是 CNN 而不是传统特征2.1 三种主流路线的取舍做疲劳检测业内常见三条路。第一条是传统图像特征法用 Haar 级联检测人脸再定位眼睛区域算眼睛纵横比EAR和嘴巴纵横比MAR阈值判断。优点是快、代码短、CPU 就能跑缺点是光照一变、戴眼镜、侧脸就崩阈值还得手动调玄学得很。第二条是 CNN 分类法把人脸或眼睛区域裁出来喂给卷积神经网络做睁眼/闭眼张嘴/闭嘴二分类鲁棒性明显好于纯几何特征。第三条是端到端回归直接输入整帧输出疲劳分数精度高但需要大量标注数据毕设体量扛不住。我一般推荐 CNN 分类法理由很实在数据好造睁眼闭眼各拍几百张就行模型小几万参数就能到 95% 以上训练在普通笔记本上十几分钟能跑完答辩时还能画出卷积神经网络结构图讲清楚每一层在干嘛。标题里点名的卷积神经网络和人脸识别落点就在这条路上。2.2 整体流水线的四个环节整条链路拆开是四步。第一步人脸检测用 OpenCV 自带的 Haar 或 DNN 人脸检测器把画面里的人脸框出来。第二步关键区域裁剪按人脸框的比例切出左右眼和嘴巴三个小图。第三步 CNN 推理三个小图分别过网络输出睁闭眼、张闭嘴的概率。第四步时序判断与预警维护一个滑动窗口统计最近若干帧里闭眼和打哈欠的占比超过阈值就报警。这里有个容易被忽略的点单帧判断一定会抖。某一帧刚好眨眼到一半模型可能判成闭眼如果直接报警就是误报。所以第四步的时序平滑才是决定这套系统像不像样的关键很多毕设翻车就翻在这。2.3 环境搭建与依赖安装先把环境弄干净。我习惯用 Python 3.8 到 3.10 之间的版本太新的版本有些库轮子还没跟上。建虚拟环境装核心依赖# 创建并激活虚拟环境Windows 用 venv\Scripts\activate python -m venv drowsy_env source drowsy_env/bin/activate # 安装核心依赖版本区间是实测比较稳的组合 pip install opencv-python4.8.1.78 # 图像采集与人脸检测 pip install numpy1.24.3 # 矩阵运算 pip install torch2.0.1 torchvision0.15.2 # CNN 训练与推理 pip install pygame2.5.0 # 报警音播放装完先验证 OpenCV 能不能调起摄像头这一步不过后面全白搭import cv2 # 0 表示默认摄像头笔记本外接摄像头可能要改成 1 cap cv2.VideoCapture(0) if not cap.isOpened(): raise RuntimeError(摄像头打不开检查是否被其他程序占用) while True: ok, frame cap.read() if not ok: break cv2.imshow(preview, frame) # 按 q 退出避免死循环关不掉 if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()这段代码的逻辑很直白打开摄像头逐帧读取并显示按 q 退出。参数上VideoCapture(0)里的数字是设备索引如果画面是黑的或者报错先换 1 试试再检查系统隐私设置里摄像头权限有没有开。waitKey(1)里的 1 是毫秒值越小画面越流畅但 CPU 占用越高一般 1 到 30 之间调。提示如果pip install torch卡住或下载慢先确认是不是网络问题别急着换源乱装装错版本后面报的错会非常难查。3. 人脸检测与眼睛嘴巴区域裁剪的实操3.1 用 Haar 还是 DNN 检测器OpenCV 提供两种现成人脸检测方案。Haar 级联是经典方案haarcascade_frontalface_default.xml这个文件随 OpenCV 一起装好调用简单CPU 上也能跑到实时。DNN 检测器精度更高尤其是侧脸和小脸但要多下一个模型文件速度稍慢。毕设场景我建议先用 Haar 跑通因为它零额外依赖答辩电脑上不会因为缺文件翻车。等主流程稳了再考虑换 DNN 提精度。人脸检测的调用长这样import cv2 # 加载 OpenCV 自带的人脸级联检测器 face_cascade cv2.CascadeClassifier( cv2.data.haarcascades haarcascade_frontalface_default.xml ) def detect_faces(frame): # 转灰度能显著提速检测本身不需要颜色信息 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # scaleFactor 控制金字塔缩放步长minNeighbors 控制误检抑制 faces face_cascade.detectMultiScale( gray, scaleFactor1.1, minNeighbors5, minSize(80, 80) ) return facesscaleFactor1.1表示每次图像缩小 10% 再找值越小越慢但越不容易漏minNeighbors5是每个候选框周围要多少个邻居才确认调大能压误检但可能漏脸minSize过滤掉太小的框避免把远处杂物当脸。3.2 按比例裁剪眼睛和嘴巴区域拿到人脸框(x, y, w, h)后眼睛和嘴巴的位置可以用经验比例切。左眼大致在x 0.15w到x 0.45w纵向在y 0.2h到y 0.45h右眼对称嘴巴在x 0.25w到x 0.75w纵向y 0.6h到y 0.9h。这套比例不是死的跟人脸检测框的松紧有关实际调的时候对着自己的脸微调。def crop_regions(frame, face): x, y, w, h face # 按经验比例切出三个区域注意边界不能越界 left_eye frame[int(y0.2*h):int(y0.45*h), int(x0.15*w):int(x0.45*w)] right_eye frame[int(y0.2*h):int(y0.45*h), int(x0.55*w):int(x0.85*w)] mouth frame[int(y0.6*h):int(y0.9*h), int(x0.25*w):int(x0.75*w)] return left_eye, right_eye, mouth裁剪完统一缩到24x24或32x32再送进网络尺寸一致才好批量训练。这里有个血泪经验裁剪区域如果切到了眉毛或者鼻梁模型会把眉毛动作误判成闭眼所以纵向起点别太靠上。3.3 数据采集与标注的省事做法训练数据不用去下公开数据集自己拍最快。写个小脚本按空格键保存当前帧的眼睛和嘴巴小图分文件夹存成open、closed、yawn、normal四类。每类拍 300 到 500 张换几个人、换几个光照条件拍泛化性会好很多。import cv2, os # 四个类别对应睁眼、闭眼、打哈欠、正常闭嘴 label closed save_dir fdataset/{label} os.makedirs(save_dir, exist_okTrue) cap cv2.VideoCapture(0) count 0 while True: ok, frame cap.read() if not ok: break cv2.imshow(capture, frame) key cv2.waitKey(1) 0xFF if key ord( ): # 空格保存当前帧 cv2.imwrite(f{save_dir}/{count}.jpg, frame) count 1 elif key ord(q): break cap.release() cv2.destroyAllWindows()采集时注意闭眼样本要包含半闭的过渡状态不然模型遇到眯眼会犹豫打哈欠样本要真的张嘴别用微笑凑数。数据质量直接决定上限这一步偷懒后面调参调到怀疑人生。4. 卷积神经网络建模与训练的关键参数4.1 一个够用的轻量 CNN 结构毕设不需要 ResNet 那种大网络一个三四层的 CNN 足够。输入32x32灰度图两层卷积加池化再接全连接输出类别。结构大致是卷积(32 通道) → 池化 → 卷积(64 通道) → 池化 → 展平 → 全连接(128) → 输出。参数量几万训练快答辩时画结构图也清爽。import torch import torch.nn as nn class EyeMouthCNN(nn.Module): def __init__(self, num_classes2): super().__init__() self.features nn.Sequential( # 第一层卷积1 通道灰度输入输出 32 通道3x3 卷积核 nn.Conv2d(1, 32, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), # 32x32 - 16x16 nn.Conv2d(32, 64, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), # 16x16 - 8x8 ) self.classifier nn.Sequential( nn.Flatten(), nn.Linear(64 * 8 * 8, 128), nn.ReLU(), nn.Dropout(0.5), # 防过拟合训练时随机丢一半 nn.Linear(128, num_classes) ) def forward(self, x): return self.classifier(self.features(x))padding1保证卷积后尺寸不变MaxPool2d(2)每次把长宽减半。Dropout(0.5)在小数据集上很关键能明显压住过拟合。num_classes按任务设眼睛任务设 2睁/闭嘴巴任务设 2张/闭。4.2 训练循环与必调参数训练用交叉熵损失加 Adam 优化器这是最省心的组合。批大小 32学习率 1e-3跑 20 到 30 个 epoch 基本收敛。from torch.utils.data import DataLoader from torchvision import datasets, transforms # 统一转灰度并缩到 32x32和推理时保持一致 transform transforms.Compose([ transforms.Grayscale(), transforms.Resize((32, 32)), transforms.ToTensor(), ]) train_set datasets.ImageFolder(dataset/train, transformtransform) train_loader DataLoader(train_set, batch_size32, shuffleTrue) model EyeMouthCNN(num_classeslen(train_set.classes)) criterion nn.CrossEntropyLoss() optimizer torch.optim.Adam(model.parameters(), lr1e-3) for epoch in range(25): model.train() total_loss 0 for imgs, labels in train_loader: optimizer.zero_grad() out model(imgs) loss criterion(out, labels) loss.backward() optimizer.step() total_loss loss.item() print(fepoch {epoch}, loss {total_loss/len(train_loader):.4f}) torch.save(model.state_dict(), eye_mouth_cnn.pth)几个参数的作用batch_size32是显存和稳定性的折中太小梯度抖太大收敛慢lr1e-3是 Adam 的常用起点如果 loss 震荡就降到 1e-4epoch看验证集验证 loss 开始上升就停别硬跑。训练完把权重存下来推理时加载。4.3 训练结果的判断标准别只看训练准确率那玩意能到 99% 但没意义。要划出验证集看验证准确率和混淆矩阵。眼睛分类验证准确率能到 95% 以上、闭眼召回率不低于 90%就算合格。如果闭眼总被漏判说明闭眼样本不够或者太单一回去补数据比调网络管用。5. 避坑与排查这套系统最容易翻车的五个地方5.1 摄像头画面卡顿、延迟越来越高现象跑几分钟后画面越来越卡内存占用一路涨。原因每帧都新建了图像对象或者把大图存进了列表没释放。解决确保循环里不累积帧imshow后及时waitKey需要保存的帧单独处理完就丢。另外把推理放到独立线程别和采集抢主线程。5.2 明明睁着眼却报警现象演示时正常睁眼系统频繁报疲劳。原因单帧误判加没有时序平滑或者裁剪区域偏了把眉毛当眼睛。解决加滑动窗口比如最近 30 帧里闭眼占比超过 60% 才报警同时打印裁剪出的小图看一眼确认切的是眼睛不是眉毛。5.3 换个人或换个光照就失灵现象自己测很准换同学来测就乱报。原因训练数据太单一就一个人一个场景。解决采集时至少找 3 个人、2 种光照戴眼镜和不戴眼镜都要有。数据多样性是泛化性的唯一来源没有捷径。5.4 报警音不响或报错现象触发预警但没声音或者pygame报设备错误。原因音频文件路径不对或者系统没有可用音频输出设备。解决用绝对路径加载音频先单独写个最小脚本测pygame.mixer能不能出声确认没问题再集成进主流程。5.5 打包成 exe 后跑不起来现象源码能跑打包后闪退。原因模型权重文件和音频文件没被打进去或者 OpenCV 的级联文件路径变了。解决用--add-data把.pth、.xml、音频一起打包代码里用sys._MEIPASS处理资源路径。这一步坑最多建议留到最后再做。6. 让预警更靠谱时序平滑与阈值调优的实战技巧单帧模型再准直接拿来报警也会抖。真正让这套系统能用的是最后一层的时序逻辑。我的做法是维护两个计数器闭眼计数和打哈欠计数各自配一个滑动窗口。具体实现上用一个长度为 30 的队列存最近 30 帧的眼睛状态0 睁 1 闭每帧更新。当队列里 1 的比例超过 0.6判定为持续闭眼触发一级预警嘴巴状态同理张嘴比例超过 0.5 判定为打哈欠触发二级预警。两个都触发就升级为重度疲劳。这样处理之后正常眨眼通常 2 到 3 帧根本不会触发误报率断崖式下降。阈值怎么定别拍脑袋。录一段自己正常工作的视频和一段故意打哈欠的视频分别跑一遍统计闭眼比例和哈欠比例的分布取两者中间偏保守的值。我实测下来闭眼比例阈值 0.6、哈欠比例阈值 0.5 是个不错的起点但每个人眨眼频率不同最好留个配置文件让用户能调。from collections import deque # 两个滑动窗口分别记录眼睛和嘴巴状态 eye_window deque(maxlen30) mouth_window deque(maxlen30) def check_fatigue(eye_closed, mouth_open): eye_window.append(1 if eye_closed else 0) mouth_window.append(1 if mouth_open else 0) eye_ratio sum(eye_window) / len(eye_window) mouth_ratio sum(mouth_window) / len(mouth_window) # 两个条件都满足才算重度疲劳避免单一指标误报 if eye_ratio 0.6 and mouth_ratio 0.5: return 重度疲劳 elif eye_ratio 0.6: return 疑似疲劳 return 正常maxlen30决定窗口长度按 30fps 算大约对应 1 秒太长反应迟钝太短又压不住抖动1 秒左右比较合适。这套逻辑的好处是可解释答辩时你能清楚说出为什么这一帧报警而不是模型说的。还有个进阶技巧把眼睛和嘴巴两个 CNN 的输出概率也纳入判断不只看硬分类结果。比如闭眼概率连续多帧高于 0.8 才算数比单纯看分类标签更稳。另外预警方式别只用声音加个界面边框变红、文字提示演示效果会好很多。我踩过的最大坑是早期只用一个固定阈值结果自己测完美换人演示就翻车后来改成可配置加双指标才真正稳下来。做这类系统模型只是上半场时序逻辑和阈值调优才是决定成败的下半场。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

职校管理总是“差点意思“,学工管理系统升级到底能不能破解这些痛点?

职校管理总是“差点意思“,学工管理系统升级到底能不能破解这些痛点?

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

2026/10/5 2:53:47 阅读更多 →
D3DCompiler_47.dll丢失怎么办?从DirectX修复到系统文件扫描全攻略

D3DCompiler_47.dll丢失怎么办?从DirectX修复到系统文件扫描全攻略

很多朋友应该都遇到过这个报错:双击某个游戏或者软件,结果系统弹窗提示“由于找不到 D3DCompiler_47.dll,无法继续执行代码”,甚至有时候打开某些设计类工具也会这样。第一次见这个提示的人多半会慌,以为是电脑中病毒了…

2026/10/5 2:53:47 阅读更多 →
D3DCompiler_47.dll丢失怎么办?从原理到实操完整修复指南

D3DCompiler_47.dll丢失怎么办?从原理到实操完整修复指南

我最近连续接到好几个朋友求助,全是同一个报错:玩游戏或者打开某个设计软件的时候,系统突然弹窗,说找不到 D3DCompiler_47.dll,程序直接闪退。这个 dll 文件对于不熟悉系统底层的人来说可能很陌生,但它其实…

2026/10/5 2:53:47 阅读更多 →

最新新闻

AI应用必答题:context-mode上下文管理实战与调优

AI应用必答题:context-mode上下文管理实战与调优

最近有个词在 AI 应用开发圈子里越聊越热——context-mode。如果你也在做 Chatbot、智能体或者 AI 工作流,大概率已经遇到同一类问题:对话一长,模型就开始"失忆",回着回着就把用户几分钟前说过的话忘得一干二净&#xf…

2026/10/5 3:37:10 阅读更多 →
Apache Hive实战:从SQL到离线数据仓库,大数据分析核心指南

Apache Hive实战:从SQL到离线数据仓库,大数据分析核心指南

1. 为什么大数据仓库会选中Apache Hive1.1 问题起点:MapReduce的门槛很多人第一次接触Apache Hive,其实是带着一个很现实的困惑过来的:既然已经能用Hadoop存海量数据,也有MapReduce这种计算框架了,为什么还要多此一举&…

2026/10/5 3:37:09 阅读更多 →
Oracle迁移瀚高数据库:rownum替换方案与分页改写全攻略

Oracle迁移瀚高数据库:rownum替换方案与分页改写全攻略

直接说结论:把Oracle迁到瀚高,最让人头大的就是rownum。这玩意儿在Oracle里写得太顺手了,一到瀚高环境里,SQL报错都不带商量的。市面上讲Oracle分页的帖子一大把,讲瀚高方言的也不少,但专门围绕“rownum怎么…

2026/10/5 3:37:09 阅读更多 →
634张猪只检测数据集:双格式标注下的YOLO微调训练全指南

634张猪只检测数据集:双格式标注下的YOLO微调训练全指南

简介:面向猪只检测与计算机视觉训练应用,这份数据集收录约六百三十四张猪只图片,并为每张图片同时提供VOC格式的xml标注和YOLO格式的txt标注,类别统一为猪。数据用labelImg标注,遵循目标边界准确、目标尽量全标、多人标…

2026/10/5 3:37:09 阅读更多 →
AI应用上下文管理:context-mode三种实现模式与实战避坑

AI应用上下文管理:context-mode三种实现模式与实战避坑

1. 拆解"context-mode":为什么上下文管理才是AI应用的隐形命门做AI应用开发的朋友,对"context-mode"这个词肯定不会陌生。但说实话,我见过太多人把上下文管理当成一个简单的"窗口长度"问题——模型支持8K、32K…

2026/10/5 3:37:09 阅读更多 →
Makefile核心语法与高效构建实战:从零手写到报错排查

Makefile核心语法与高效构建实战:从零手写到报错排查

如果你写过由多个源文件组成的C/C项目,一定不会对Makefile感到陌生。这东西乍看就是一堆“目标: 依赖”和缩进命令,可一旦写得不对,光是“make: *** 没有指明目标并且找不到makefile”这一个报错,就能卡住新手半小时。Makefile核心…

2026/10/5 3:36:09 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →