人脸检测与表情识别协同优化实战
简介本资源是一个面向人工智能初学者与项目实践者的完整人脸检测与表情识别实战项目聚焦于提升检测精度与多任务协同能力。项目基于OpenCV与MTCNN双路检测方案重构替换原Haar级联低准确率模块新增detect_face.py实现高鲁棒性人脸定位并全面适配至video_emotion_gender_demo.py等主流程支持实时视频流中的人脸检测、表情分类FER2013数据集训练及可视化分析。压缩包共73个文件含35个HDF5模型权重涵盖emotion/gender/detection三类子模型、22个Python核心脚本含训练、推理、Grad-CAM可解释性分析及Docker部署支持、以及测试图像、演示GIF、技术报告PDF等配套材料整体大小76.05MB。目前已有274人学习下载提供从数据预处理、模型训练、多场景视频推理到热力图可视化的一站式代码结构目录分层清晰src/models/datasets/utils等便于理解工程逻辑与快速二次开发。1. 人脸检测加表情识别不是调两个模型拼起来就完事而是要让检测框稳、表情判准、时序不抖——适合做课程大作业、毕设原型或轻量级安防边缘部署的端到端实践路径“人脸检测加表情识别”这个标题看似平实但背后藏着一个常被低估的工程断层很多人用 MTCNN 检出脸再喂给 ResNet-50 分类七种表情结果在真实视频流里检测框来回跳、同一张脸连续三帧判出“愤怒→中性→惊讶”甚至侧脸45度时直接漏检误标“厌恶”。这不是模型不行而是没处理好检测与识别的耦合约束——检测框的尺度/偏移直接影响表情特征提取的鲁棒性而表情分类又反过来该指导检测器聚焦关键区域比如眉毛间距、嘴角曲率。本项目 ZIP 包本质是一套可落地的协同优化流水线它不追求 SOTA 指标但确保你在树莓派4B上跑通 15FPS 视频流在教室监控场景下对3米内学生面部实现“检测框抖动5像素、表情连续帧一致率92%”。适合人工智能专业本科生做课程大作业有完整 README 和数据标注规范也适合作为安防类毕业设计的视觉感知模块。你不需要从零训练大模型但必须亲手调参、改 pipeline、看 tensor shape 对齐——这才是“项目实践”的真实分量。2. 为什么选 MTCNN MobileNetV2 而不是 YOLOv8 ViT——从算力、标注成本与部署链路反推技术选型2.1 人脸检测MTCNN 的不可替代性在于“三阶段校准机制”YOLO 系列在通用目标检测中优势明显但人脸检测有其特殊性小尺度尤其远距离、高密度教室/会议室、强姿态变化低头写作业、抬头看黑板。MTCNN 的 P-Net/R-Net/O-Net 三级结构本质是用计算换精度的渐进式精修P-NetProposal Network在原图上滑窗生成粗略候选框约 12×12 小感受野快速过滤大量非人脸区域。它不追求准只求快筛。R-NetRefine Network将 P-Net 输出的候选框缩放至 24×24 输入回归更精确的 bounding box 坐标和人脸置信度。这一步剔除大量误检如窗帘褶皱、书包带。O-NetOutput Network最终将 R-Net 筛选后的框缩放至 48×48输出最终框坐标 5个关键点左眼、右眼、鼻尖、左嘴角、右嘴角。关键点是后续表情识别的锚点——我们不用它做对齐而是用它验证检测框是否“包含有效表情区域”。提示很多新手直接拿 YOLOv5s 检测人脸结果在侧脸场景下漏检率超40%。不是 YOLO 不行而是它缺乏 MTCNN 那种针对人脸几何先验的显式建模。MTCNN 在 WIDER FACE hard subset 上的 AP 是 86.2%YOLOv5s 是 79.1%见 ICCV 2021 表情检测 benchmark。2.2 表情识别MobileNetV2 的轻量与可解释性平衡七类表情愤怒、厌恶、恐惧、快乐、悲伤、惊讶、中性的区分核心依赖局部纹理眼角皱纹、嘴角拉伸而非全局语义。ViT 类模型虽在 ImageNet 上表现好但在小样本表情数据上极易过拟合且注意力热图难以解释“模型到底看了哪块区域”。MobileNetV2 的 inverted residual block 结构天然适合通道注意力弱化避免模型过度关注背景如白板、投影幕布专注面部 ROI深度可分离卷积参数量仅 ResNet-18 的 1/4推理延迟低树莓派4B 上单图 32ms特征图空间保留最后两层 feature map 尺寸为 7×7便于我们叠加轻量 spatial attention 模块后文详述。我们没用预训练的 ImageNet 权重直接微调而是采用FER-2013 数据集 自建课堂场景微调集含光照变化、戴眼镜、口罩遮挡进行两阶段训练。第一阶段冻结 backbone只训 classifier head第二阶段解冻最后两个 inverted residual block配合 label smoothing0.1防止过拟合。2.3 检测与识别的耦合设计ROI Align 关键点约束裁剪这是整个 pipeline 的核心创新点。传统做法是MTCNN 输出 bbox → 直接 crop → resize 到 224×224 → 输入表情网络。问题在于MTCNN 的 bbox 是 tight-fitting但表情识别需要上下文额头、下巴bbox 坐标是浮点数直接 crop 会引入插值误差导致关键纹理模糊。我们的做法是# 基于 MTCNN 输出的关键点动态扩展 ROI def get_expression_roi(img, landmarks, expand_ratio0.4): landmarks: [left_eye, right_eye, nose, left_mouth, right_mouth] (5,2) expand_ratio: 向上/下/左/右扩展 bbox 的比例基于眼睛间距 # 计算两眼中心与间距 eye_center np.mean(landmarks[:2], axis0) # (x,y) eye_dist np.linalg.norm(landmarks[0] - landmarks[1]) # 以眼中心为基准构建正方形 ROI half_side eye_dist * 1.8 # 覆盖额头到下巴 x1 max(0, int(eye_center[0] - half_side)) y1 max(0, int(eye_center[1] - half_side)) x2 min(img.shape[1], int(eye_center[0] half_side)) y2 min(img.shape[0], int(eye_center[1] half_side)) roi img[y1:y2, x1:x2] return cv2.resize(roi, (224, 224)) # 在推理 pipeline 中调用 detected_faces mtcnn.detect(img) # 返回 [bboxes, landmarks, scores] for bbox, lm, score in zip(*detected_faces): if score 0.9: continue # 过滤低置信度检测 roi get_expression_roi(img, lm) # 关键用关键点而非 bbox 定义 ROI pred expr_model.predict(roi[np.newaxis, ...]) # 表情预测这段代码的逻辑是放弃 bbox 的绝对坐标转而用关键点计算人脸几何中心与尺度再以此为中心裁剪固定比例 ROI。实测表明该方法在侧脸yaw 30°场景下表情识别准确率提升 11.3%且连续帧抖动降低 67%——因为关键点比 bbox 更稳定即使 bbox 抖动两眼相对位置变化极小。3. 本地环境搭建与 ZIP 包解压后必做的三件事验证数据流、检查模型兼容性、确认 OpenCV 后端3.1 解压后第一件事运行check_env.py验证基础依赖ZIP 包根目录下check_env.py是你的第一道防线。它不训练模型只做三件事检查 OpenCV 是否启用 CUDA若用 NVIDIA GPU验证 PyTorch 是否能调用 cuDNNtorch.backends.cudnn.enabled加载 MTCNN 的.pt权重并前向一次记录耗时。python check_env.py --device cuda:0预期输出[INFO] OpenCV backend: cuda (NVIDIA GeForce RTX 3060) [INFO] PyTorch cuDNN enabled: True [INFO] MTCNN warmup time: 42.3 ms (first run), 18.7 ms (cached) [SUCCESS] Environment ready for inference.注意如果 OpenCV 显示 backend 为dnn或opencv非cuda说明你安装的是 CPU 版 OpenCV。请卸载后重装pip install opencv-python-headless4.8.1.78此版本已验证支持 CUDA DNN 后端。不要用opencv-contrib-python它与 MTCNN 的 CUDA kernel 冲突。3.2 第二件事用demo_video.py跑通最小闭环不要急着改模型先用提供的demo_video.py测试端到端流程python demo_video.py \ --video_path ./data/test_video.mp4 \ --mtcnn_weights ./weights/mtcnn.pt \ --expr_weights ./weights/mobilenetv2_fer2013.pth \ --output_dir ./output/demo_result \ --conf_thresh 0.85 \ --iou_thresh 0.3参数说明--conf_thresh 0.85MTCNN 检测置信度阈值。低于此值的框直接丢弃教室场景下设 0.85 可过滤掉书本反光误检--iou_thresh 0.3相邻帧间 bbox 的 IOU 阈值。用于关联同一人脸的轨迹防止同一人被重复识别--output_dir输出带标注框和表情标签的视频帧.jpg及轨迹 CSV。成功标志./output/demo_result/下生成frame_001.jpg等文件且每张图上人脸框为绿色表情标签为黄色背景黑色文字如Happy:0.92。3.3 第三件事检查data/目录结构与标注格式ZIP 包中的data/是你的数据沙盒必须严格遵循以下结构data/ ├── images/ # 原始图像.jpg/.png ├── annotations/ # MTCNN 标注.txt每行x1 y1 x2 y2 score l1_x l1_y ... l5_y ├── fer2013_subset/ # 表情微调子集train/val/test按 FER-2013 格式组织 └── classroom/ # 自建课堂数据含光照/遮挡/姿态变化重点检查annotations/下的.txt文件格式。每一行必须是空格分隔的 15 个数字x1 y1 x2 y2 score l1_x l1_y l2_x l2_y l3_x l3_y l4_x l4_y l5_x l5_y其中(x1,y1)是 bbox 左上角(x2,y2)是右下角score是检测置信度后 10 个是 5 个关键点坐标。提示如果你用自己的数据千万别用 LabelImg 标注 bbox 后手动填关键点必须用 MTCNN 在原始图上批量推理生成annotations/。脚本tools/generate_annotations.py已内置只需修改--input_dir和--output_dir即可。4. 避坑指南人脸检测加表情识别项目里最常翻车的 4 个硬核问题4.1 现象MTCNN 检测框在视频中剧烈抖动同一张脸连续帧 bbox 坐标跳变超 20 像素原因MTCNN 的 P-Net 输出是密集 anchor未做 NMS 后处理且 O-Net 的 bbox 回归对输入 resize 尺度敏感。当视频帧分辨率不一致如手机拍摄自动缩放resize 插值会放大坐标误差。解决在mtcnn.py的detect()函数末尾强制添加bbox 平滑滤波# 在 detect() 返回前插入 if len(bboxes) 0: # 使用卡尔曼滤波平滑 bbox简化版指数加权移动平均 self.bbox_history.append(bboxes[0]) # 存储最新 bbox if len(self.bbox_history) 5: self.bbox_history.pop(0) smoothed np.mean(self.bbox_history, axis0) # 对 5 帧取均值 bboxes[0] smoothed.astype(int)并在__init__中初始化self.bbox_history []。实测抖动降低 82%。4.2 现象表情识别在戴眼镜/口罩时准确率暴跌尤其“厌恶”和“愤怒”混淆率达 65%原因MobileNetV2 的 global average pooling 层丢失了局部纹理的空间关系。眼镜反光、口罩遮挡使模型被迫依赖额头/脸颊纹理而这部分在 FER-2013 中极少出现。解决在 classifier head 前插入spatial attention moduleSAM强制模型聚焦眼部与嘴部区域class SAM(nn.Module): def __init__(self, channels): super().__init__() self.conv1 nn.Conv2d(channels, 1, kernel_size7, padding3) self.sigmoid nn.Sigmoid() def forward(self, x): att self.sigmoid(self.conv1(x)) # [B,1,H,W] return x * att x # 残差连接 # 在 model.py 中插入 self.sam SAM(1280) # MobileNetV2 last layer out_channels1280 x self.features(x) x self.sam(x) # ← 新增行 x self.avgpool(x) x torch.flatten(x, 1) x self.classifier(x)训练时该模块使“厌恶/愤怒”混淆率降至 23%。4.3 现象树莓派4B 上推理卡顿CPU 占用 100%GPU 利用率始终为 0原因PyTorch 默认使用libtorchCPU 后端未启用 ARM NEON 加速且 OpenCV 的 DNN 模块未编译 CUDA 支持。解决重装 PyTorch ARM 版pip3 install torch-1.13.1cpu torchvision-0.14.1cpu -f https://download.pytorch.org/whl/torch_stable.html编译 OpenCV 4.8.1 源码CMake 时开启-D CMAKE_BUILD_TYPERELEASE -D CMAKE_INSTALL_PREFIX/usr/local -D OPENCV_DNN_CUDAON -D CUDA_ARCH_BIN5.3 6.2 7.2在demo_video.py中显式指定后端cv2.dnn.DNN_BACKEND_CUDA和cv2.dnn.DNN_TARGET_CUDA。4.4 现象训练时 loss 降不下去val accuracy 停滞在 45% 左右原因FER-2013 数据集存在严重类别不平衡“中性”占 54%“恐惧”仅 3%且课堂微调集未做光照归一化。解决在data_loader.py中对每个 batch 应用class-balanced sampling# weights[i] 1 / class_count[label[i]] sampler WeightedRandomSampler(weights, num_sampleslen(dataset), replacementTrue) train_loader DataLoader(dataset, batch_size32, samplersampler)添加CLAHE对比度受限自适应直方图均衡化到训练 augmenttransform_train transforms.Compose([ transforms.Grayscale(), # FER-2013 是灰度图 transforms.Lambda(lambda x: cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)).apply(np.array(x))), transforms.ToTensor(), ])5. 进阶技巧如何用 30 行代码把表情识别做成“可解释的决策”——可视化注意力热图与关键点漂移分析5.1 用 Grad-CAM 生成表情决策热图告诉用户“模型为什么说这是愤怒”Grad-CAM 的核心是用最后一层卷积的梯度加权激活图。我们不重写整个流程而是复用torchcam库已打包进 ZIP 的requirements.txtfrom torchcam.methods import GradCAM from torchcam.utils import overlay_mask from PIL import Image # 加载模型确保 model.eval() cam_extractor GradCAM(model, input_shape(1, 3, 224, 224), archmobilenet_v2) # 对单张 ROI 图像推理 img_tensor transforms.ToTensor()(roi).unsqueeze(0).to(device) # [1,3,224,224] out model(img_tensor) pred_class out.argmax().item() # 生成热图 activation_map cam_extractor(pred_class, out) # 叠加热图到原图 result overlay_mask( Image.fromarray(cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)), Image.fromarray(activation_map[0].numpy()), alpha0.5 ) result.save(f./output/gradcam_{pred_class}.jpg)效果生成的gradcam_0.jpg0愤怒中红色高亮区域集中在眉间竖纹和嘴角下拉处——这正是临床心理学定义的愤怒微表情特征。这不是玄学是可验证的决策依据。5.2 关键点漂移分析量化表情变化的生理合理性单纯看分类标签不够我们要验证“表情变化是否符合人脸生物力学”。例如从“中性”到“惊讶”眉毛应上提、眼睛应睁大。我们用 MTCNN 输出的关键点计算关键点位移向量表情转换关键点对期望位移方向实测位移角度度合理性中性→惊讶左眼→左眉向上-Y-87°✅中性→悲伤嘴角→鼻尖向下Y12°⚠️需结合嘴角曲率快乐→愤怒左嘴角→右嘴角水平收缩-X-5°❌应为 -30°提示检测框偏移脚本tools/analyze_landmark_drift.py自动计算并输出 CSV。当某次转换的位移角度偏离期望 25°系统标记该帧为“可疑表情”触发人工复核——这在教育场景中至关重要避免误判学生“愤怒”而引发误会。5.3 一个血泪经验永远保存原始帧时间戳别信cv2.VideoCapture.get(cv2.CAP_PROP_POS_MSEC)在demo_video.py中我曾用 OpenCV 的CAP_PROP_POS_MSEC获取帧时间戳结果发现当视频编码为 H.264 时该属性返回的是解码时间非显示时间在树莓派上因解码延迟波动同一帧的时间戳相差 ±120ms。正确做法用cv2.CAP_PROP_POS_FRAMES获取帧序号再乘以1000/fps得到理论时间戳并用time.time()记录每帧处理完成的实际时间。最终生成的trajectory.csv包含三列frame_id, timestamp_ms, expr_label这样当你回溯“第 1273 帧为何判为恐惧”就能精准定位原始视频时间点而不是在模糊的“大约 23 秒”里大海捞针。我带过三届人工智能课程设计学生最常卡在“为什么我的结果和 demo 不一样”。后来我发现90% 的问题出在没校准时间戳——模型可以调但时间轴错位整个时序分析就崩了。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

做短视频口播、店铺喊话还在花钱买配音?这个免费工具填词就能出带背景乐的成品

做短视频口播、店铺喊话还在花钱买配音?这个免费工具填词就能出带背景乐的成品

你是不是也遇到过 拍了个店铺促销视频,缺一条"像广告"的旁白;想给门店、电梯屏、小程序加一段开屏欢迎语;朋友圈小视频想配个口播,自己录又放不开。 常规做法要么找配音员,要么开 AI 配音软件的会员。一句话…

2026/10/11 9:48:50 阅读更多 →
每日ArXiv CV论文追踪:自动化抓取与邮件推送实战

每日ArXiv CV论文追踪:自动化抓取与邮件推送实战

1. 为什么我要做这个每日ArXiv CV论文追踪项目做计算机视觉方向的研究或者工程落地,最怕的一件事不是代码写不出来,而是你辛辛苦苦调了三个月的模型,某天刷到一篇三个月前的论文,发现人家早就把你想解决的问题用更优雅的方式做完了…

2026/10/11 9:48:50 阅读更多 →
《信号与系统:基于MATLAB的方法》全套PPT课件2026

《信号与系统:基于MATLAB的方法》全套PPT课件2026

《信号与系统:基于MATLAB的方法》全套PPT课件2026 课件内容: 第0章-绪论.ppt 第1章-连续时间信号.ppt 第2章-连续时间系统的时域分析.ppt 第3章-傅里叶级数与傅里叶变换.ppt 第4章-拉普拉斯变换和拉普拉斯分析.ppt 第5章-傅里叶应用和拉普拉斯分析的应用…

2026/10/11 9:48:50 阅读更多 →

最新新闻

LSTM时间序列预测实战:从完整数据到多步输出避坑指南

LSTM时间序列预测实战:从完整数据到多步输出避坑指南

简介:这份资源面向具备一定Python与深度学习基础、希望上手时间序列预测的开发者与数据科学学习者,围绕LSTM这一擅长捕捉长期依赖的循环神经网络,提供一套可运行的代码预测实践方案。压缩包共4个文件,以2个py脚本和2个csv数据表为…

2026/10/11 10:38:16 阅读更多 →
环境装不好怎么办?applypilot doctor 一键诊断你的自动求职配置(附排查清单)

环境装不好怎么办?applypilot doctor 一键诊断你的自动求职配置(附排查清单)

【免费下载链接】ApplyPilot AI agent that applies to jobs for you. Any site. Any form. 项目地址: https://gitcode.com/gh_mirrors/ap/ApplyPilot 点击查看 免费下载 ApplyPilot 是一个自动求职 AI Agent:它自动抓取职位、用 AI 给岗位打分、按岗位…

2026/10/11 10:38:16 阅读更多 →
CASS11报虚拟机提示?关掉Hyper-V、内存完整性和BIOS虚拟化全攻略

CASS11报虚拟机提示?关掉Hyper-V、内存完整性和BIOS虚拟化全攻略

简介:CASS11安装与运行中常出现“请不要在虚拟机中运行此程序”的报错提示,这份PDF文档正是针对该问题整理的工具型故障排查手册,适合CAD与CASS11使用者、GIS相关从业人员及测绘专业技术人员参考。资源为一份PDF文档,共1个文件&am…

2026/10/11 10:38:16 阅读更多 →
从快速迭代到复杂仓库:Codex Astra Luna Orchestrator的3套推理强度与Service Tier调优方案

从快速迭代到复杂仓库:Codex Astra Luna Orchestrator的3套推理强度与Service Tier调优方案

【免费下载链接】codex-astra-luna-orchestrator Use Astra or Sol as orchestrator and Luna for subagents in Codex 项目地址: https://gitcode.com/gh_mirrors/co/codex-astra-luna-orchestrator 点击查看 免费下载 Codex Astra Luna Orchestrator 是一个为 Co…

2026/10/11 10:38:16 阅读更多 →
慎独即涌痕事态——自感的自行感发与自身承受

慎独即涌痕事态——自感的自行感发与自身承受

慎独即涌痕事态——自感的自行感发与自身承受摘要: 慎独的传统解释停留在工夫论层面——无论训为“慎其闲居”还是“慎其独知”,都预设了一个“谁在慎”的主体。本文以涌痕事态论为判读视域,将慎独从工夫论层面提升到事态论层面,提…

2026/10/11 10:38:16 阅读更多 →
AI Coding终端失控?cmux会话编排层统一管理Agent与浏览器

AI Coding终端失控?cmux会话编排层统一管理Agent与浏览器

AI Coding一开就是几十个终端,这不只是乱的问题,是根本管不过来的问题。写代码的时候,右边跑着Agent在改文件,左边是LSP日志,中间还挂着前端开发服务器,底下再来几层测试输出,屏幕上密密麻麻全是…

2026/10/11 10:37:15 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →