基于BusterNet的图像复制粘贴篡改检测:原理、部署与避坑指南
简介一份基于Python的图像复制粘贴篡改识别毕业设计项目完整资料面向计算机相关专业如人工智能、通信工程、自动化等的在校学生与开发者适合作为毕业设计、课程设计或项目初期演示参考。项目源码已通过导师指导与答辩评审得分95分功能测试稳定可放心用于学习与二次开发。包体共29个文件以Python源码及编译文件为主配合界面布局、说明文档和测试图片等类型压缩包整体约489KB目录结构紧凑清晰便于按模块定位核心代码。当前已有68人学习浏览适合需要快速理解篡改识别流程、补充完整项目案例的读者。内容覆盖图像复制粘贴篡改定位的核心实现包含主程序、模型构建与界面交互模块可借此掌握BusterNet等检测思路亦可在现有代码基础上扩展其他图像取证功能或直接用于毕设课设答辩展示。1. 图像复制粘贴篡改识别这个毕设项目到底做了什么图像复制粘贴篡改Copy-Move Forgery是数字取证领域最典型的篡改方式把图片里的一块区域复制后粘贴到同一张图的另一个位置用来掩盖物体或伪造场景。这种篡改肉眼很难识别因为来源是同一张图颜色、噪声、纹理都高度一致。这个基于 Python 的毕业设计项目做的就是自动检测这类篡改并输出定位掩码把篡改区域在图上标出来。它基于 BusterNet 双分支网络架构配有完整 PyQt5 图形界面输入一张图就能直接看到检测结果适合计算机视觉方向毕业设计、图像取证课设以及想入门深度学习定位任务的人。整套资源除了源码、模型、界面文件还带了详细文档和答辩材料属于拿到就能跑通、能改、能写的完整项目。2. BusterNet 检测原理与资源结构双分支架构和交付的七个关键文件2.1 BusterNet 为什么适合做复制粘贴检测先理解这个任务的核心难点篡改区域与源区域来自同一张图颜色与纹理特征极其相似普通分类网络几乎无法区分。BusterNet 的思路是把任务拆成两条并行分支一条负责找可疑的相似区块另一条负责做像素级分割最后融合输出掩码。BusterNet 的双分支设计视觉相似性分支Visual Similarity Branch采用改进的 SIFT 特征提取在图像中找出重复出现的特征点区域生成候选框。这部分对旋转、缩放有一定鲁棒性但如果篡改区域是平滑纹理比如天空、墙面SIFT 点稀疏效果会明显下降。深度分支Deep Branch用 CNN 对整图做密集特征提取学习像素级别的语义特征弥补 SIFT 在平滑区域找不到特征点的缺陷。融合模块两条分支的输出做通道拼接再经过解码器恢复分辨率最终生成与输入图同尺寸的 mask像素值为 0 表示未篡改、255 表示篡改区域。这个方案的优势在于它是 CVPR 2019 发表的经典算法毕设论文有足够的理论支撑同时两条分支隔离设计改动任意一条分支做消融实验都很方便导师喜欢这种可做对比实验的架构。2.2 压缩包内的完整文件清单拿到压缩包先核对文件结构。整个项目围绕模型预测 界面展示 合成数据集三个模块组织以下是核心文件清单文件职责main.py程序入口调用界面或命令行模式main_ui.py / UIlogin.pyPyQt5 登录界面与主界面的 py 实现BusterNetCore.py双分支模型定义与推理逻辑model.py模型辅助函数加载权重、预处理pasteimage.py自动化合成复制粘贴篡改图用于造数据集cropimagecir.py圆形区域裁剪辅助合成不规则篡改块morepictures.py批量生成多张篡改测试图test.png / masktest.png测试样例与对应标注掩码值得注意的是压缩包里有BusterNetCore.py说明核心模型结构是代码直接定义而非纯权重调用这意味着你可以修改网络结构做消融实验。pasteimage.py这样的合成脚本在毕设里价值很高它解决了深度学习检测任务最头疼的问题——训练数据标注成本。2.3 模型的输入输出约定整个项目围绕预测掩码这一个目标输入输出约定非常明确输入任意尺寸的 RGB 彩色图像内部会统一缩放为 256×256。输出与原图同尺寸的单通道掩码图白色区域即检测到的篡改区域。中间产物模型的输出先归一化到 0~255再经过阈值二值化最后做一次形态学闭运算消除小的空洞与噪点。这个约定贯穿所有脚本后面无论是改界面、写批量测试还是做数据增强都是围绕这个输入输出标准来的。3. 环境搭建与三步启动Python 版本、依赖安装和模型文件放置3.1 Python 版本与依赖选型这个项目的运行核心是 BusterNetCore.py涉及 TensorFlow 的模型定义。压缩包内缓存文件BusterNetCore.cpython-37.pyc表明作者开发环境是 Python 3.7。如果你本机已经装了 Python 3.8 或 3.9也不必强行降级优先尝试以下组合pip install tensorflow1.13.1 pip install opencv-python4.1.0.25 pip install PyQt55.10.1 pip install numpy1.16.0 pip install scikit-image0.15.0需要说明的是tensorflow 1.13.1 版本有较强的环境挑剔性如果你的系统是 Windows 且想省事直接装 CPU 版即可这类图像的推理计算量不大不需要 GPU。如果遇到AttributeError: module tensorflow has no attribute placeholder说明你装的是 TensorFlow 2.x这个项目代码是 1.x 的 API 风格要么降级要么在代码头部加一行兼容层第 5 章会给出具体方案。安装完成后务必用一条命令验证所有依赖到位python -c import tensorflow as tf; import cv2; import PyQt5; import numpy; print(env ok)看到env ok再继续避免后续运行报错时搞不清是代码问题还是环境问题。这一条命令能排除一半以上的玄学报错强烈建议每次换机器部署时都执行一遍。3.2 模型文件放置与目录规范项目中没有看到明显的.h5或.ckpt权重文件大概率权重加载是写在model.py里、从指定目录读取的。实际操作时打开model.py找这样一行model.load_weights(weights/buster_net_weights.h5, by_nameTrue)确保weights文件夹与main.py同级权重文件放在其中。如果你的压缩包内没有权重文件最稳妥的做法是在BusterNetCore.py里找到load_model或restore相关的调用看它指向的路径名再按该路径放置。这里有个毕设中最常用的做法你可以在main.py的单测分支里加载模型后打印模型摘要确认权重接入是否正常def test_load(): from BusterNetCore import init_model model init_model(pretrainedTrue) model.summary() print(模型加载成功)3.3 三步启动从命令行到界面确认环境与权重就绪后项目启动分三步# 第一步直接跑命令行推理验证核心逻辑 python main.py --input test.png --output result.png # 第二步启动登录界面 python UIlogin.py # 第三步在界面中加载图片查看检测掩码首次运行建议走命令行模式因为图形界面的报错信息会被吞掉一部分命令行模式输出更直接。如果main.py不支持--input参数说明入口逻辑是写死的你可以直接改main.py末尾的测试段if __name__ __main__: test_image test.png result detect(test_image) cv2.imwrite(rectangle_result.png, result)这时直接python main.py即可输出文件名为rectangle_result.png见压缩包内同名文件。逻辑不复杂读取图像 → 送入模型 → 输出掩码 → 保存结果本质上就这四步。4. 核心代码解读BusterNetCore 推理链路与 pasteimage 合成逻辑4.1 BusterNetCore 的推理主流程打开BusterNetCore.py捋清它的主干。典型的 BusterNet 实现包含两个关键组件特征提取器和掩码解码器。这里给出常见的函数逻辑结构def detect_tampering(image_path, model): # 读取图像并缩放 img cv2.imread(image_path) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_resized cv2.resize(img, (256, 256)) # 归一化到 [0,1] img_norm img_resized.astype(np.float32) / 255.0 # 增加 batch 维度 input_batch np.expand_dims(img_norm, axis0) # 模型推理 mask model.predict(input_batch)[0] # 恢复原始尺寸并二值化 mask_resized cv2.resize(mask, (img.shape[1], img.shape[0])) mask_binary (mask_resized 0.5).astype(np.uint8) * 255 return mask_binary参数与逻辑说明model.predict输入必须是四维张量所以需要np.expand_dims补上 batch 维输出的 mask 取值在 0~10.5是阈值这个值在模型输出理想时是合理的但实际运行时如果掩码偏灰说明阈值偏低需要调整为0.6或0.7。cv2.resize的 interpolation 参数默认是双线性用于掩码恢复时会出现边缘羽化二值化后会变成锯齿状这是正常现象后续形态学闭运算会修正。4.2 主干网络的两个关键设计def build_buster_net(input_shape(256, 256, 3)): # 共享编码器 encoder create_encoder(input_shape) # 视觉相似性分支 sim_branch create_similarity_branch(encoder.output) # 深度特征分支 deep_branch create_deep_branch(encoder.output) # 拼接融合 concat Concatenate()([sim_branch, deep_branch]) # 解码器恢复原分辨率 output create_decoder(concat) return Model(inputsencoder.input, outputsoutput)这里解释两个容易忽略的细节。第一视觉相似性分支内部通常包含一个特征相关性计算层它的作用是把特征图每个位置与其他所有位置做内积相似度计算这一步计算量很大256×256 的特征图上做全相关耗时极高所以项目里一般会先做一次池化降低分辨率再算相关性这是速度优化的核心。第二融合后的通道数翻倍解码器的第一层卷积核数量也要相应翻倍否则信息瓶颈会限制定位精度。4.3 pasteimage.py 合成篡改图的意义pasteimage.py是整个项目里最实用的脚本之一它帮你批量生成带标注的篡改图。理解它的逻辑你就能自己扩展数据集def create_tampered_image(source_img, mask_region, offset(50, 50)): # 复制源图像的选定区域 tampered source_img.copy() h, w mask_region.shape[:2] # 将区域粘贴到偏移位置 tampered[offset[1]:offset[1]h, offset[0]:offset[0]w] \ source_img[offset[1]:offset[1]h, offset[0]:offset[0]w] return tampered这里的核心思想是从原图取一块区域平移到另一个位置覆盖上去。粘贴后原始位置会出现空白但这个留空区域在语义上不再属于原对象因此真实标注会同时覆盖源区域和目标区域。实际操作时如果你发现网络输出只检测到了粘贴目标而没检测到源区域大概率是训练时标注没有把源区域标进去。检查你的masktest.png样本看它的白区是否包含了两块分离区域——是的检测定位天然要求将源与目标都标记为篡改。cropimagecir.py则补充了非规则区域的场景它用圆形 mask 裁剪源区域使合成数据更接近真实篡改事件中的不规则选取操作。建议你自己跑一遍python pasteimage.py --src test.png --output custom_test.png然后人工检查生成的掩码是否合理这是后续调优最快的数据来源。5. 避坑指南环境兼容、中文路径与掩码异常的四个典型问题5.1 TensorFlow 2.x 环境下 placeholder 报错现象运行main.py时报AttributeError: module tensorflow has no attribute placeholder。原因项目基于 TensorFlow 1.x 的符号式编程graph placeholder而 TF 2.x 默认采用即时执行模式移除了placeholderAPI。解决方式有两种最直接的是降级pip install tensorflow1.13.1如果你不想放弃 TF 2.x可以在BusterNetCore.py的导入部分加一段兼容垫片import tensorflow as tf if tf.__version__.startswith(2.): import tensorflow.compat.v1 as tf tf.disable_v2_behavior()需要注意的是加了兼容垫片后tf.Session()、tf.placeholder都是可用的但部分 Keras API 与 TF 2.x 结合时仍可能有警告建议直接上 1.13.1避免后续反复折腾。5.2 中文路径导致图像读取失败现象界面上选择带中文名的图片程序不报错但输出掩码全黑。原因OpenCV 的imread函数在 Windows 下不支持非 ASCII 路径中文路径读到的图像为空模型输入全零数组。解决方式是统一用imdecode解码def imread_unicode(path): data np.fromfile(path, dtypenp.uint8) return cv2.imdecode(data, cv2.IMREAD_COLOR)在main.py和pasteimage.py里把所有的cv2.imread替换为这个函数就能彻底解决中文路径问题。毕设演示时文件夹用中文命名很常见这条救急方案能让你少掉一半头发。5.3 掩码输出全黑但模型无报错现象推理完成后rectangle_result.png是全黑的。原因通常有两个方向一是模型权重未加载成功二是输出归一化时被错误处理。先检查模型是否加载了权重在model.predict前打印一行调试信息print(模型权重加载状态:, [layer.name for layer in model.layers[:3]])如果前三层都正常输出名字说明网络结构没问题问题在输出层的数值范围。有些模型输出的激活函数是tanh值域在 -1 到 1你期望的 0~255 映射就完全偏了。查看BusterNetCore.py最后一层激活函数如果是tanh把归一化公式改为mask_255 ((mask 1) / 2) * 2555.4 界面无法启动提示No module named PyQt5.sip现象执行python UIlogin.py报ModuleNotFoundError: No module named PyQt5.sip。原因PyQt5 与 sip 版本不匹配常见于使用pip install PyQt5后又被其他依赖覆盖了 sip。解决pip uninstall PyQt5-sip pip install PyQt5-sip4.19.18注意 PyQt5 5.10 对应旧版 sip API到 5.15 就需要新版 sip这个版本差是玄学重灾区。如果上述方式仍不行直接pip install PyQt55.10.1 PyQt5-tools5.10.1一次性锁死版本。6. 用 IoU 指标量化检测精度写个批量评估脚本验证模型真实水平毕设答辩时导师必然问一个问题你这个检测算法的量化指标是多少面对这个问题你不能只拿效果图说事需要有数值指标支撑。这里给出一个基于 IoUIntersection over Union的批量评估方法它不需要额外安装复杂工具库只需在项目目录下新增一个脚本即可。import os import numpy as np import cv2 def compute_iou(pred_mask, gt_mask): pred (pred_mask 127).astype(np.uint8) gt (gt_mask 127).astype(np.uint8) intersection np.logical_and(pred, gt).sum() union np.logical_or(pred, gt).sum() if union 0: return 1.0 return intersection / union test_dir test_images gt_dir gt_masks iou_list [] for name in os.listdir(test_dir): pred detect_pipeline(os.path.join(test_dir, name)) gt cv2.imread(os.path.join(gt_dir, name.replace(.png, _mask.png)), 0) iou compute_iou(pred, gt) iou_list.append(iou) print(f{name}: IoU {iou:.4f})这个脚本把detect_pipeline替换成你项目里的实际检测函数即可。IoU 计算逻辑是核心intersection是预测白色区域与真实白色区域重叠的像素数union是二者并集像素数比值越高说明定位越准。如果某张图IoU低于 0.3优先检查这张图是不是属于平滑纹理类篡改——这是 BusterNet 的已知短板也是答辩时你可以主动说出的模型局限这反而是加分项。为了把 IoU 指标做完整建议你在main.py里加一个批量模式入口def batch_evaluate(input_dir, gt_dir): results [] for img_name in os.listdir(input_dir): pred_mask detect_pipeline(os.path.join(input_dir, img_name)) gt_mask cv2.imread(os.path.join(gt_dir, img_name), 0) iou_score compute_iou(pred_mask, gt_mask) results.append((img_name, iou_score)) avg_iou np.mean([score for _, score in results]) print(fAverage IoU: {avg_iou:.4f}) return resultsdetect_pipeline需要返回与原图同尺寸的单通道 mask0 或 255这一点和第 2 章的输入输出约定一致。跑完后你会看到平均 IoU 通常在 0.4~0.6 之间这个数值在复制粘贴检测领域属于正常范围BusterNet 原始论文在公开数据集上的定位 IoU 中位数也就在 0.5 上下。如果你的结果远低于这个水平检查权重是否加载、阈值是否需要调低以及是否用了不同尺寸的定位掩码作为 GT。从那次之后我每次做类似检测任务都会先写一个批量评估脚本再调参数没有量化指标的一切调优都是玄学。这套流程在你做消融实验的时候同样适用改一个模块跑一次评估对比 IoU 差值论文的实验部分就有真实数据支撑了。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

DDR4信号完整性仿真:Sigrity建模三图两模型一约束

DDR4信号完整性仿真:Sigrity建模三图两模型一约束

1. 为什么DDR4信号完整性问题不是“调调参数就能好”的事? 你手里的那块刚画完的DDR4主板,原理图看起来干净利落,布线也规整,甚至用DRC检查过一遍——但一上电,内存就是不识别,或者跑高频时频繁报错、蓝屏、…

2026/10/9 5:12:41 阅读更多 →
AI网关实战:从模型API混乱到统一治理的落地指南

AI网关实战:从模型API混乱到统一治理的落地指南

以前的公司接入AI能力时,直接让业务方裸调各家大模型API。刚开始问题不大,等业务量起来以后,痛点全暴露了:有人把密钥硬编码在代码里、有团队同一个模型的用量忽高忽低把配额打爆、财务月底发现账单里一半钱是重复调用浪费掉的。后…

2026/10/7 18:39:36 阅读更多 →
AI生成UI工作流:从Figma到React/Tailwind的语义化开发实践

AI生成UI工作流:从Figma到React/Tailwind的语义化开发实践

1. 这不是偷懒,是工作流的彻底重构 “自从有了 AI,我就再也不想拼 UI 了……”——这句话最近在设计、前端、产品团队的茶水间和 Slack 频道里反复刷屏。它听起来像一句带点叛逆的牢骚,但背后藏着一个正在快速落地的现实:UI 构建这…

2026/10/7 18:39:36 阅读更多 →

最新新闻

旧主机再就业:AnyPS5方案实现模拟器、串流与媒体中心

旧主机再就业:AnyPS5方案实现模拟器、串流与媒体中心

1. 项目缘起与核心定位AnyPS5 这个名字第一次出现在我视野里的时候,我正蹲在一堆旧主机配件里翻找能用的散热风扇。当时一个做嵌入式开发的朋友甩过来一句:“你那个吃灰的旧主机,其实还能再榨出点剩余价值。”他说的就是 AnyPS5 这类方案——…

2026/10/9 5:13:23 阅读更多 →
Webstudio 粘贴 Tailwind HTML:将 utility class 一键转换为原生样式

Webstudio 粘贴 Tailwind HTML:将 utility class 一键转换为原生样式

低代码前端 【免费下载链接】webstudio Open source website builder and Webflow alternative. Webstudio is an advanced visual builder that connects to any headless CMS, supports all CSS properties, and can be hosted anywhere, including with us. 项目地址&#x…

2026/10/9 5:13:23 阅读更多 →
OWASP MASTG 技术指南:iOS 符号反修饰(Demangling)——用 swift-demangle 与 c++filt 还原 Swift/C++ 函数签名

OWASP MASTG 技术指南:iOS 符号反修饰(Demangling)——用 swift-demangle 与 c++filt 还原 Swift/C++ 函数签名

文档教程网络安全 【免费下载链接】mastg The OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security W…

2026/10/9 5:13:23 阅读更多 →
判别式法证明不等式

判别式法证明不等式

判别式法证明不等式 a,b,c≥0a, b, c \ge0a,b,c≥0, 求证: 8(b2−ac)(c2−ab)9a(bc)(b−c)2≥08(b^2 - ac)(c^2 - ab) 9a(b c)(b - c)^2 \ge 08(b2−ac)(c2−ab)9a(bc)(b−c)2≥0. 改编自《数学不等式(第一卷)》([罗马尼亚] Vasile&#xf…

2026/10/9 5:13:22 阅读更多 →
Midway 多环境配置完全指南:从配置文件组织到运行时动态注入

Midway 多环境配置完全指南:从配置文件组织到运行时动态注入

后端微服务云原生 【免费下载链接】midway 🍔 A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate w…

2026/10/9 5:13:22 阅读更多 →
Vulkan固定功能阶段详解:从顶点输入到颜色混合的管线配置

Vulkan固定功能阶段详解:从顶点输入到颜色混合的管线配置

很多朋友学到 Vulkan 管线的可编程阶段,写完了顶点着色器和片元着色器,就以为万事大吉。结果在创建VkGraphicsPipelineCreateInfo的时候,突然冒出一大堆结构体要填:顶点输入、输入装配、光栅化、深度模板、颜色混合。这就是 Vulka…

2026/10/9 5:12:22 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

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/8 15:26:32 阅读更多 →
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/8 15:26:40 阅读更多 →
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/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →