基于Python的人工智能美颜系统:人脸感知与保边磨皮实战
简介这份资源是一套基于Python的人工智能美颜系统完整工程包面向具备Python基础、希望入门图像处理与深度学习美颜应用的开发者与学习者。系统结合PIL、OpenCV等图像处理库与卷积神经网络、生成对抗网络等深度学习技术实现肤色增强、面部特征优化等自然美颜效果可用于自拍美化、社交应用原型开发等场景。压缩包共10个文件约68.95MB包含Python源码、批处理脚本、UI界面文件、人脸关键点数据文件、编译缓存及说明文档等覆盖从界面交互到模型调用的主要模块。目前已有4941人学习下载具备一定参考热度。读者可借助完整源码理解美颜系统的工程结构学习人脸关键点检测、图像预处理与后处理、模型集成等关键环节并参考界面与脚本组织方式快速搭建自己的美颜应用原型。1. 基于 Python 的人工智能美颜系统从滤镜到人脸感知的分水岭很多人第一次做美颜都是从一行cv2.GaussianBlur开始的。磨皮、美白、加个暖色调跑出来一看——脸是糊的头发丝和背景一起被抹平眼睛像蒙了层雾。这不是参数没调好而是整条链路缺了「人脸感知」这一环。基于 Python 的人工智能美颜系统核心区别就在这它先用模型把人脸、五官、皮肤区域找出来再决定哪里该磨、哪里必须保、哪里要单独提亮而不是对整张图无差别地糊一遍。这套东西能解决的问题很具体人像磨皮保留毛孔质感、痘印和斑点的定向弱化、五官锐度不被连带损失、批量处理时肤色不飘。适合两类人——想给自己项目加美颜模块的 Python 开发者以及想把修图流程自动化的图像处理从业者。下面按「先跑通最小链路再逐层加感知能力」的顺序拆每一步都能直接复现。2. 最小可跑链路人脸检测加保边磨皮怎么搭2.1 为什么选 MediaPipe 而不是 Haar 级联人脸检测这一步选型直接决定后面磨皮蒙版的质量。OpenCV 自带的 Haar 级联优点是零依赖、加载快但侧脸、低头、戴眼镜的场景漏检率明显偏高而且它给的是矩形框没有关键点。做美颜只拿到一个框是不够的——你需要知道眼睛在哪、脸颊在哪才能把磨皮限制在皮肤区域。常见做法是用 MediaPipe 的 Face Mesh它一次输出 468 个面部关键点包含脸部轮廓、眼睛、眉毛、嘴唇的完整拓扑。有了这些点就能构造一张「皮肤蒙版」脸部轮廓内、减去眼睛和嘴唇区域剩下的才是允许磨皮的范围。这一步是整个系统里性价比最高的投入检测稳了后面所有效果都稳。安装依赖很轻pip install opencv-python mediapipe numpyMediaPipe 在 CPU 上跑单张图通常几十毫秒做实时预览也够用。如果你的场景是纯离线批量处理也可以换成更重的人脸解析模型比如基于分割网络的皮肤语义分割精度更高但速度慢一个量级按需取舍。2.2 用关键点构造皮肤蒙版下面这段代码做三件事检测人脸关键点、用轮廓点填充出脸部区域、把眼睛和嘴唇挖掉得到一张只覆盖皮肤的蒙版。import cv2 import numpy as np import mediapipe as mp mp_face_mesh mp.solutions.face_mesh # 脸部轮廓、左右眼、嘴唇的关键点索引MediaPipe Face Mesh 标准索引 FACE_OVAL [10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288, 397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136, 172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109] LEFT_EYE [33, 7, 163, 144, 145, 153, 154, 155, 133, 173, 157, 158, 159, 160, 161, 246] RIGHT_EYE [362, 382, 381, 380, 374, 373, 390, 249, 263, 466, 388, 387, 386, 385, 384, 398] LIPS [61, 146, 91, 181, 84, 17, 314, 405, 321, 375, 291, 308, 324, 318, 402, 317, 14, 87, 178, 88, 95] def build_skin_mask(image, face_mesh): h, w image.shape[:2] rgb cv2.cvtColor(image, cv2.COLOR_BGR2RGB) result face_mesh.process(rgb) mask np.zeros((h, w), dtypenp.uint8) if not result.multi_face_landmarks: return mask # 没检测到人脸返回全黑蒙版后续跳过磨皮 landmarks result.multi_face_landmarks[0] pts np.array([(int(lm.x * w), int(lm.y * h)) for lm in landmarks.landmark]) # 填充脸部轮廓 cv2.fillPoly(mask, [pts[FACE_OVAL]], 255) # 挖掉眼睛和嘴唇这些区域不能磨 cv2.fillPoly(mask, [pts[LEFT_EYE]], 0) cv2.fillPoly(mask, [pts[RIGHT_EYE]], 0) cv2.fillPoly(mask, [pts[LIPS]], 0) # 羽化边缘避免磨皮区域出现硬边 mask cv2.GaussianBlur(mask, (21, 21), 0) return mask逻辑说明fillPoly用轮廓点围出实心区域先填脸再挖五官顺序不能反。最后那步高斯模糊是关键——蒙版边缘如果不羽化磨皮区域和未处理区域之间会出现一条肉眼可见的硬边这是新手最常见的翻车点。(21, 21)的核大小控制羽化宽度脸大就调大脸小就调小一般取图像短边的 2% 到 3% 比较自然。参数说明FACE_OVAL这些索引是 MediaPipe Face Mesh 的固定拓扑不要随意改。如果你换成人脸解析模型这一步就变成直接取语义分割的皮肤类别逻辑更简单但依赖更重。2.3 保边磨皮双边滤波为什么比高斯强拿到蒙版后磨皮本身要用保边滤波器。高斯模糊会把所有细节一起抹掉双边滤波则同时考虑空间距离和像素值差异——颜色相近的邻域才参与平均边缘两侧色差大的像素互相不影响。结果就是皮肤平滑了但眼睛边缘、鼻翼轮廓、发丝边界都还在。def smooth_skin(image, mask, d15, sigma_color60, sigma_space60): # 双边滤波保边磨皮 smoothed cv2.bilateralFilter(image, d, sigma_color, sigma_space) # 按蒙版做 alpha 混合只让皮肤区域生效 mask_3c cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR).astype(np.float32) / 255.0 out image.astype(np.float32) * (1 - mask_3c) smoothed.astype(np.float32) * mask_3c return out.astype(np.uint8)逻辑说明bilateralFilter的d是邻域直径sigma_color控制颜色相似度容忍度sigma_space控制空间影响范围。混合那一步用蒙版当权重蒙版白的地方皮肤取磨皮结果黑的地方五官、背景保留原图。参数说明sigma_color调大磨皮更强但容易糊掉皮肤纹理调小则磨皮弱、保留更多细节。经验值是 40 到 80 之间sigma_space一般和d同量级。d设成 0 时 OpenCV 会按 sigma 自动推算但显式指定更好控制。这三个参数是整套系统里最需要反复试的地方没有万能值跟输入分辨率强相关。3. 从磨皮到「美颜」肤色、五官与质感的分离处理3.1 美白不是调亮度是调 LAB 的 L 通道直接给整张图加亮度背景会一起变白人脸显得发灰。正确做法是转到 LAB 色彩空间只动 L亮度通道而且只在皮肤蒙版内动。LAB 的好处是亮度和颜色分离改 L 不会让肤色偏色。def whiten_skin(image, mask, strength0.3): lab cv2.cvtColor(image, cv2.COLOR_BGR2LAB).astype(np.float32) l_channel lab[:, :, 0] # 对 L 通道做非线性提亮暗部提得多亮部提得少避免过曝 l_norm l_channel / 255.0 l_boosted np.power(l_norm, 0.85) * 255.0 l_channel l_channel * (1 - strength) l_boosted * strength lab[:, :, 0] l_channel out cv2.cvtColor(lab.astype(np.uint8), cv2.COLOR_LAB2BGR) mask_3c cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR).astype(np.float32) / 255.0 return (image.astype(np.float32) * (1 - mask_3c) out.astype(np.float32) * mask_3c).astype(np.uint8)逻辑说明np.power(l_norm, 0.85)是伽马校正指数小于 1 时暗部被抬升、亮部变化小正好符合美白「提亮但不死白」的需求。strength控制美白强度0 到 1 之间。参数说明指数 0.85 是偏保守的值想要更明显可以降到 0.7但低于 0.7 容易让高光区域细节丢失。strength建议不超过 0.5超过之后肤色会开始发灰、失去血色。这一步和磨皮一样只在蒙版内生效。3.2 五官锐化把眼睛和嘴唇单独拎出来磨皮之后眼睛和嘴唇因为没被磨本来应该保持锐利。但如果整张图做过缩放或压缩五官也会变软。这时候需要对眼睛和嘴唇区域做一次定向锐化用反锐化掩模unsharp mask即可。def sharpen_features(image, landmarks, w, h): pts np.array([(int(lm.x * w), int(lm.y * h)) for lm in landmarks.landmark]) feature_mask np.zeros((h, w), dtypenp.uint8) cv2.fillPoly(feature_mask, [pts[LEFT_EYE]], 255) cv2.fillPoly(feature_mask, [pts[RIGHT_EYE]], 255) cv2.fillPoly(feature_mask, [pts[LIPS]], 255) feature_mask cv2.GaussianBlur(feature_mask, (15, 15), 0) blurred cv2.GaussianBlur(image, (0, 0), 3) sharpened cv2.addWeighted(image, 1.5, blurred, -0.5, 0) mask_3c cv2.cvtColor(feature_mask, cv2.COLOR_GRAY2BGR).astype(np.float32) / 255.0 return (image.astype(np.float32) * (1 - mask_3c) sharpened.astype(np.float32) * mask_3c).astype(np.uint8)逻辑说明addWeighted(image, 1.5, blurred, -0.5, 0)是经典反锐化公式原图减去一部分模糊图得到边缘增强。1.5和-0.5之和为 1保证整体亮度不变。参数说明高斯核(0, 0)配合 sigma3 表示按 sigma 自动推算核大小。锐化强度由1.5 / -0.5这组系数控制想更强就拉到2.0 / -1.0但超过之后眼睛边缘会出现白边光晕这是锐化过度的典型症状。3.3 把三步串成一条流水线单张图的完整流程是检测关键点 → 构造皮肤蒙版 → 保边磨皮 → LAB 美白 → 五官锐化。顺序不能乱磨皮必须在美白之前否则美白提亮会把磨皮残留的噪点一起放大锐化必须放最后否则后续的模糊操作会把锐化效果抵消。def beautify(image_path, out_path): img cv2.imread(image_path) h, w img.shape[:2] with mp_face_mesh.FaceMesh(static_image_modeTrue, max_num_faces1, refine_landmarksTrue) as face_mesh: mask build_skin_mask(img, face_mesh) if mask.max() 0: cv2.imwrite(out_path, img) # 无人脸原图输出 return img smooth_skin(img, mask) img whiten_skin(img, mask) rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) result face_mesh.process(rgb) if result.multi_face_landmarks: img sharpen_features(img, result.multi_face_landmarks[0], w, h) cv2.imwrite(out_path, img)逻辑说明static_image_modeTrue表示单图模式不做跨帧跟踪适合批量处理。refine_landmarksTrue会额外输出眼球和嘴唇内轮廓的精细点对五官锐化的蒙版质量有帮助。注意这里检测了两次——一次拿蒙版一次拿五官点因为中间经过了磨皮和美白关键点位置理论上不变但重新检测更稳妥。参数说明max_num_faces1表示只处理最大的一张脸多人合影场景需要改成更大的值并循环处理每张脸。批量处理时建议把FaceMesh对象在循环外创建一次复用反复创建销毁会有明显开销。4. 避坑与排查那些让效果一夜回到解放前的问题4.1 磨皮后脸像塑料毛孔全没了现象磨完皮皮肤是平滑了但完全没有质感像贴了层膜。原因通常是sigma_color设得太大双边滤波把皮肤本身的微纹理也当成噪点抹掉了。解决把sigma_color降到 40 以下或者改用「高频保留」策略——先分离出皮肤的高频细节层磨皮后按比例加回去一部分。另一个常见原因是蒙版羽化过度导致磨皮区域实际覆盖了比预期更大的范围。4.2 侧脸或低头时蒙版错位现象正脸效果很好一转头磨皮区域就跑到脸颊外面或者把背景磨了。原因MediaPipe Face Mesh 在极端角度下关键点会漂移轮廓点不再贴合真实脸缘。解决加一个角度判断当检测到的关键点置信度低或脸部朝向偏转过大时降低磨皮强度甚至跳过。也可以对蒙版做一次形态学腐蚀让磨皮区域往内收一点宁可少磨不要磨错。4.3 美白之后肤色发灰发青现象提亮是提亮了但人脸看着没血色像生病。原因只动了 L 通道但原始图像本身偏色或者提亮幅度过大导致颜色饱和度相对下降。解决在 LAB 的 A、B 通道上做轻微补偿或者改用 HSV 空间只调 V 通道并配合饱和度保护。更简单的办法是限制strength不超过 0.4并在提亮后做一次轻微的饱和度回补。4.4 批量处理时内存持续上涨现象处理几十张图后进程被系统杀掉。原因每次循环都新建FaceMesh对象MediaPipe 的底层图结构没有及时释放。解决把FaceMesh的创建提到循环外用with语句管理生命周期或者显式调用close()。另外 OpenCV 的imread返回的数组要及时释放引用大批量处理时建议分批次并手动gc.collect()。4.5 锐化后眼睛出现白边现象五官锐化之后眼睛和嘴唇边缘有一圈亮线。原因反锐化系数过大边缘两侧的对比被过度放大。解决把系数从1.5 / -0.5降到1.2 / -0.2或者先对锐化结果做一次阈值限制只增强梯度大的边缘平坦区域不参与。另一个办法是缩小锐化蒙版只覆盖眼球和唇部核心区域不碰边缘过渡带。5. 进阶让美颜参数随人脸自适应固定参数的美颜系统遇到不同光照、不同肤色、不同分辨率就会露馅。真正好用的做法是让参数跟着人脸走。一个实用的自适应策略是用皮肤区域的平均亮度和对比度来动态调整磨皮和美白强度。皮肤本来就暗的图美白可以给强一点皮肤已经过曝的图美白要压到接近零否则直接死白。def adaptive_params(image, mask): skin_pixels image[mask 128] if len(skin_pixels) 0: return 0.3, 0.3 # 兜底默认值 mean_l skin_pixels.mean() # 皮肤越暗美白越强越亮美白越弱 whiten np.clip((180 - mean_l) / 255.0, 0.1, 0.5) # 皮肤对比度越低磨皮越弱避免把仅有的细节磨没 contrast skin_pixels.std() smooth np.clip(contrast / 80.0, 0.2, 0.6) return whiten, smooth逻辑说明mean_l是皮肤区域的平均亮度用它反推美白强度——暗皮多提亮皮少提。contrast是标准差反映皮肤纹理丰富程度纹理少的皮肤磨皮要克制。两个值都用np.clip卡在合理区间防止极端输入导致参数失控。参数说明180是目标亮度参考值可以按你的审美偏好调整80是对比度参考值皮肤纹理丰富的图标准差通常在这个量级。这两个常数不是标准答案是起点实际项目里应该用一批样本图跑一遍看参数分布再定。验证自适应效果是否靠谱有个简单办法准备一组覆盖暗光、逆光、正常光的测试图分别跑固定参数和自适应参数把皮肤区域的平均亮度和标准差打出来对比。自适应版本的标准差应该更集中说明不同输入下的输出更一致。这一步不需要复杂工具几行 numpy 统计就够。我自己踩过最深的坑是早期迷信一套「调好的参数」打天下结果换一批手机拍的图就全崩了。后来养成习惯任何美颜参数上线前先在一组至少二十张、覆盖不同设备和光照的图上跑统计看参数分布有没有长尾。参数是死的人脸是活的让系统自己看脸下菜比手动调一百遍都管用。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于Python的人工智能美颜系统:从磨皮到瘦脸的工程实现

基于Python的人工智能美颜系统:从磨皮到瘦脸的工程实现

简介:这是一套面向Python开发者与计算机视觉初学者的实战项目源码,围绕人工智能美颜这一典型图像处理场景展开,帮助读者理解从人脸关键点检测到图像美化输出的完整链路。压缩包共10个文件,约68.95MB,包含Python主程序与…

2026/10/13 11:15:06 阅读更多 →
CMake实战速查手册:配置、生成、构建三步走通工程实践

CMake实战速查手册:配置、生成、构建三步走通工程实践

简介:这是一份CMake开发详解手册,面向需要在不同平台、不同编译器下管理项目的C/C开发者,也适合刚接触CMakeLists.txt配置的入门读者。手册以CMake 2.8.3版本为主线,清晰梳理了常用构建选项,如调试/发布构建类型、编译…

2026/10/13 11:15:09 阅读更多 →
超市积分管理与分析系统:从增删改查到积分运营与数据洞察的完整设计

超市积分管理与分析系统:从增删改查到积分运营与数据洞察的完整设计

上周有位计算机专业的同学发消息问我:“我的毕设题目是超市积分管理与分析系统,现在把会员管理的增删改查都做完了,可导师说我的系统没有‘分析’,这到底怎么补?”这个问题我一点都不意外。每年毕设季,“会…

2026/10/13 11:14:16 阅读更多 →

最新新闻

PS5串流实战指南:从局域网到外网的远程游戏配置与延迟优化

PS5串流实战指南:从局域网到外网的远程游戏配置与延迟优化

直接接PS5玩家一个很现实的问题:这台机器买回来之后,是不是基本就长在客厅电视柜上了?客厅被占、卧室想玩、出差想刷两把,每次都只能乖乖回到电视前。我捣鼓AnyPS5这套串流方案,就是为了把这台主机从HDMI线的长度里解放…

2026/10/13 20:09:06 阅读更多 →
若依vue3前端页面框架:路由联动、权限指令与缓存机制解析

若依vue3前端页面框架:路由联动、权限指令与缓存机制解析

简介:若依vue3前端页面框架是一套基于Vue3与Element Plus的开源后台管理前端解决方案,面向需要快速搭建企业级系统的开发团队及初中级前端工程师,适用于中后台管理系统、权限控制界面、数据看板等典型场景。压缩包共299个文件、约3MB&#xf…

2026/10/13 20:09:06 阅读更多 →
嵌入式视觉系统中MT9M001C到LCD的端到端时序设计

嵌入式视觉系统中MT9M001C到LCD的端到端时序设计

简介:本资源是面向FPGA初学者与嵌入式图像处理学习者的实战项目,聚焦于MT9M001 CMOS图像传感器的驱动与实时显示实现,适用于基于Altera/Intel FPGA平台的开发板验证与课程实验。项目完整呈现了从传感器数据采集、FPGA逻辑控制(含时…

2026/10/13 20:09:06 阅读更多 →
PS5全机型优化指南:从版本识别、M.2扩展到HDMI 2.1设置与故障排查

PS5全机型优化指南:从版本识别、M.2扩展到HDMI 2.1设置与故障排查

如果你手头有一台 PS5,或者正打算入手,不管是初版、轻薄版还是 Pro 版,这篇文章都是给你准备的。我写这个东西的起因很简单:群里隔三差五就有人问"我这个 PS5 为什么风扇声音这么大""到底要不要上 Pro""…

2026/10/13 20:09:06 阅读更多 →
STM32跑马灯实验详解:从时钟配置到GPIO驱动与工程下载

STM32跑马灯实验详解:从时钟配置到GPIO驱动与工程下载

简介:这份资源是面向嵌入式初学者与STM32入门者的跑马灯实验例程包,围绕GPIO输出控制这一核心知识点,帮助读者快速上手STM32微控制器的基本开发流程。资源以ALIENTEK MINISTM32开发板为硬件平台,配套完整工程代码与详细注释&#…

2026/10/13 20:09:06 阅读更多 →
Steinberg VST插件开发包入门:从零构建VST3音频插件

Steinberg VST插件开发包入门:从零构建VST3音频插件

简介:Steinberg VST插件开发包(VST3 SDK 3.5版)面向音频插件开发者、音乐软件工程师及数字音频工作站扩展爱好者,提供创建虚拟乐器与音频效果处理器所需的完整开发环境。包内共5764个文件,以html文档、png界面素材、h头…

2026/10/13 20:08:06 阅读更多 →

日新闻

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

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

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

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/13 16:22:04 阅读更多 →
影刀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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →