ValidX 实名认证系统实战:身份证+人脸识别验证流程
实名认证系统实战身份证人脸识别验证流程 目录概述一、实名认证 ≠ 注册先分清三层验证二、格式层ValidX 本地校验把脏数据挡在付费 API 之前三、核验层二要素/三要素实名核验四、人脸层活体检测 人脸比对五、完整流程实现六、合规与安全个人信息是敏感数据七、容错、降级与防刷总结项目地址概述“开通钱包请先完成实名认证”“主播开播前需完成人脸核身”“网约车司机注册请上传身份证照片”——金融、直播、出行、电商开店、游戏防沉迷几乎所有涉及资金或身份责任的业务都绕不开实名认证。和登录验证week10不同实名认证要回答的问题不是账号密码对不对而是“屏幕对面这个自然人真的是他所声称的那个公民吗”这个问题没有任何单一技术能独立回答业内成熟做法是把它拆成三层接力格式层身份证号、姓名本地格式校验ValidX 的ChineseIdCard/ChineseName/Age核验层调用公安数据源的二要素/三要素实名核验 API姓名 身份证号是否真实匹配人脸层活体检测 人脸比对本人操作、与权威照片库比对。本文给出这套流程的完整工程实现分层职责、状态机设计、ValidX 在每一层的落点以及 PIPL 合规与防刷这两个最容易在架构阶段被忽略的问题。一、实名认证 ≠ 注册先分清三层验证1.1 三层架构总览┌────────────────────────────────────────────────────────────┐ │ 用户提交姓名 身份证号 活体人脸照片/视频流 │ └────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────┐ 免费 / 毫秒级 / 本地 │ ① 格式层ValidX 本地校验 │ 身份证号结构、校验位、 │ isChineseIdCard 等 │ 姓名格式、年龄范围 └──────────────────────────────┘ │ 格式全部通过才进入下一层 ▼ ┌──────────────────────────────┐ 按次计费 / 百毫秒级 / 外部 API │ ② 核验层二/三要素实名核验 │ 姓名 ↔ 身份证号↔ 手机号 │ 云厂商实名核验接口 │ 在公安权威数据源中是否匹配 └──────────────────────────────┘ │ 核验通过才进入下一层 ▼ ┌──────────────────────────────┐ 按次计费 / 秒级 / 端云协同 │ ③ 人脸层活体 比对 │ 客户端 SDK 采集 炫瞳/动作 │ 人脸核身服务 │ 服务端与权威照片比对打分 └──────────────────────────────┘ │ ▼ 认证通过 → 状态机落库已实名1.2 三层对比为什么不能砍掉任何一层维度① 格式层② 核验层③ 人脸层回答的问题“这个号长得像身份证号吗”“这个号真的是他的吗”“现在操作的是本人吗”成本免费按次计费分/次按次计费更贵延迟毫秒数百毫秒秒级含采集交互能拦住手滑、乱填、全角、编造位数的脏数据编造但格式合法的号码、冒用他人身份信息翻拍照片、视频回放、AI 换脸拦不住“格式合法但张冠李戴”持有他人完整信息的冒用——当前技术的终点核心成本逻辑越靠后的层越贵。格式层的价值就是用免费的本地校验把明显的垃圾请求挡在计费 API 之前——一次无效请求冲到人脸核身钱就白花了。这也是 ValidX 在整套流程里的定位它不替代云服务而是让每一分花在云服务上的钱都花在值得核验的请求上。二、格式层ValidX 本地校验把脏数据挡在付费 API 之前2.1 身份证号ChineseIdCard校验了什么ChineseIdCardValidator对 18 位号码做了五重校验全部通过才算格式合法#校验项规则拦截的典型错误1长度与字符集15 位纯数字或 18 位17位数字 [0-9X]少打一位、把 X 写成字母2省份编码前两位必须是真实行政区划码ChinaProvince枚举99开头的编造号3出生日期第 7~14 位是合法日期1900 年起、不晚于当前日期19991332这种13月32日4校验位GB 11643 加权算法前 17 位 × 权重[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]求和模 11 映射到末位校验码改动任意一位即失配515 位兼容15 位老证先补19升位成 18 位再走同样校验存量老证用户被误杀两个实现细节末位 X 大小写不敏感源码先value.toUpperCase()x与X等价——用户手输小写 x 是高频操作空值放行null/返回 true必填由NotBlank负责与 ValidX 全线注解一致。默认错误消息身份证号码不正确消息键io.github.vipxieliang.validx.annotation.chinese.idcard9 种语言齐全。publicclassRealNameRequest{NotBlank(message姓名不能为空)ChineseName// 中文姓名格式privateStringrealName;NotBlank(message身份证号不能为空)ChineseIdCard// 五重校验privateStringidCardNo;}身份证校验位的加权算法细节可参见系列文章《告别重复代码用 ValidX 一行代码搞定身份证校验》本文不再展开。2.2 年龄门槛Age(fromIdCard true)一行搞定仅限成年人很多实名场景带年龄门槛金融产品 18 岁起、网约车司机 21 岁起、某些理财 65 岁封顶。Age支持直接从身份证号提取出生日期计算年龄不用用户再填一次生日publicclassDriverRegisterRequest{NotBlankChineseNameprivateStringrealName;NotBlankChineseIdCardAge(min21,max60,fromIdCardtrue)// 从身份证提取出生日期算年龄privateStringidCardNo;}fromIdCard true把字段值当身份证号解析第 7~14 位出生日期min/max为 0 表示不限制同一个字段上ChineseIdCardAge双注解完全正交——前者管结构后者管从结构里提取的语义。2.3 链式写法Service 层动态校验注解适合标准 DTO链式适合动态场景多渠道接入、表单引擎ValidXvalidatorValidX.init().config(ValidXConfig.GLOBAL_NOT_EMPTY).field(姓名).isChineseName(realName).field(身份证号).isChineseIdCard(idCardNo).field(身份证号).isAge(idCardNo,21,60,true);if(!validator.passed()){returnResult.fail(400,validator.getErrors());// [身份证号: 身份证号码不正确, ...]}2.4 格式层的三个隐性收益省钱垃圾请求在免费层被拦截不消耗按次计费的核验额度快毫秒级返回明确错误“校验位不对”比等 500ms 后收到云厂商的格式错误体验好防脏数据即使用户最终放弃认证半途提交的数据也已过格式关落库的就是干净的。三、核验层二要素/三要素实名核验3.1 什么是二要素/三要素类型比对内容数据源典型用途二要素姓名 身份证号公民身份信息权威数据源直播实名、电商开店三要素姓名 身份证号 手机号权威数据源 运营商在网信息金融开户更强约束格式层校验位算法再严密也只能证明这个号结构合法证明不了这是张三的号——姓名与号码的匹配关系只存在于权威数据源中必须付费核验。3.2 调用要点/** * 二要素核验示意云厂商实名核验 API 的通用形态 */publicVerifyResultverifyIdentity(StringrealName,StringidCardNo){// ① 幂等检查近期同号已通过则直接返回避免重复扣费VerifyRecordcachedverifyCache.get(realName,idCardNo);if(cached!nullcached.isPassed()){returnVerifyResult.passed(cached.getId());}// ② 防刷同一用户/号码的失败次数限制if(rateLimiter.exceeds(realName,MAX_FAIL_PER_DAY)){thrownewBizException(今日核验次数已达上限请明日再试);}// ③ 调用云厂商接口签名鉴权由 SDK 处理IdentityVerifyResponserespcloudClient.invoke(IdentityVerifyRequest.of(realName,idCardNo));// ④ 结果落库 缓存统一错误出口returnhandleResponse(resp);}工程上必须处理的四件事幂等与缓存同一姓名 证号对近期已核验通过的直接复用结果——这是核验层最大的省钱手段通过结果可信期通常设 90 天或永久失败结果只缓存几分钟供重试失败次数限制防止攻击者拿一个人的真实身份信息反复试或拿批量号码探测库错误映射云厂商返回码五花八门参数错 / 不匹配 / 库中无此号 / 服务超时要在网关层统一映射成对用户友好的提示区分计费失败与业务失败超时未扣费的允许免费重试对用户的提示要克制核验失败统一提示实名信息核验未通过请检查姓名与证件号不要透出公安库中无此号码之类的内部细节。3.3 二要素之后为什么还需要人脸二要素核验通过只能证明张三 这个证号是真实匹配的一对但提交信息的可能是任何拿到张三证件信息的人社工库泄露、捡到身份证、内部数据倒卖。人脸层解决的就是此刻操作者是否为张三本人。四、人脸层活体检测 人脸比对4.1 两个动作缺一不可动作回答的问题技术手段活体检测“这是活人还是照片/视频/屏幕翻拍”动作指令眨眼/摇头/张嘴、炫瞳光线反射变化、静默活体单帧推理人脸比对“这张脸是张三本人吗”现场采集照 vs 公安部权威照片身份证制证照输出相似度分数只做比对不做活体一张从社交网络扒到的照片就能通过只做活体不做比对任何一个活人都能冒名。必须串联。4.2 端云协同与安全边界客户端 SDK人脸核身组件 服务端 ┌─────────────────────┐ ┌──────────────────────────┐ │ 摄像头采集 质量检测 │ │ ① 校验上传凭证防伪造 │ │ 活体检测炫瞳/动作 │ ───▶ │ ② 调用人脸比对 API │ │ 输出活体分数 加密流│ │ ③ 比对分 ≥ 阈值 → 通过 │ └─────────────────────┘ │ ④ 核身流水落库 │ └──────────────────────────┘关键原则活体结果必须由服务端与云厂商二次确认绝不信任客户端上报的活体通过标志。客户端代码在越狱/Root 设备上可被 Hook注入预先录制的视频流注入攻击是人脸黑产的主流手段。正规云厂商的核身组件会把加密的完整性证据随流上传服务端验签后才可信。比对阈值由业务在误拒率FRR与误收率FAR之间取舍金融场景宁严勿松社交直播可适当放宽通常直接采用云厂商针对场景的推荐值。4.3 结果状态机UNVERIFIED ──提交──▶ PENDING ──全部通过──▶ VERIFIED ▲ │ │ ├─格式层失败──▶ FAILED_FORMAT可立即重试 │ ├─核验失败───▶ FAILED_IDENTITY限次重试 │ └─人脸失败───▶ FAILED_FACE限次重试 风控标记 └────管理员人工审核证件类型不支持自动核验时◀── MANUAL_REVIEW要点三类失败分状态记录错误提示与重试策略不同格式错误无限次核验/人脸失败按天限次港澳台居民居住证、军官证、护照等证件多数云厂商不支持自动核验或需要单独通道状态机要预留人工审核兜底入口VERIFIED后存认证主体指纹姓名证号的哈希后续业务校验只查指纹不再触碰明文。五、完整流程实现5.1 DTO格式层全部注解化publicclassRealNameAuthRequest{NotBlank(message姓名不能为空)ChineseName(message姓名格式不正确)privateStringrealName;NotBlank(message身份证号不能为空)ChineseIdCard(message身份证号码不正确)Age(min18,fromIdCardtrue,message实名认证需年满18周岁)privateStringidCardNo;/** 人脸核身会话凭证由客户端向服务端预申请防重放 */NotBlankprivateStringfaceSessionToken;}5.2 Service三层接力ServicepublicclassRealNameAuthService{publicAuthResultsubmitAuth(LonguserId,RealNameAuthRequestreq){// ── ① 格式层Controller 已由注解校验此处为链式兜底/复检 ──ValidXvalidatorValidX.init().field(姓名).isChineseName(req.getRealName()).field(身份证号).isChineseIdCard(req.getIdCardNo());if(!validator.passed()){returnAuthResult.formatError(validator.getErrors());}// ── ② 核验层二要素含缓存幂等 防刷见 3.2 ──VerifyResultidentityidentityVerifyService.verify(req.getRealName(),req.getIdCardNo());if(!identity.isPassed()){returnAuthResult.identityFailed();}// ── ③ 人脸层凭 faceSessionToken 取回核身结果服务端向云厂商确认 ──FaceVerifyResultfacefaceVerifyService.confirm(req.getFaceSessionToken());if(!face.isPassed()){returnAuthResult.faceFailed();}// ── 落库状态机推进 存脱敏指纹 ──userAuthRepository.saveVerified(userId,req.getRealName(),maskIdCard(req.getIdCardNo()),// 1101**********123Xsha256(req.getRealName()req.getIdCardNo()));// 主体指纹returnAuthResult.success();}}5.3 各层失败的用户提示对照层内部日志详用户提示略格式层身份证校验位失配/出生日期非法/省份码不存在“身份证号码不正确请核对后重填”核验层云厂商返回码 原始报文含 traceId“实名信息核验未通过”人脸层活体分数 比对分 攻击嫌疑标记“人脸核验未通过请重试”原则对用户永远只给可自证的提示给运营和排障留全量日志——这也是把三层错误分开记录的原因。六、合规与安全个人信息是敏感数据身份证号、人脸照片在《个人信息保护法》PIPL下属于敏感个人信息处理不当的业务风险比验证逻辑本身的 bug 严重得多要求工程落地单独同意实名认证必须独立于用户协议单独勾选授权不得捆绑默认勾选最小必要只收实名必需字段人脸照片核验完即用即毁不留原图留云端返回的加密凭证/流水号加密存储身份证号加密落库 展示脱敏1101**********123X查重用哈希指纹而非明文比对日志脱敏全链路日志含错误日志、云厂商报文中的证件号、姓名、人脸数据必须脱敏保留期限制定明确的留存与删除策略如认证流水留存 X 年后匿名化用户注销时同步处理传输安全全链路 HTTPS人脸流走云端 SDK 的加密通道禁止业务服务器中转明文图像权限隔离数据库实名表的访问权限收敛到认证服务其余业务只能查是否已实名布尔位其中业务侧只依赖是否已实名布尔位 主体指纹这一条尤其重要把敏感数据的使用面收缩到认证模块内部是整个系统合规成本的杠杆点。七、容错、降级与防刷7.1 云依赖的容错故障策略核验 API 超时区分已扣费未返回与未发出前者凭厂商流水号查询对账后者免费重试核验服务整体不可用排队异步化提交后进PENDING回调/轮询推进状态机前端展示认证处理中厂商侧故障预留第二家厂商的适配层统一IdentityVerifyClient接口但注意两家数据源返回口径可能不同7.2 防刷矩阵攻击面防线批量提交编造号码格式层免费 核验失败限次拿他人真实信息冒名人脸层活体 比对翻拍照片 / 视频注入客户端 SDK 完整性校验 服务端二次确认4.2一个真人替多个账号过人脸聚类分析同一人脸出现的账号数超阈值风控脚本绕过前端直接打接口faceSessionToken 服务端预签发 一次性消费 设备指纹7.3 兜底人工审核自动核验覆盖不了所有证件与人群老证识别失败、容貌巨变、特殊证件。给客服后台留一个人工审核队列比让用户卡死在重试 5 次仍失败好得多——这也是状态机里MANUAL_REVIEW存在的意义。总结层职责ValidX 的落点成本① 格式层拦脏数据、快速失败、省钱ChineseIdCard15/18 位 省份 生日 GB 11643 校验位、ChineseName、Age(fromIdCardtrue)、链式isChineseIdCard等免费② 核验层姓名 ↔ 证号真实匹配无外部 API但缓存/幂等/防刷在业务侧按次③ 人脸层活体 本人比对无云端 SDK 服务端确认按次实名认证系统的设计心法可以浓缩成三句话免费层拦得越狠付费层花得越准——格式校验位算法GB 11643是天然免费的结构签名ChineseIdCard一行注解就把绝大多数垃圾请求挡在计费线之前每一层只回答自己能回答的问题——格式层不假装能证明身份核验层不假装能证明本人人脸层不假装绝对可靠三层接力才是诚实的工程敏感数据的合规设计与验证逻辑同等重要——脱敏、指纹、最小必要、单独同意这些不是上线后再补的项而是架构第一天的输入。身份证号本身的校验位算法与 15/18 位互转细节见《告别重复代码用 ValidX 一行代码搞定身份证校验》多字段二选一类条件的通用做法见《用户登录验证方案》week10——二者都是实名流程上下游的配套阅读。项目地址GitHubhttps://github.com/vipxieliang/ValidXGiteehttps://gitee.com/vipxieliang/ValidXMaven Centralhttps://central.sonatype.com/artifact/io.github.vipxieliang/validx

相关新闻

Sublime Text配置Python环境的底层原理与稳定实践

Sublime Text配置Python环境的底层原理与稳定实践

1. 项目概述:为什么Sublime Text配Python环境这件事,至今还有人反复踩坑?“如何给Sublime配置Python环境”——这个标题看起来平平无奇,甚至有点过时。毕竟现在动辄VS Code、PyCharm、Jupyter Lab满天飞,连新手入门教程…

2026/10/13 10:05:23 阅读更多 →
明码标价的AI竞赛:围堵中小学生的科技教育陷阱

明码标价的AI竞赛:围堵中小学生的科技教育陷阱

昨晚十一点,一个朋友把一张截图甩到我手机上,是某AI竞赛辅导机构的报价单:省级奖项保底6800元,国赛银奖保底2.8万元,全程托管另算,再要“专利论文”打包,加4万。服务承诺写得明明白白——老师代…

2026/10/13 10:05:23 阅读更多 →
5 分钟上手 douyin-downloader:抖音无水印下载从单条到主页批量的完整指南

5 分钟上手 douyin-downloader:抖音无水印下载从单条到主页批量的完整指南

5 分钟上手 douyin-downloader:抖音无水印下载从单条到主页批量的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and bro…

2026/10/13 10:04:21 阅读更多 →

最新新闻

实战型网安赛事与传统CTF有何不同?破阵阁公开赛参赛全记录

实战型网安赛事与传统CTF有何不同?破阵阁公开赛参赛全记录

1. 这场公开赛和我印象里的CTF不太一样 先说个让我挺意外的点。之前我一直以为这类网安赛事,无非就是CTF那种“给你一道题,你交个flag”的纯解题模式。但“破阵阁・网安淬锋公开赛”这个比赛,从赛制设计上就和我预想的不太一样——它更像是把…

2026/10/13 10:46:32 阅读更多 →
Unity跑酷游戏开发:状态机+对象池+动态难度实战

Unity跑酷游戏开发:状态机+对象池+动态难度实战

简介:这是一份面向Unity初学者与游戏开发入门者的跑酷类小游戏完整源码项目,旨在帮助学习者系统掌握Unity3D核心开发流程与关键组件实践。资源包含5428个文件,主体为197个C#脚本(实现角色控制、碰撞检测、物理交互与UI逻辑&#x…

2026/10/13 10:46:32 阅读更多 →
AI终端重做:从遥控器到有身体的智能体

AI终端重做:从遥控器到有身体的智能体

1. 这不是一场技术升级,而是一次终端定义权的争夺战“海量终端等待被AI重做”——这句话最近在多个行业闭门会上被反复提起,但很少有人愿意说透:所谓“重做”,根本不是给旧设备加个语音助手、贴个AI标签那么简单。我过去三年深度参…

2026/10/13 10:46:32 阅读更多 →
Windows PowerShell执行策略导致yarn无法运行的解决方案

Windows PowerShell执行策略导致yarn无法运行的解决方案

1. 问题本质与真实场景还原 你刚在 Windows 电脑上用 npm 全局安装了 yarn,敲下 yarn --version 回车后,终端却猛地跳出一行红色报错: 无法加载文件 C:\Users\jiuyv\AppData\Roaming\npm\yarn.ps1,因为在此系统中禁止运行脚本…

2026/10/13 10:46:32 阅读更多 →
数组从入门到避坑:定义、遍历、查找、排序全拆解

数组从入门到避坑:定义、遍历、查找、排序全拆解

数组这东西,算是我见过的最容易“一看就会、一写就废”的知识点了。明明就是一组数据的存放方式,定义、遍历、查找、排序,听起来每一步都清清楚楚,但真正上手写代码的时候,动不动就抛出一个数组越界异常,或…

2026/10/13 10:46:32 阅读更多 →
Flutter鸿蒙适配:封装HarmonyOS风格加载反馈组件

Flutter鸿蒙适配:封装HarmonyOS风格加载反馈组件

最近在做Flutter工程适配鸿蒙生态,需要在App里补一个统一风格的加载反馈层。市面上的Loading组件要么太重、要么和HarmonyOS的卡片化设计语言不太搭,后来干脆自己封装了一个HarmonyLoader,正好赶上HarmonyOS 6.0的适配窗口,把组件…

2026/10/13 10:45:32 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →