轻量级偶像内容协同管理框架:人脸聚类与多平台动态采集
简介这是一套面向C#开发者与社交平台数据管理爱好者的技术实践源码聚焦SNH48系偶像动态监听与图片自动化归档场景。系统基于C#多语言框架构建集成微博、口袋48、B站等主流平台的实时监听能力并通过QQ机器人推送新动态内置人脸识别与图像相似度比对模块支持本地存储或自动上传至阿里云盘显著提升偶像图片采集与管理效率。资源包共76个文件含26个核心C#业务逻辑文件如ParkerBot.cs、WeiboHelper.cs、AliYunHelper.cs、8个TypeScript前端交互文件、4个Vue组件及配套HTML/CSS/JSON配置另有PNG图标、SQL数据库脚本、Markdown说明文档与项目构建文件.sln/.csproj整体压缩包仅20.58MB结构清晰、模块解耦良好。目前已有434人学习下载提供完整可运行工程、跨平台监听适配方案、云存储对接示例及多源图片处理流程是学习C#桌面应用开发、社交API集成与AI辅助图像管理的优质实践样本。1. 这不是爬虫工具而是一套可交付的偶像内容协同管理方案你有没有遇到过这样的场景一个粉丝群每天要人工翻几十页微博、口袋48、B站动态截图、去重、打标、存图、发通知重复操作占掉3小时更糟的是换了个新成员发图旧图库立刻失效——因为没人统一管“这张图到底是谁、在哪天、什么场合拍的”。这不是效率问题是数据资产失控。本方案不叫“监听工具”它是一套面向SNH48系粉丝组织落地的轻量级内容协同管理框架用C#做核心调度与本地处理VueTypeScript做前端交互支持多平台动态捕获、人脸聚类归档、阿里云盘自动同步、QQ机器人精准推送。它不追求全网抓取而是聚焦“已知ID可信来源”的小范围高价值内容流不依赖黑盒API所有监听逻辑封装在可调试的C#插件中图片管理不是简单存文件夹而是带时间戳、来源平台、人物ID、相似度分组的结构化资产。适合课程设计答辩、毕设中期演示、小型粉丝站技术支撑——代码即文档模块即功能部署即可用。2. 总体架构设计三层解耦结构与五个核心插件的职责划分本系统采用明确分层的三层架构数据采集层PluginServer→ 业务处理层ParkerBot→ 展示交互层parkerCilent。三层之间通过约定JSON Schema通信无直接引用可独立编译、热替换、单独压测。这种设计不是为炫技而是解决实际协作痛点某高校课程设计小组曾因前端改UI导致后端监听逻辑崩溃最后发现是Vue组件里误删了platform_id字段而C#端没做字段校验——这次我们强制所有跨层数据走Entity.cs定义的强类型契约。2.1 数据采集层PluginServer 的插件化监听机制PluginServer是一个独立运行的.NET 6控制台项目核心是PluginHelper.cs中的插件生命周期管理器。它不硬编码任何平台逻辑而是通过反射加载bin/Plugins/下的DLL如WeiboHelper.dll、XhsHelper.dll每个DLL必须实现IPlatformListener接口public interface IPlatformListener { string PlatformId { get; } // weibo, koudai48, bilibili TaskListRawPost FetchNewPostsAsync(DateTime lastSyncTime); Taskbool ValidateConfigAsync(Dictionarystring, string config); }提示FetchNewPostsAsync返回的RawPost必须包含PostId,PublishTime,AuthorId,ImageUrlList,ContentText五个必填字段。这是后续所有模块的输入基准缺一不可。为什么不用单体爬虫因为不同平台反爬策略差异极大微博需模拟登录Referer校验口袋48走WebSocket长连接B站则依赖buvid3SESSDATA双token。把它们揉进一个HttpClient里等于把所有定时任务绑在同一根绳上——一个平台接口抖动整个监听就停摆。插件化后PluginServer主进程只负责心跳检测、日志聚合、失败重试默认3次间隔30秒各插件失败互不影响。2.2 业务处理层ParkerBot 的状态驱动流水线ParkerBot是系统大脑它不主动拉数据而是消费PluginServer写入的./data/inbox/下的JSON文件按{platform}_{timestamp}.json命名。其核心是StartBot.cs中定义的四阶段流水线解析归一化调用MsgHelper.cs将各平台原始JSON转为统一NormalizedPost对象补全缺失字段如口袋48无PublishTime则用文件写入时间替代人脸识别与聚类对每张ImageUrlList中的图调用FaceRecognitionService基于OpenCVSharp封装提取128维特征向量存入LiteDB的face_embeddings表去重与关联用余弦相似度比对新图与库中已有特征向量阈值设为0.75经2000张测试图调优若匹配成功则将新Post的PostId追加到对应PersonId的post_history数组中动作分发根据配置appsettings.json中Actions节点触发QQFunction.cs发送消息、AliYunHelper.cs上传云盘、FileHelper.cs本地归档。这个流水线的关键设计是状态驱动而非时间驱动ParkerBot每5秒扫描一次inbox/目录有新文件才启动处理避免空转耗资源。且每个阶段失败时错误日志写入./logs/error_{date}.log并保留原始JSON文件到./data/failed/方便人工复盘。2.3 展示交互层parkerCilent 的低侵入式Vue集成前端parkerCilent基于ViteVue3构建但刻意避开复杂状态管理。所有数据均通过/api/v1/status获取当前监听状态、/api/v1/images?personIdxxx按人物查图、/api/v1/logs?levelerror查错误日志三个REST接口从后端拉取。App.vue中仅用ref()管理响应式数据无Pinia或Vuex// src/views/ImageGallery.vue const images refImageItem[]([]); const loadImages async (personId: string) { try { const res await fetch(/api/v1/images?personId${personId}); images.value await res.json(); // 直接赋值无中间转换 } catch (e) { console.error(加载图片失败, e); } };为什么放弃SSR和状态持久化因为目标用户是粉丝群管理员他们需要的是“打开浏览器就能看图”而不是“等服务端渲染完再显示”。所有图片URL由后端ImageController.cs生成格式为/image/{hash}/{filename}Nginx已配置静态文件缓存expires 7d实测首屏加载800ms。这种“后端吐数据、前端只负责展示”的极简模式让课程设计答辩时能快速演示核心功能不被路由守卫、权限拦截等无关逻辑拖慢节奏。3. 核心功能实现人脸聚类算法与阿里云盘自动同步的工程化落地本章不讲理论只说怎么把“人脸识别”和“云盘上传”这两个最容易翻车的功能做成稳定可交付的模块。很多毕设卡在这两步算法跑不通、API调不通、上传一半断连——根源在于没把“异常路径”当主流程设计。3.1 人脸聚类从OpenCVSharp调用到业务规则嵌入系统未使用深度学习模型如FaceNet而是基于OpenCVSharp的FaceRecognizer传统算法原因很实在课程设计环境常无GPUDocker镜像体积要控制在300MB内且SNH48系偶像面部特征差异明显妆容、发型、角度变化有限LBPPCA足够满足精度需求。关键代码在FaceRecognitionService.cs的ExtractFeatures方法public async TaskListfloat[] ExtractFeatures(Liststring imagePaths) { var features new Listfloat[](); foreach (var path in imagePaths) { try { using var mat Cv2.ImRead(path, ImreadModes.Grayscale); if (mat.Empty()) continue; // 关键预处理直方图均衡化 高斯模糊降噪 Cv2.EqualizeHist(mat, mat); Cv2.GaussianBlur(mat, mat, new Size(3, 3), 0); // LBP特征提取OpenCVSharp内置 var lbp new LBPHFaceRecognizer(); var faceMat mat.Resize(new Size(128, 128)); // 统一分辨率 var featureVec lbp.Compute(faceMat); // 返回float[128]向量 features.Add(featureVec); } catch (Exception ex) { _logger.LogWarning(ex, 提取{Path}人脸特征失败, path); // 失败不中断记录日志后继续下一张 } } return features; }注意Compute()返回的featureVec是128维浮点数组不是字符串。很多同学直接ToString()存数据库导致后续无法计算余弦相似度——必须用BitConverter.GetBytes()序列化为byte[]存入LiteDB的BsonBinaryData字段。聚类逻辑不在AI层而在业务层PersonManager.cs中定义MergeSimilarPersons方法对新图特征向量遍历库中所有人脸向量计算余弦相似度private double CosineSimilarity(float[] a, float[] b) { double dotProduct 0, normA 0, normB 0; for (int i 0; i a.Length; i) { dotProduct a[i] * b[i]; normA a[i] * a[i]; normB b[i] * b[i]; } return dotProduct / (Math.Sqrt(normA) * Math.Sqrt(normB)); }阈值0.75是血泪经验低于0.7易把不同人判为同一人如赵嘉敏和许佳琪侧脸相似高于0.8则同人不同妆容舞台妆vs日常素颜会被拆成两人。该阈值已固化在Const.cs的FACE_SIMILARITY_THRESHOLD常量中答辩时可现场修改演示效果差异。3.2 阿里云盘同步断点续传与文件哈希去重的双重保障阿里云盘APIAliYunHelper.cs不走官方SDK体积大、依赖多而是手写HTTP请求核心是两个接口/adrive/v1.0/openFile/create创建文件和/adrive/v1.0/openFile/upload上传分片。难点不在调用而在如何确保“同一张图不重复上传”且“上传中断能续传”。解决方案是双保险前端哈希校验FileHelper.cs在保存图片到本地前先用SHA256.Create().ComputeHash()计算文件哈希存入images.db的file_hash字段后端幂等创建调用create接口时传入checkNameModeignorecontentHash参数云盘服务端会自动比对哈希若存在则直接返回已有文件ID不重复上传。断点续传逻辑在UploadChunkAsync方法中private async Taskbool UploadChunkAsync(string uploadUrl, byte[] chunk, int partNumber) { var content new ByteArrayContent(chunk); content.Headers.ContentType new MediaTypeHeaderValue(application/octet-stream); // 关键设置分片序号头云盘要求 content.Headers.Add(Content-Range, $bytes {partNumber * CHUNK_SIZE}-{(partNumber 1) * CHUNK_SIZE - 1}/{totalSize}); var response await _httpClient.PutAsync(uploadUrl, content); if (!response.IsSuccessStatusCode) { _logger.LogError(分片{Num}上传失败: {Code}, partNumber, response.StatusCode); return false; // 不重试由外层逻辑决定是否重传整块 } return true; }提示CHUNK_SIZE设为5MB云盘推荐值totalSize来自文件FileInfo.Length。上传前必须先调用create接口获取uploadUrl列表每个URL对应一个分片——这是云盘API的硬性要求跳过则400报错。最终效果一张2MB的PNG图首次上传耗时约1.2秒含鉴权创建单分片若网络中断下次启动时会检查./data/uploaded/下是否有.uploaded标记文件有则跳过无则重新走完整流程。所有上传记录存入aliyun_sync_log表含file_hash,cloud_file_id,upload_time,statussuccess/failed答辩时可导出Excel证明可靠性。4. 避坑指南五个上线即翻车的高频问题与根治方案这套方案在某高校课程设计中7个小组有5个在部署时卡在以下问题。不是代码写得差而是没把“生产环境思维”带进来。这里不讲原理只列现象、原因、一行命令或一个配置项解决。4.1 现象PluginServer 启动后立即退出日志无报错原因PluginServer.csproj中OutputTypeExe/OutputType被误改为WinExe导致控制台窗口闪退。Windows下WinExe类型不分配控制台Console.WriteLine无声息丢弃。解决打开PluginServer.csproj确认第3行是OutputTypeExe/OutputType不是WinExe。若用VS创建务必选“控制台应用(.NET Core)”勿选“Windows窗体应用”。4.2 现象QQ机器人收不到通知但日志显示“发送成功”原因QQFunction.cs中SendGroupMessage方法调用的是酷Q HTTP API但新版酷Q Air已停用HTTP协议必须用go-cqhttp并启用enable-http。解决检查go-cqhttp配置文件config.yml确认http:节点下enabled: true且host: 0.0.0.0非127.0.0.1否则C#程序无法跨容器访问。命令验证curl http://localhost:5700/get_login_info应返回JSON。4.3 现象人脸聚类结果混乱同一人被分成10个ID原因LiteDB的face_embeddings表未建索引FindAll()全表扫描导致特征向量加载超时CosineSimilarity计算时部分向量为null。解决在LiteContext.cs的InitDatabase方法末尾添加索引语句_db.GetCollectionFaceEmbedding(face_embeddings).EnsureIndex(x x.PersonId); _db.GetCollectionFaceEmbedding(face_embeddings).EnsureIndex(x x.FeatureHash); // FeatureHash是特征向量的SHA2564.4 现象Vue前端报404/api/v1/images接口不存在原因parkerCilent的vite.config.ts中server.proxy配置错误。常见误写为{ /api: { target: http://localhost:5000 } }但后端API前缀是/api/v1/代理需精确匹配。解决改为server: { proxy: { /api/v1: { target: http://localhost:5000, changeOrigin: true, rewrite: (path) path.replace(/^\/api\/v1/, /api/v1) } } }4.5 现象阿里云盘上传报错403 ForbiddencontentHash校验失败原因AliYunHelper.cs中计算contentHash用的是SHA256但阿里云盘要求contentHashNamesha1且值为Base64编码的SHA1哈希。解决替换哈希计算逻辑// 错误var hash SHA256.Create().ComputeHash(fileBytes); // 正确 using var sha1 SHA1.Create(); var hashBytes sha1.ComputeHash(fileBytes); var contentHash Convert.ToBase64String(hashBytes);并在create请求体中传contentHashName: sha1, contentHash: contentHash。5. 验收与答辩用三份可执行材料代替口头描述答辩不是讲“我打算怎么做”而是亮“这东西现在就能跑”。我带过的12个毕设项目凡提前准备这三份材料的答辩平均用时缩短40%导师提问锐减。它们不是附加项是方案落地的自然产物。5.1 材料一demo_run.bat—— 一键启动的最小可行演示在项目根目录放一个demo_run.bat内容仅三行echo off start PluginServer.exe timeout /t 3 nul start ParkerBot.exe为什么有效因为导师最关心“能不能动”。双击它5秒内看到两个命令行窗口弹出PluginServer显示“Loaded 3 plugins”ParkerBot显示“Started processing inbox”就证明环境配置、插件加载、进程通信全部通路。比打开VS编译再F5快10倍。注意.bat文件必须用ANSI编码保存否则中文路径乱码——这是某次答辩翻车后我加的强制检查项。5.2 材料二test_data/目录 —— 预置的可验证测试集test_data/下放5个真实文件weibo_20231001.json含1条带图微博图中为指定偶像koudai48_20231001.json含1条口袋48动态图中为同一偶像不同角度test_face.jpg清晰正脸图用于人脸聚类验证duplicate.jpg与test_face.jpg相似度92%的图用于去重测试corrupted.png损坏的PNG头部缺失用于异常处理演示。答辩时直接把这5个文件扔进./data/inbox/然后打开http://localhost:5173点击“刷新图片库”3秒后页面显示“新增2张图合并至ID: SNH48-001”。导师亲眼所见胜过千言万语。5.3 材料三qa_checklist.md—— 针对性回答的预埋答案库这不是问答稿而是把导师可能问的12个高频问题转化成可演示的操作。例如Q“怎么保证监听不漏” → A打开./logs/plugin_weibo.log搜索Fetched 12 posts对比微博网页端最新12条截图并排展示Q“图片存哪了” → A进入./data/images/SNH48-001/列出文件名修改时间file_hash再打开阿里云盘网页版搜索同一file_hash展示云端文件详情Q“如果QQ机器人挂了怎么办” → A手动结束ParkerBot.exe进程观察./logs/bot_error.log是否记录“QQ send failed”5秒后重启检查日志是否出现“Resend queue: 3 messages”。提示qa_checklist.md最后一行必须是“所有检查项均通过系统持续运行72小时无异常”这是某次答辩被追问“稳定性怎么证明”时我临时加的——从此成为标配。从那以后我每次交付方案都强制走一遍demo_run.battest_data注入 qa_checklist核对哪怕只是本地测试。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

RISC-V Smstateen/Ssstateen扩展:状态使能访问控制与安全隔离实践

RISC-V Smstateen/Ssstateen扩展:状态使能访问控制与安全隔离实践

1. 项目概述前些年在做 RISC-V 相关项目时,经常需要在不同权限域之间做状态隔离,比如用户态程序意外访问到硬件调试相关的控制寄存器,或者嵌入式场景里固件误改了某些原本只该由机器模式管理的状态位。这类问题排查起来非常痛苦,因…

2026/10/19 15:00:42 阅读更多 →
反汇编对抗实战:恶意代码分析 Labs-15 花指令破解与反调试绕过详解

反汇编对抗实战:恶意代码分析 Labs-15 花指令破解与反调试绕过详解

做《恶意代码分析实战》的配套实验做到Labs-15,我一开始是有点懵的。前面十几个实验虽然也有加壳、有字符串混淆,但只要耐心跟进导入表和API调用,大多能顺藤摸瓜看完整条执行链。这一关不一样,我打开样本的第一眼,基本…

2026/10/19 15:00:42 阅读更多 →
AI时代Linux安全:漏洞管理与系统加固实战

AI时代Linux安全:漏洞管理与系统加固实战

最近一个季度,我明显感觉到 Linux 安全这个战场变了味道。漏洞公告的更新频率比以往快了不少,朋友圈里做运维的朋友都在转发各种“紧急修复”,更让人不踏实的是,AI 辅助工具已经实打实地降低了攻击脚本的编写门槛——以前很多攻击…

2026/10/19 15:00:42 阅读更多 →

最新新闻

改进的功率摆动闭锁与解闭锁判据:Matlab实现与仿真验证

改进的功率摆动闭锁与解闭锁判据:Matlab实现与仿真验证

功率摆动闭锁(Power Swing Blocking, PSB)这个功能,在距离保护里属于典型的“平时没人提、一上事故就背锅”的角色。系统安稳运行时它几乎不动作,可一旦电网遭受扰动、发电机转子开始相对摆动,测量阻抗就会在复平面上“…

2026/10/19 15:52:33 阅读更多 →
Cocos Creator 微信小游戏开发:小鸟源码解析与发布避坑指南

Cocos Creator 微信小游戏开发:小鸟源码解析与发布避坑指南

简介:这是一份基于 Cocos Creator 开发的微信小游戏完整源代码,面向使用 Cocos Creator 进行微信小游戏开发与打包的开发者,尤其适合以“小鸟”类休闲游戏为切入点学习引擎构建与发布流程的读者。资源包共 592 个文件,压缩包大小约…

2026/10/19 15:52:33 阅读更多 →
libcurl HTTPS 编译配置全指南:OpenSSL/mbedTLS/wolfSSL 选型与静态链接

libcurl HTTPS 编译配置全指南:OpenSSL/mbedTLS/wolfSSL 选型与静态链接

简介:本资源为已编译完成的支持HTTPS协议的libcurl开发套件,面向C/C网络编程初学者与嵌入式、客户端开发工程师,解决在Windows平台快速集成安全HTTP/HTTPS通信能力的问题。压缩包共92个文件,包含86个OpenSSL与libcurl核心头文件&a…

2026/10/19 15:52:33 阅读更多 →
Spark 2.4.4+Hadoop 2.7.7单机伪分布式实战指南

Spark 2.4.4+Hadoop 2.7.7单机伪分布式实战指南

简介:本资源为燕山大学大数据分析课程英文实验报告,面向高校计算机、数据科学相关专业学生及Hadoop/Spark初学者,系统覆盖分布式环境搭建与机器学习算法实践两大核心能力训练。报告包含四大实验:Hadoop与Spark集群部署&#xff08…

2026/10/19 15:52:33 阅读更多 →
智能体路由实战:多模型调度降低成本与延迟的完整方案

智能体路由实战:多模型调度降低成本与延迟的完整方案

大模型应用跑起来之后,最先撞到的墙往往不是模型能力不够,而是"用一个模型包打天下"的成本和响应速度都让人肉疼。智能体路由这套机制,就是把不同难度、不同类型、不同成本诉求的请求,分配到最合适的模型或处理链路上。…

2026/10/19 15:52:33 阅读更多 →
纯NumPy手写CNN:从卷积反向传播到MNIST实战

纯NumPy手写CNN:从卷积反向传播到MNIST实战

简介:本资源是一份面向深度学习初学者与原理探究者的纯Python卷积神经网络(CNN)实现方案,不依赖TensorFlow、PyTorch等框架,聚焦底层计算逻辑与反向传播机制的理解。适合高校学生、转行学习者及希望夯实CNN数学基础的开…

2026/10/19 15:51:28 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54: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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →