尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
OpenCV+DNN图像着色实战:从Lab空间到概率分布的完整解析
简介OpenCV与DNN深度学习图像着色项目是一套面向人工智能和计算机视觉初学者的完整示例重点演示如何借助OpenCV的DNN模块加载Caffe预训练模型将黑白照片自动恢复为彩色。压缩包共9个文件约115.61MB包含C工程文件sln、vcxproj、cpp、两张测试图片JPG、caffemodel预训练模型及prototxt网络结构文件可以直观了解工程项目组织、模型加载与推理流程。已有710人学习下载。通过对照预训练模型与示例图片读者能够掌握图像预处理、色彩空间转换、模型调用及结果输出的完整链路项目同时覆盖OpenCV 4以上版本的环境配置要点适合作为入门深度视觉实践的参考模板便于在此基础上扩展训练数据与后处理策略。1. 图像着色不是滤镜先搞懂 OpenCVDNN 这条路解决什么问题拿到一张黑白的老照片想让它自动变彩色第一反应可能是调滤镜或者用 Photoshop 手动分层。但 OpenCV 加 DNN 的图像着色思路完全不一样它不是在原图上刷颜色而是让深度网络去“猜”一个灰度像素最可能的颜色分布。你会用 OpenCV 加载一个预训练模型输入一张灰度图网络输出每个像素的可信色彩概率再把这个概率分布还原成真实颜色。这个方案能解决的实际问题很明确批量给灰度照片、老电影帧、监控灰度图补色而且不需要人工干预。适合的人群是已经会基础 OpenCV 图像处理、想第一次把深度学习模型真正“跑进”传统视觉流水线的开发者。我第一次做这个项目时的感受是它最大的价值不在颜色本身而是让你同时看到传统 CV 和深度学习的交接面前处理还是 OpenCV 那套模型推理交给 DNN 模块后处理又回到像素操作。这篇文章就按这个链路往下拆每一步都给你能直接复现的代码和参数。2. 着色模型的选型逻辑为什么是 Lab 色彩空间和分类式量化2.1 图像着色为什么不能用 RGB 直接回归图像着色在数学上是一个病态问题给定一个灰度值它对应的原始颜色有无穷多种可能。一个像素亮度是 128既可能是橙色墙上的阴影也可能是蓝色衣服的高光。如果直接在 RGB 空间里让网络去回归一个三通道值网络会学到一个很保守的策略把每个像素都输出成一个“平均色”整体灰蒙蒙因为平均值的损失函数最小。这是所有着色项目最容易遇到的第一个翻车点。行业里的主流解法是换色彩空间。最常见的一套做法是转 Lab 空间L 通道管亮度a 通道管红绿b 通道管黄蓝。因为灰度图本身就保留着完整的 L 通道信息网络只需要预测 a 和 b 两个通道问题维度从三维降到两维。更关键的在于Lab 空间的通道独立性比 RGB 好得多网络不需要去理解“R 和 G 同时变化才能表达一个颜色”这种耦合关系。除了预测空间的选择预测目标的形式也很重要。直接用欧氏距离回归 ab 值网络还是会倾向于输出中间值。我一般推荐的方案是分类式量化把 ab 色彩空间离散化成若干个区间比如 313 个 bin网络输出的是一个 313 维的概率分布最后用概率加权求和得到最终的 ab 值。这个设计的巧妙之处在于多峰分布也能被表达——一个像素可能是青色的天空也可能是灰色的石头概率分布会把这两种可能同时记录而不是强行取一个平均值。2.2 选哪个预训练模型colorization_release_v2 还是基于 VGG 的版本在实际落地时OpenCV 的 DNN 模块能加载的着色模型主要有两套都是学术界公开过的经典结构。第一套是 Zhang 等在 ECCV 2016 提出的模型对应仓库里的 colorization_release_v2.caffemodel配套的部署文件是 colorization_deploy_v2.prototxt。这个模型用 ImageNet 训练输入是 1x1x224x224 的单通道 L 图输出是 1x313x56x56 的概率分布。它的优点是在 OpenCV 里开箱即用prototxt 文件里所有层都是 Caffe 标准算子DNN 模块不需要任何扩展就能解析。第二套是基于 VGG16 分类网络改造的版本输入要求 1x3x224x224也就是要把 L 通道复制三遍再喂进去。VGG 版本的表征能力强一点对复杂场景的语义理解更好但模型文件大一圈推理速度也更慢。我的建议是如果你的目标是快速在 OpenCV 流水线里跑通、验证流程直接用 colorization_release_v2如果是要拿着色结果做后续的检测或分割任务再考虑 VGG 版本。这里有一个容易踩坑的细节两个模型输入张量的 shape 不一样很多人拿第一套模型的代码去加载第二套模型网络报错说输入维度不匹配。我在 4.1 节会专门给出两个模型分别对应的前处理代码。模型的 caffemodel 文件一般比较大几十 MB 到两百 MB 不等prototxt 文件很小只有几 KB。OpenCV 官方仓库的 samples/dnn 目录里实际上自带了一份 colorization_deploy_v2.prototxt可以直接对照参考。2.3 OpenCV DNN 模块在这个项目里的边界选型时要清楚 OpenCV DNN 的边界。它不是一个训练框架不支持反向传播它的定位是推理引擎负责把训练好的模型加载进来、做前向计算。你不需要在这里搭建卷积层、写损失函数那些工作是在 PyTorch 或者 Caffe 里完成的OpenCV 只是把模型文件读进来跑一遍。DNN 模块支持 Caffe、TensorFlow、ONNX、TorchScript 等格式着色模型恰好是 Caffe 时代的产物readNetFromCaffe 这个接口就是为它准备的。我还发现一个实用的点DNN 模块跑在 CPU 上的速度对于 224x224 输入的单张图片通常只需要几十毫秒到一百多毫秒远比你想象的快。原因是这个模型本身不大卷积层数量有限。如果你有 NVIDIA GPU编译带 CUDA 后端的 OpenCV推理时间能压到个位数毫秒级。这意味着图像着色完全可以嵌入实时视频处理管线不过需要你自己控制帧率因为逐帧做 Colorization 对 CPU 的压力还是不小。3. 环境与模型加载用 readNetFromCaffe 让 DNN 模块先动起来3.1 OpenCV 安装的两种姿势与一个长期坑在你的机器上装 OpenCV看起来是个无聊的步骤但我在多个版本之间切换时踩过“DNN 模块不可用”的坑。第一种姿势是用 pip 安装预编译 wheelpip install opencv-python和pip install opencv-contrib-python。注意后者包含了 contrib 模块而 DNN 模块在 opencv-python 的主包和 contrib 包里都有。如果你只需要 DNN主包就够了避免两个包同时装上导致冲突。第二种姿势是从源码编译。很多人被网上的教程带着去 cmake 编译实际上只有需要 CUDA 加速、OpenVINO 后端或者自定义算子时才值得这么做。普通图像着色项目没必要自己编译因为 OpenCV 官方发布的预编译 wheel 已经编译好了 DNN 模块CPU 推理完全可用。我自己曾经为了在着色模型里用某个自定义层去编源码编了一下午结果发现根本没有自定义层——着色模型用到全是标准卷积、反卷积和归一化层预编译包直接就能跑。安装完成后务必在 Python 里做一个检查确认当前环境的 OpenCV 版本和 DNN 模块真的可用。这步能帮你避开“chicken 和 egg”式的玄学问题import cv2 print(OpenCV version:, cv2.__version__) net cv2.dnn.readNetFromCaffe(colorization_deploy_v2.prototxt, colorization_release_v2.caffemodel) print(DNN module load ok:, not net.empty())如果你执行到第二行就报错最常见的错误是cv2.error: OpenCV(4.x) ... Caffe parser ...之类的解析失败。这种情况通常是 prototxt 文件路径写错了或者下载的 caffemodel 不完整。我之前有一次下载的模型文件只有 80KB加载时 OpenCV 不报错但运行net.forward()时输出一团乱码——文件被下载服务器截断了。一个稳妥的做法是检查本地模型文件的大小release_v2 的 caffemodel 应该在 120MB 以上如果差太多就是没下载完。3.2 模型加载后的自检把网络结构打出来模型加载成功只是开始你需要确认这个网络在 DNN 模块里的层结构是完整的。着色模型在 Caffe 时代使用了一些特殊层比如Convolution加BatchNorm加Scale的组合OpenCV 的 Caffe 解析器对这几类支持得都不错。但我遇到过一种情况某个版本的 OpenCV 对Permute层的支持有 bug导致 forward 输出维度错乱。所以加载完模型后我建议先打印网络层名字做一个自检layer_names net.getLayerNames() print(total layers:, len(layer_names)) # 输出最后十层的名字确认关键输出层在 for name in layer_names[-10:]: print(name)代码逻辑说明getLayerNames()返回的是字符串列表包含网络里所有层的名字。着色模型的关键输出层通常在最后名字类似class8_ab它输出的就是那个 313 维的概率分布。如果打印结果里没有class8_ab说明你加载错了模型文件或者用的是另一个版本的 prototxt。另有一个参数值得注意OpenCV DNN 在首次调用net.forward()时会做一次网络初始化把中间层的计算图全部建立起来。这个初始化过程在 CPU 上可能要花几百毫秒如果你的程序有超时设置别把它算进单帧处理时间。我之前写过一个图像着色服务第一次推理耗时 1.2 秒第二次只要 80 毫秒就是这个原因。所以在测试性能时一定要先跑一次“预热”推理再开始计时。4. 核心推理链路从灰度 L 通道到 313 类概率再到 AB 通道重建4.1 前处理为什么输入的是单通道 L 图还要做减均值用 OpenCV 做图像着色的前处理核心流程是把 BGR 图转成 Lab取出 L 通道resize 到 224x224归一化然后 reshape 成 NCHW 格式。这里有一个特别容易被忽略的细节模型训练时用的 L 通道归一化方式不是简单的除以 255而是先除以 255 再减去一个固定的值对应 prototxt 里data_l层的 transform 参数这个均值以训练集的统计为准。我用第一套模型colorization_release_v2时的前处理代码如下import cv2 import numpy as np def preprocess_l_channel(bgr_img, net_size224): # BGR 转 Lab因为 OpenCV 用 BGR 顺序 lab cv2.cvtColor(bgr_img, cv2.COLOR_BGR2LAB) l_channel lab[:, :, 0] # 取出 L 通道范围 0~255 # resize 到网络输入尺寸这里不保持比例直接拉伸 l_resized cv2.resize(l_channel, (net_size, net_size)) # 归一化到 0~1再减去训练均值 l_norm l_resized.astype(np.float32) / 255.0 l_norm - 0.5 # 这个均值与模型配套具体值见 prototxt # NCHW 格式1 张图1 个通道高 224宽 224 blob l_norm.reshape(1, 1, net_size, net_size) return blob, l_channel这段代码的逻辑说明COLOR_BGR2LAB转换后三个通道分别是 L、a、b其中 L 是亮度正好是我们需要的灰度信息。l_norm - 0.5是把像素范围从 0~1 平移到 -0.5~0.5这是 Caffe 模型常见的数据分布如果不做这一步模型输出的颜色会严重偏色。reshape(1, 1, 224, 224)对应模型的输入 blob 名字data_l的形状。如果你用的是第二套基于 VGG16 的模型输入从 1 通道变成 3 通道。不是直接把原始彩色图输进去而是把 L 通道复制三次blob cv2.dnn.blobFromImage(l_resized, scalefactor1.0/255.0, size(224, 224), mean(0.5, 0.5, 0.5), swapRBFalse)这个blobFromImage调用里的参数要注意第一个参数是灰度图size是目标尺寸mean是三个通道的均值swapRB必须是 False因为我们输入的是灰度复制通道不是 BGR 彩色图。很多人在这一步直接传 BGR 原图导致模型学习到的亮度分布被彩色信息污染输出结果会出现奇怪的伪影。4.2 推理设置输入并 forward拿到 313 维概率分布推理部分代码很短但有一个关键点输入 blob 的名字必须和网络定义匹配。第一套模型的输入层名字是data_l第二套模型的输入层名字是data。用net.setInput(blob, data_l)显式指定名字可以避免 DNN 模块默认把 blob 塞给第一个层而造成的混乱。# 把预处理得到的 blob 送入网络 net.setInput(blob, data_l) out net.forward(class8_ab) print(输出形状:, out.shape) # 期望输出1 x 313 x 56 x 56参数说明forward里的第一个参数是你要取的那一层的名字。着色的输出层在部署文件里叫class8_ab它的形状是 1x313x56x56。313 是色彩 bin 的数量56x56 是特征图分辨率对应输入 224x224 下采样了 4 倍。有人在这里踩过一个坑直接调用net.forward()不带参数拿到的输出是最新层的输出也就是class8_ab之后的某个层如果你的 prototxt 里加了一个额外的Softmax层或者ArgMax层输出内容就不是概率分布而是类别索引后处理就完全乱了。以我的经验最稳妥的做法是永远显式指定输出层名字。这样即使 prototxt 文件改过只要class8_ab还在代码就不会挂。如果你拿到的输出形状不是四维先检查forward的参数名是不是写对了再检查模型是不是加载成第二套了。4.3 后处理从概率加权到真实 ab 值再拼回 Lab 图网络输出的 313 维概率分布每一维对应一个量化 bin 的中心坐标这个坐标表不是写死在代码里的而是一个独立的pts_in_hull.npy文件。它的形状是 313x2每一行是该 bin 在 ab 空间里的中心点坐标。把概率分布和中心坐标做矩阵乘法就得到当前像素的 ab 值。这一步是分类式量化的核心网络不直接回归 ab 值而是选择最合理的概率组合。后处理完整代码如下def postprocess(out, pts_in_hull, orig_shape, l_channel_orig): # out 形状是 1x313x56x56 out out[0] # 去掉 batch 维度变成 313x56x56 out out.transpose(1, 2, 0) # 变成 56x56x313 # 概率加权每个像素的 ab 值是 313 个 bin 中心坐标的加权和 ab out pts_in_hull # 结果形状 56x56x2 ab ab * 2.606 # 彩度增强系数原论文里的经验值 # OpenCV 的 Lab 表示中ab 范围是 0~255平移到非负区间 ab ab 128 ab np.clip(ab, 0, 255).astype(np.uint8) # 把 ab 通道 resize 回原图尺寸 ab cv2.resize(ab, (orig_shape[1], orig_shape[0])) # 拼接 L 和 ab注意 L 必须用原始灰度图不能用在网络里处理过的 l_orig l_channel_orig.astype(np.uint8) lab cv2.merge([l_orig, ab[:, :, 0], ab[:, :, 1]]) bgr cv2.cvtColor(lab, cv2.COLOR_LAB2BGR) return bgr这里的两个参数值得展开2.606是官方训练代码中采用的一个缩放因子它的作用是放大预测的彩度。因为模型训练时为了让损失函数平稳倾向于输出偏保守的 ab 值不放大就会显得颜色很淡像蒙了一层灰。128是因为模型预测的 ab 值是以 0 为中心的理论范围大约在 -128 到 127而 OpenCV 的像素表示是 0 到 255。在融合这个步骤里有一个很常见的手误是用网络 resize 过的 L 通道去拼 Lab 图那会导致图片尺寸缩小或者清晰度下降。正确做法是用最原始的那张灰度图的 L 通道它和原图尺寸一致保证了输出清晰度不损失。最后用COLOR_LAB2BGR转回显示格式。到这里一张灰度图就完成了自动着色你可以用cv2.imwrite保存结果了。5. 图像着色避坑指南5 个最常见的翻车现象与排查方法5.1 输出一片灰色概率分布没有被正确使用现象跑完整个流程输出的图片看起来还是灰的几乎没有任何彩色像素。原因这个翻车最常见的原因是net.forward()拿到的输出不是概率分布。某些 prototxt 文件的最后一层是Softmax加上ArgMaxforward()返回的是每个像素的色彩类别编号而不是 313 维概率向量。直接拿类别编号去和pts_in_hull做矩阵乘法维度对不上代码直接报错如果强转维度输出就是一团噪声。解决用net.forward(class8_ab)显式指定取class8_ab层的输出。如果该层后面还有Softmax你需要修改 prototxt把class8_ab改为网络的最后一层或者把输出层的名字改成Softmax层之前的那一层。5.2 颜色过艳像油画ab 值没有 clip现象输出图像饱和度极高颜色大面积溢出皮肤变成荧光橙草地像假的塑料。原因模型预测的 ab 值乘以缩放系数后超出 OpenCV 的表示范围。ab 通道在 OpenCV 里是 0~255而模型输出乘 2.606 之后很容易超过 255负值也很常见。如果不做np.clip(0, 255)OpenCV 在转 BGR 时会做隐式截断但截断方式不是你期望的对称截断结果就是色相偏移整个画面像调色过度的滤镜。解决在后处理里严格按顺序加权求和 → 乘缩放系数 → 加 128 →np.clip(0, 255)→ resize。很多人把 clip 放在 resize 之后会导致插值产生新的越界值应该先 clip 再 resize。5.3 输出图像尺寸不对L 通道来源混乱现象输出图片比原图小一圈或者分辨率正确但内容有明显的模糊感。原因典型的错误是在拼接 Lab 时用了网络输入前的 resize 过的 L 通道尺寸是 224x224而 ab 通道已经 resize 回原图尺寸cv2.merge会抛异常或者在某些版本里直接静默生成一个尺寸错误的图。还有人是把原图的彩色 BGR 通道拿去 merge 成了一个 5 通道矩阵。解决把原始灰度图的 L 通道单独保存一份变量贯穿整个后处理过程。cv2.merge里的三个输入必须严格是原始尺寸的 L 通道、resize 后的 ab 第 0 通道、第 1 通道。如果不放心可以在 merge 前打印三个通道的 shape确保完全一致。5.4 模型加载报错 unresolved layerprototxt 版本不匹配现象readNetFromCaffe抛异常提示某层的类型无法解释或者直接 segmentation fault。原因你用的 prototxt 和 caffemodel 不是配套的版本。着色模型有多个版本包括原版 Caffe 训练的 deploy 文件和 OpenCV 重新导出的部署文件某一层的名字或结构有细微差别。比如第一套模型的BatchNorm层在 OpenCV 4.x 某些版本里解析有 bug需要更新到 4.5 以上。解决升级 OpenCV或者换用官方提供的配套 deploy 文件。最简单的方法是把 OpenCV 的 samples 里的colorization_deploy_v2.prototxt拿来直接用不要用别的仓库里改过的版本。如果升级后还是报错检查自己是不是不小心把两个不同模型的文件混用了。5.5 CPU 推理很慢视频实时性不够没有预热与宏块控制现象单张图着色要几百毫秒视频每帧几秒完全没法用。原因着色模型的推理没有做预热第一个帧被网络初始化拖慢另外全分辨率输入 224x224 已经不算大的但如果你在视频场景里每帧都做完整的 resize 和 forwardCPU 的算力依然吃紧。还有一个隐蔽点cv2.resize在高分辨率原图上做 ab 通道插值后处理本身也要占几十毫秒被低估了。解决程序启动后先跑一张 224x224 的黑图做预热推理。对视频流做两件事第一只在关键帧上做着色中间帧用上一帧的 ab 结果加光流做传递第二后处理里的 resize 用cv2.INTER_NEAREST替代默认的双线性插值视觉差异不大速度能快三分之一。如果你对精度要求高可以保持双线性。6. 把模型用到自己的数据上批量着色、单测脚本与效果验证技巧当你跑通了单张图的后处理下一步就是把自己的数据集接进来。最常见的一个场景是给一批老照片批量着色。写一个批处理脚本时建议把前处理、推理、后处理各自封装成函数用glob.glob遍历图片目录把结果写到一个输出目录。文件数量多时注意用cv2.imwrite的输出路径要确保目录存在很多批量脚本第一次运行就挂在目录不存在上。在做批处理前我强烈建议先给模型做一个“单测”准备一张已知的标准测试图比如一张彩色原图先转灰度再着色跑完之后计算两个指标。第一个是 PSNR反映整体重建误差第二个是色度直方图的重叠率看 ab 通道的分布是否接近真实值。这两个指标能让你快速发现模型偏色问题比人眼一张图一张图看靠谱得多。测试图的选择上别用一张包含大量肤色或天空的图片做唯一标准至少要包含室内场景、室外场景和人物肖像三类。如果未来的部署目标是移动端或嵌入式设备我建议把模型转成 ONNX 格式再加载到 OpenCV DNN 里。转 ONNX 的常见做法是先用 PyTorch 加载原始模型定义把权重映射进去然后torch.onnx.export导出动态维度设成None这样输入分辨率不必固定成 224x224。ONNX 版本在某些 OpenCV 版本里加载得到的性能和 Caffe 原生格式差不多但好处是后续可以用 OpenVINO 或 TensorRT 做推理加速而不必重新适配 Caffe 的部署流程。最后分享一个我的习惯着色模型的输出我从来不会直接拿来当最终结果而是把它当作一个初始化叠加一个可选的色彩平衡后处理。因为深度模型对低饱和场景有天然的保守倾向乘一个 1.05 到 1.15 的饱和度增益结果会更讨喜反之如果你的数据本身偏色严重可以做一个自动白平衡再乘一个 0.95 的衰减因子防止颜色过冲。这个参数不是模型的一部分却常常决定你的交付结果是否“看起来舒服”。这一套从模型选型到批量落地的流程我前后在好几个项目里复用过。每次踩坑最多的不是模型本身而是数据形状和通道范围这些“常识性”的错误希望这篇文章帮你把坑提前填平。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

Java销售评价系统课程设计实战:从部署到二次开发

Java销售评价系统课程设计实战:从部署到二次开发

简介:这是一套面向高校学生的Java销售评价系统完整项目资源,适用于课程设计、毕业设计及Java Web入门到进阶的实战练习。项目围绕商品与服务评价管理展开,涵盖用户、角色、销售、评分等核心模块,帮助读者理解从需求设计到编码落地…

📅 2026/9/28 22:53:43
OpenCV DNN图像着色实战:从Lab色彩空间到模型推理与调优

OpenCV DNN图像着色实战:从Lab色彩空间到模型推理与调优

简介:这是一份基于OpenCV与DNN模块实现图像自动着色的深度学习项目资源,适合正在学习计算机视觉、图像处理或深度学习应用的开发者。项目通过C工程与预训练模型,演示了从灰度图像恢复彩色画面的完整流程,可帮助理解卷积神经网络在…

📅 2026/9/28 22:53:43
Model-Optimizer:大模型轻量化三路径实战指南

Model-Optimizer:大模型轻量化三路径实战指南

1. 项目概述:Model-Optimizer不是工具箱,而是模型瘦身的手术台 你有没有遇到过这样的场景:训练好的大模型在RTX 4060笔记本上推理卡成PPT,显存占用飙到98%,GPU温度直冲85℃,风扇狂转像直升机起飞&#xff…

📅 2026/9/28 22:48:42
MORE NEWS

更多资讯

📰

手机上的AI编程工作台:用Termux跑Claude Code实战指南

上个月通勤路上,我用手机改完一个紧急 bug,回来同事问我怎么做到的。我说手机里装了个终端,跑着 Claude Code。他第一反应是:手机也能写代码?能。而且用顺了之后我发现,一套以免费开源工具为基础、能在手机…

📰

上下文工程实战:ChatMemory滑动窗口与Context-mode MCP

如果你也用 AI 编码代理干活,大概见过这种场面:上午刚跟它确认的接口约定,下午它写代码时就忘了;你说“按我们项目里那个工具类来封装”,它反手给你新建了一个风格完全不同的类。很多人第一反应是“模型太笨”&#xf…

📰

Agent安全实战:Runtime Control与Guardrail的七层架构落地

1. 这不是技术演进,是安全水位线的集体失守最近翻了几篇顶会新出的Agent安全论文,标题一个比一个炸:《Guarding the Uncontrollable: Runtime Enforcement for LLM Agents》《SafeChain: Verifiable Execution Traces for Autonomous Agent W…

📰

Compose rememberUpdatedState深度解析:协程读最新值不再难

先说一个真实的翻车现场。上个月我在做公司的一款运动打卡 App,其中有个“自动暂停记录”的功能:用户在户外跑步时,App 要每隔五秒检测一次定位点,判断是否长时间没移动,如果是就自动暂停记录。第一版我用LaunchedEffe…

📰

MLP实现Iris花卉分类:从全连接网络原理到调参避坑实战

简介:这是一份面向机器学习入门者与Python开发者的全连接神经网络(MLP)图像分类实战代码包,基于Iris花卉数据集,使用numpy从零搭建多层全连接网络,涵盖前向计算、反向传播、计算图替代softmax函数以及SGDMo…

📰

海面溢油检测数据集:1800张VOC+YOLO双格式实战指南

简介:这份资源是面向计算机视觉与目标检测学习者的海面石油原油泄漏检测数据集,适用于环境监测、海上应急响应等场景下的模型训练与算法验证。数据集共1817张jpg图片,每张均配有对应的VOC格式xml标注与YOLO格式txt标注,标注类别为…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬