☰
太阳能电池板YOLO高变焦检测:24577张数据集训练实战
2026/10/11 0:31:06 网站建设 项目流程

简介:面向太阳能光伏板检测与YOLO模型训练的实际需求,这份压缩包针对高变焦太阳能电池板图像场景,提供了带有标签的光伏板检测标注数据集,能帮助开发者和研究人员快速获得规范标注样本,降低从图像采集、清洗到标注的重复工作。压缩包为zip格式,共2000个XML标签文件,整体约620.88MB;XML文件内记录了光伏板目标的位置框与类别信息,可配合图像转换为YOLO训练所需的数据结构,也便于脚本批量解析与格式整理。目前已有538人学习或下载,适合处于中高级阶段的深度学习使用者,也适用于光伏电站巡检、组件故障筛查等项目场景。数据集源于高变焦拍摄环境,标签覆盖不同视角、光照与背景,细节丰富,有利于强化模型对裂纹、污渍、遮挡等微小缺陷的识别能力;同时,打包好的目录便于直接整理、划分训练集与验证集,帮助提升光伏板自动检测系统的迭代效率与准确率,有效支撑实际运维中的缺陷定位与告警判定。

1. 太阳能电池板检测为什么绕不开高变焦:先看清这24577张图的真正价值

光伏板检测这几年在无人机巡检和分布式电站运维里需求量很大。拿到这份带标签的24577张图像,多数人会直接跑yolo训练,但真正决定模型能不能落地的,不是数量,而是「高变焦」这三个字。高变焦意味着太阳能电池板在画面里往往很小,几十像素的板子在4K甚至8K的大图上挤成一片,反光、阴影、倾斜视角再叠上去,小目标检测的所有难点基本凑齐了。这篇笔记就围绕这个数据集,讲怎么把2万多张图转成能训练YOLO的格式、参数怎么调、坑在哪里,以及最后如何用切片推理把高变焦场景的检出率提上去。适合正在做光伏巡检的工程师,也适合刚入门yolo的人拿这套带标签数据练手。

2. 先弄懂数据再谈训练:把24577张图的结构、标签和成像质量摸一遍

2.1 拿到压缩包先做三件事:解压、看目录、验标签

先解压。文件名里的「yolo算法-太阳能电池板数据集-24577张图像带标签-太阳能光伏板检测-高变焦.zip」已经点明这是为YOLO准备的数据,但压缩包内部的目录结构不能被名称代替。我拿到手的第一件事永远是先看目录和文件数:

unzip "yolo算法-太阳能电池板数据集-24577张图像带标签-太阳能光伏板检测-高变焦.zip" -d solar_panel_dataset cd solar_panel_dataset find . -maxdepth 2 -type d find . -maxdepth 2 -type f | wc -l

把压缩包解压到 solar_panel_dataset 目录下,用 find 列出两层以内的所有目录,看是否已经按 images/ 和 labels/ 分好;再用 wc -l 统计文件总数,和标题里的24577对一下,数量对不上说明可能有空目录或者分批压缩。常见做法是已经分好了 train/val 子目录,但也常见只按原始拍摄批次分文件夹、标签全堆在一个目录里的情形,先摸清再动手。

第二步是验证标签能不能用。我遇到过一万多张图配的标签文件里有不少0字节文件,训练时模型等于把这些样本当成了空背景,val的mAP被拉低不少。用下面的命令把空标签和损坏图片都拎出来看看:

find labels -name "*.txt" -size 0 | wc -l python -c " from PIL import Image import os bad = [] for f in os.listdir('images'): try: Image.open(os.path.join('images', f)).load() except Exception as e: bad.append((f, str(e))) print(f'损坏图片数量: {len(bad)}') for f, e in bad[:20]: print(f, e) "

第一条命令统计空标签文件的数量,第二条遍历 images 目录逐张用 Pillow 加载。加载失败说明文件损坏或根本不是图,这类样本要直接剔除,并同步删除对应的标签文件。这里值得多说一句:空标签本身并不总是要扔。如果一张图里确实没有光伏板,它是很好的负样本;但如果空标签是因为标注时漏标,就会污染训练集。怎么区分,下一个节结合类别统计一起说。

2.2 标签分布统计:类别单一不代表没坑

这批数据集的检测目标大概率只有太阳能电池板一类,但类别单一不等于可以跳过标签统计。YOLO格式的标签每行是「class cx cy w h」,先统计类别数量、框的数量和空标签比例:

import os from collections import Counter label_dir = "labels" counts = Counter() sizes = [] empty_files = 0 for f in os.listdir(label_dir): path = os.path.join(label_dir, f) if os.path.getsize(path) == 0: empty_files += 1 continue with open(path) as fp: for line in fp: parts = line.strip().split() if len(parts) >= 5: cls = int(parts[0]) counts[cls] += 1 w = float(parts[3]) h = float(parts[4]) sizes.append((w * 640, h * 640)) # 按640基准近似像素宽高 print("各类别框数量:", dict(counts)) print("空标签文件数:", empty_files) print("框总数:", sum(counts.values()))

这段脚本扫描 labels 目录下所有txt,按类别统计框数量,同时按640的基准把归一化宽高换算成近似像素值。换算像素宽高是为了快速判断小目标占比:如果一半以上的框宽高都小于32像素,后面训练时 imgsz 必须加大,默认的640输入会对这些小目标很不友好。输出的大致结果值得重点看两个数:一是空标签占比,二是框的尺寸分布。如果空标签只有几十个,直接剔除问题不大;如果上千个,我倾向于保留一部分做负样本,但要在验证集里单独统计它们的表现,避免模型学成「见图就框」。

框尺寸分布还可以用一行排序命令输出极端值,低于5像素的框基本是标注噪声,训练前应该先洗掉:

python -c " import os bad = [] for f in os.listdir('labels'): with open(os.path.join('labels', f)) as fp: for line in fp: p = line.strip().split() if len(p) < 5: continue w, h = float(p[3]), float(p[4]) if w <= 0 or h <= 0 or w > 1 or h > 1: bad.append((f, p)) print('异常框数量:', len(bad)) print(bad[:20]) "

这段检查每个标签文件的坐标是否越界或非正。w或h小于等于0说明标注时画反了或漏了坐标,大于1说明归一化出错。归一化坐标越界在格式转换脚本里最容易出现,后面第三章会写一个更完整的转换方案,这里是先做体检。

2.3 从EXIF看高变焦数据:焦距、分辨率和拍摄距离

「高变焦」不能只停留在文件名里,图像本身的元数据能把拍摄方式说清楚。PIL读EXIF信息就够用:

python -c " from PIL import Image import os sample = os.listdir('images')[:5] for f in sample: im = Image.open(os.path.join('images', f)) exif = im.getexif() print(f) print(' 分辨率:', im.size) print(' 焦距:', exif.get(0x920A) if exif.get(0x920A) else '无') print(' 厂商:', exif.get(0x010F) if exif.get(0x010F) else '无') "

抽几张图看分辨率和焦距。如果普遍是4000×3000往上甚至8K的图,那「高变焦」大概率指望远端的物理拍摄而不是数字裁切,这也意味着训练推理时要非常注意长边尺寸,直接resize到640会丢掉大量小目标。焦距信息还能辅助你判断同一张图里板子的尺度差异:变焦到最长焦段拍的板子,和广角端拍的板子,在图中占的像素可能差十几倍。尺度差异大时,训练集里必须保证每个尺度的样本数量相对均衡,否则模型会倾向输出中等大小的框。

摸完结构和标签,下一步就是把它们整理成YOLO能直接吃的目录和格式。这一步不难,但错一个斜杠就白跑一次训练。

3. 把数据集喂给YOLO:格式转换、目录划分与第一次训练

3.1 VOC/COCO标注转YOLO格式:一个通用的转换脚本

无论压缩包里的标签是xml、json还是txt,最后都要统一成YOLO的txt格式:每行五个数,class cx cy w h,全部归一化到0到1之间。最常见的情况是原始数据用VOC格式(xml)发布,这里给一个通用转换脚本,按目录批量处理:

import xml.etree.ElementTree as ET import os def convert_voc(xml_path, out_txt, class_names): tree = ET.parse(xml_path) root = tree.getroot() width = int(root.findtext('size/width')) height = int(root.findtext('size/height')) lines = [] for obj in root.findall('object'): cls = obj.findtext('name') if cls not in class_names: continue box = obj.find('bndbox') xmin = float(box.findtext('xmin')) ymin = float(box.findtext('ymin')) xmax = float(box.findtext('xmax')) ymax = float(box.findtext('ymax')) cx = (xmin + xmax) / 2 / width cy = (ymin + ymax) / 2 / height bw = (xmax - xmin) / width bh = (ymax - ymin) / height lines.append(f"{class_names.index(cls)} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}") with open(out_txt, 'w', encoding='utf-8') as fp: fp.write('\n'.join(lines)) class_names = ['solar_panel'] xml_dir = 'Annotations' txt_dir = 'labels' os.makedirs(txt_dir, exist_ok=True) for f in os.listdir(xml_dir): if f.endswith('.xml'): convert_voc(os.path.join(xml_dir, f), os.path.join(txt_dir, f.replace('.xml', '.txt')), class_names)

脚本逻辑是按VOC的xml结构解析出图片宽高和每个目标的边框,转成归一化中心点坐标。注意宽高必须从xml里的size字段读,不能从图片文件读——有的数据集图片被二次压缩过,xml里记的还是原始分辨率,用图片实际尺寸做归一化会让所有框整体偏移,这个坑在第五章的避坑节里还会细说。四舍五入保留6位小数足够,不需要更高精度。转换完记得抽样打开几个txt,手工对照原图看看框对不对,格式正确但语义错位的情况并不少见。如果原始数据是COCO的json,逻辑是一样的,只是把xml解析换成json里annotations数组遍历。

3.2 划分train/val/test并生成data.yaml

转换完后统一目录。最终目录结构按YOLO惯例组织:

solar_panel_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml

划分脚本用固定随机种子,保证每次划分结果一致:

import os import random import shutil random.seed(42) images = [f for f in os.listdir('images') if f.endswith('.jpg') or f.endswith('.png')] random.shuffle(images) n = len(images) train = images[:int(n * 0.8)] val = images[int(n * 0.8):int(n * 0.9)] test = images[int(n * 0.9):] for split, files in [('train', train), ('val', val), ('test', test)]: os.makedirs(f'images/{split}', exist_ok=True) os.makedirs(f'labels/{split}', exist_ok=True) for name in files: src_img = os.path.join('images', name) dst_img = os.path.join('images', split, name) shutil.move(src_img, dst_img) txt_name = name.rsplit('.', 1)[0] + '.txt' src_txt = os.path.join('labels', txt_name) dst_txt = os.path.join('labels', split, txt_name) if os.path.exists(src_txt): shutil.move(src_txt, dst_txt)

按8:1:1切分,两张图不会因为扩展名不一致而丢失配对标签。这里要注意:划分必须在图片和标签都还在平铺目录时做,如果已经按子目录分好,要先把所有文件汇总再重划分。24577张图按8成训练就是将近两万张,训练集足够大,val留10%约2400张也够看趋势。划分完检查一下每个split下images和labels文件数是否一致,差一个文件后面训练都会报FileNotFoundError。

然后写data.yaml,这是YOLO训练时的数据入口:

# data.yaml path: /absolute/path/to/solar_panel_dataset train: images/train val: images/val test: images/test nc: 1 names: 0: solar_panel

train和val填的是相对于path的路径。最容易被坑的是path写相对路径,然后训练命令换个工作目录就跑挂。我习惯写绝对路径,或至少保证运行yolo命令的终端工作目录和path一致。nc必须和names的数量对应上,只有光伏板一类就填1。如果你检查标签时发现类别数超过一个,说明原始数据里还有别的目标,names要按实际类别填,不能想当然只写solar_panel。

3.3 用YOLOv8跑通第一次训练:命令与关键参数

目录和配置都齐了,第一次训练先用小模型和相对小的输入尺寸跑通流程,别一上来就追求最优精度:

yolo detect train \ data=../solar_panel_dataset/data.yaml \ model=yolov8s.pt \ epochs=60 \ imgsz=1280 \ batch=16 \ project=runs \ name=panel_first_try

参数含义:model是预训练权重,yolov8s在精度和速度之间比较均衡,第一次跑通用s足够;epochs先设60,确认loss在降而不是震荡再往100加;imgsz设1280而不是默认640,理由是第二章统计的框尺寸——高变焦场景里小目标占多数,640输入经过32倍下采样后,小于20像素的目标在特征图上只剩不到1个像素点,几乎不可分。batch=16要结合显存调整,后面避坑节细说。project和name决定训练日志、权重和曲线图的输出目录,每次实验分开命名,方便后面对比。

跑完先别急着看mAP,打开 runs/panel_first_try/ 下的 results.png,重点看训练集和验证集的box_loss曲线,两者收敛趋势是否一致。loss还在下降就说明epochs不够,继续加;val曲线在某个epoch后开始回升而train还在降,说明过拟合开始,早停或加大数据增强都行。第一次训练的目标不是最优精度,而是确认数据链路、代码链路都能走通,系数跑起来正常后再回头调。

这里还要提一句,如果你习惯用YOLOv5或v11,命令结构几乎一样,v5用python train.py --data ... --img 1280,v11用yolo detect train且data.yaml完全兼容。换版本最要注意的是预训练权重别下错,v8和v11的权重文件不能互相加载。

4. 高变焦场景的检测精度瓶颈:小目标、模糊与尺度变化

4.1 为什么高变焦让YOLO「看不清」:anchor和感受野的局限

高变焦场景里光伏板在原始大图上经常只有二三十个像素宽,这是目标检测最头疼的小目标问题。YOLO把输入图划分成网格,每个网格负责预测中心点落在格内的目标,而特征图经过多次stride下采样后,小目标的信息量会锐减。以YOLOv8为例,检测头分别在8倍、16倍、32倍下采样的特征图上做预测,一个24像素的板子在32倍特征图上对应0.75个像素,只能靠8倍那层特征图勉强响应。换句话说,模型不是「不想检」,是能用于判断的像素太少,和反光、阴影叠加在一起后特征就更模糊了。

很多人第一反应是调anchor,但YOLOv8是anchor-free架构,没有预设anchor需要聚类,调anchor这步只对v5/v7适用。对v8来说,真正有效的杠杆是输入分辨率、感受野和数据增强。另外,光伏板本身纹理重复度高,整片板子的边界在图像里是平行线簇,目标与背景的区分度本来就低于行人、车辆这类纹理丰富的目标,模型容易把板间缝隙、屋顶边缘误判成板子。这种情况下,提升分辨率的作用比换更大的backbone来得直接,后面两个小节按这个顺序展开。

4.2 用imgsz调参:先试这两步,别急着换模型

最直接的手段是提高训练和推理的输入分辨率。把imgsz从640提到1280,小目标在特征图上的有效像素增加一倍,AP的提升肉眼可见;代价是训练显存大约翻四倍,推理时间也成倍增加。一个务实的做法是先用imgsz=960看趋势,确认有效再上1280。我在光伏板项目里的经验是,640到960通常能带来3到5个点的mAP提升,960到1280的提升会变缓,但高变焦极端案例的漏检率下降明显。

imgsz显存占用趋势小目标AP推理耗时适用场景
640低基准低预览、快速验证
960中中中常规巡检
1280高好高高变焦、小目标为主

表格按我自己的经验整理,不同显卡和batch下的具体数值差异很大,但趋势是稳定的。还有一点容易被忽略:yolo训练时默认letterbox会把长边缩放并补灰边,保持宽高比不变。高变焦大图在letterbox后,如果原图宽高比接近1那还好,如果是超宽全景图,缩到1280后小目标一样会丢。遇到这种情况,我会把imgsz保持但配合第六章的切片推理来解决,而不是盲目继续加大分辨率。

4.3 数据增强的取舍:mosaic、copy paste与mixup对光伏板的效果

数据增强对高变焦场景是把双刃剑。Mosaic把四张图拼成一张,等于变相缩小了目标尺寸,对提升小目标鲁棒性有帮助,但当光伏板密集时,mosaic会把一块板子从中间切开,导致标签框跨拼接边界,模型学到的是半块板子特征。YOLOv8默认在最后10个epoch关闭mosaic,原因是此时模型已经在收敛,突然喂进来大量被切碎的目标会打断学习。如果你发现val的box_loss后期震荡,可以检查是否mosaic影响过大。

Copy paste类增强对太阳能电池板这种重复纹理的目标是友好的。光伏板单体形状高度相似,把一块板子复制粘贴到图像空白区域,相当于免费提供高质量样本,对稀疏场景下的漏检改善明显。Mixup把两张图按透明度混合,会让板子边缘和反光更糊,我在这个场景下一般把mixup概率调低或直接关掉,它对行人这类轮廓清晰的目标有效,对边缘靠平行线定义的光伏板反而有害。增强参数在ultralytics里通过训练命令的 mosaic=1.0、mixup=0.0 这类参数直接控制,不用改代码,先跑个短epoch对比再定值。

做对比实验时记得固定随机种子和除增强外的所有参数,否则你分不清提升是增强带来的还是训练噪声。高变焦数据的增强策略没有银弹,最可靠的做法是把几种组合各跑30个epoch看val曲线,再选便宜的方案全量训练。

5. 训练实践避坑指南:损失函数、显存和标注质量的5条踩坑记录

5.1 训练到一半损失函数变成NaN,显卡和数据集谁背锅?

现象:训练跑到第几百个iteration,控制台输出loss的值突然变成nan或者inf,然后整个batch直接跳掉,收敛曲线从此永远缺一块。

原因:最常见的是学习率过大导致梯度爆炸,其次是指标数据的异常值——某个标注框的宽或高是0,或者归一化坐标越界,计算CIoU时除数为0。用混合精度训练时,半精度梯度遇到极小值也可能溢出。不能一上来就怀疑显卡,先用排除法定位。

解决:先把学习率从默认的0.01降到0.001,加一个warmup epoch,如果还nan再查标注数据。用第三章的校验脚本把所有w或h等于0、坐标为负的标签筛出来,单独洗掉。顺便把混合精度关掉跑10个epoch,如果正常,说明你的数据里有样本对fp16不友好——这种情况多出现在极端长宽比的框上。三步都试过还nan,才需要考虑驱动和CUDA版本问题,但概率很低。

5.2 验证集mAP很高,无人机实拍却一个都检不出

现象:训练时val mAP能到0.85,看起来已经是可交付水平;拿无人机或长焦相机实拍的照片一测,漏检率非常高,尤其是远处的小板子。

原因:数据分布不一致。这批数据集的高变焦样本可能集中在某个焦距段或特定光照,而你的实拍照片是在不同高度、不同时间的强反光下拍的。另一个常见原因是推理时的预处理和训练不一致,比如训练用了imgsz=1280,推理脚本却传了640,小目标直接被下采样抹掉了。责任不在数据集本身,而在于你的验证流程没有覆盖真实部署条件。

解决:把实拍图加入验证集,单独统计一份高变焦子集的AP,不要只看全量mAP。mAP是一个加权平均,会把表现好的普通场景和表现差的高变焦场景混在一起。实拍图上如果只是模糊掉点,先用6.1的切片推理跑一遍,通常能拉回来不少;如果还不行,用这些实拍图做增量微调,几百张就够,不要重新训练全部数据。

5.3 24577张全量训练跑不动?先分清是显存不够还是CPU喂不饱

现象:训练刚启动就报CUDA out of memory,或者显卡利用率一直在30%上下波动,GPU长时间排队等数据。

原因:报了OOM的,单纯是batch和imgsz组合超出了显存;显卡利用率低则是数据加载链路有瓶颈。很多人把这两件事混为一谈,以为是显卡不够好就往下降batch,结果利用率继续上不去,训得更慢。

解决:如果是OOM,先降batch而不是降imgsz——小目标场景里分辨率比batch值钱。batch=8配imgsz=1280在消费级显卡上跑yolov8s是常见组合,还不行就开梯度累积,ultralytics里通过accumulate参数控制,等效batch扩大几倍。如果是利用率低,把workers从默认2提到8到12,并把数据放到SSD上,高变焦原图普遍很大,从机械硬盘读4K图会成为瓶颈。判断方法很简单:训练时nvidia-smi看GPU-Util,如果很低同时CPU占用拉满,就是数据加载的锅。

5.4 高变焦图像里的标注框错位:看起来没毛病,训练就是掉点

现象:抽查标签时框贴着板子边缘,肉眼看起来挺准,但训练时val loss始终偏高,个别batch的置信度混乱。

原因:高变焦图里光伏板边缘是斜的,矩形标注框很难和倾斜板面完全贴合,这是标注误差的物理来源,人人都逃不掉。但更隐蔽的错误来自转换脚本:有些原始数据的xml里width/height写的是图像原始分辨率,图片本身被预处理压缩过;或者标注时用了某款工具导出,框坐标已经做过一次归一化,又拿去做了一次除以宽高,导致坐标整体偏移。

解决:写一个交叉校验脚本,把标签框反算回像素坐标画在原图上,批量输出几十张对比图人工扫一眼。重点看边缘贴合度和是否存在系统性偏移——比如所有框都往左上偏2个像素,这通常不是标注者的手抖,而是坐标转换时的坐标系问题。如果发现板子是倾斜的而框是正矩形严重不贴合,唯一有效的方案是换旋转框标注或接受一定误差,不要试图靠调loss去弥补标注的结构性缺陷。

5.5 导出ONNX后精度下降:检测框偏移和NMS阈值的关系

现象:PyTorch里测试一切正常,导出ONNX后用onnxruntime或TensorRT推理,框偶尔偏移几个像素,部分重叠框被漏掉,明明是同一块板子却输出两个框。

原因:PyTorch的NMS和ONNX里的NMS算子实现细节有差异,输出shape固定的问题在动态输入时尤其明显。另一个常见原因是导出时的opset版本选得老,某些算子被翻译成低效实现;还有导出时把输入shape动态化,推理框架处理letterbox的预处理又和训练时不一致,导致框坐标没有被还原到原图尺寸。

解决:导出时固定输入shape,不要用动态维度,imgsz=1280和训练保持一致;opset选12或17都行,选新型号别选太老的。导出后用同一张图对比PyTorch和ONNX的输出,专门看小目标框偏移量和置信度差异。还有一个细节:ONNX推理时如果后处理NMS的IoU阈值设得比训练时高,密集排列的光伏板会保留大量重叠框,看起来像精度下降,其实是阈值没对齐。

6. 验证与落地:用切片推理和大图验证把高变焦收益榨干

6.1 SAHI切片推理:对大分辨率图像最直接的有效手段

高变焦原图动辄几千万像素,直接整图推理要么被letterbox缩掉小目标,要么显存放不下。行业里最常见的做法是用切片推理:把大图切成有重叠的多个小图,分别推理后合并结果。用sahi库可以少写很多胶水代码,命令行大致如下:

sahi predict --source drone_shot.jpg --model_path best.pt \ --model_type yolov8 --slice_width 640 --slice_height 640 \ --overlap_ratio 0.2 --postprocess_type NMSM \ --postprocess_match_threshold 0.5 --output_dir output/

slice_width和slice_height是切片尺寸,640和训练分辨率一致;overlap_ratio取0.2,给切片边缘的目标一个跨越两个切片的冗余,防止目标正好被切在边界上。合并后处理用NMSM做跨切片的去重,match_threshold控制重叠度多高算同一个目标。切片推理对高变焦小目标的提升非常明显,代价是推理次数变多,总耗时上升,适合在巡检后处理阶段跑,不适合实时视频流。

6.2 用混淆矩阵和热力图定位系统性漏检

训练结束后,ultralytics会在验证集上自动生成混淆矩阵和各类曲线。混淆矩阵能看出模型把光伏板错分成了什么——如果光伏板和背景的混淆项特别高,说明大量小目标被当成背景滤掉了,重点补小目标样本;如果错分成其他类,说明类别定义在视觉上有歧义。热力图我一般不看抽象的GradCAM,而是直接把验证集里置信度低于阈值的预测框画出来,标注上真值框,一眼就能看出漏检集中在图像哪个区域:是图像上半部分的远景板子漏得多,还是反光区域漏得多。这个分布直接决定下一步是调增强还是补数据。

6.3 一个我保留的验证习惯

每次训练完,我不只看汇总指标,我会固定挑三张图做人工验收:一张普通光照的巡检图、一张高变焦极限距离的图、一张有强反光的图。三张图各跑一遍切片推理,对照着看漏检和误检。这个习惯帮我挡掉过好几次「mAP高但实际不能用」的翻车交付,也从侧面暴露过训练集里某个光照条件的样本偏少。调imgsz、增强策略这些参数时,我也是拿这三张图的检出数量作为第一判断依据,数值指标反而放后面。如果你也在做光伏板检测这个方向,从拿到这份数据的第一天就保留一组固定的验收图,后面每次实验都在同一标准下对比,比反复刷新mAP数字实在得多。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询