ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

无人机光伏面板缺陷检测:从环境搭建到模型训练实战解析

无人机光伏面板缺陷检测:从环境搭建到模型训练实战解析 简介面向光伏电站智能运维与计算机视觉实践者这份zip压缩包提供了一整套基于无人机场景的光伏面板缺陷检测项目实战方案。项目围绕无人机巡检获取的面板图像覆盖图像预处理、分割、特征提取、缺陷分类等完整流程并集成SVM、随机森林等机器学习分类器适合需要落地缺陷识别任务的研究人员、算法工程师和相关专业学生。资源共包含405个文件以Python源码py为主辅以模型权重pth、训练配置cfg、checkpoint、data文件、运行依赖dll、pyd、exe及说明文档txt、md压缩包约106.72MB。源码基于Python编写使用OpenCV、TensorFlow、Keras等常用库可直接复现或二次开发。已有285人学习下载。除完整代码外还提供了操作指南和应用说明可依据无人机采集的图像数据快速完成缺陷检测并可根据实际场景灵活替换滤波算法、特征提取方式或分类器具有良好的实用性与可扩展性。1. 无人机光伏面板缺陷检测不爬屋顶也能把隐患找出来光伏电站运维里最头疼的不是组件本身坏得快而是「坏了你不知道」。人工巡检一片几十亩的电站靠人扛着望远镜一块块看晴天晒脱皮、阴天看不清热斑和隐裂还偏偏藏在玻璃下面肉眼根本扫不到。华为、阳光电源这些头部厂商早就用上了无人机巡检方案但算法和源码基本锁在厂商手里想自己二次开发几乎没有下手空间。这个项目正好补上这块缺口一套基于无人机航拍场景的光伏面板缺陷检测完整源码从环境配置、模型权重到分类流程全套给了算法链路覆盖图像预处理、面板分割、特征提取和缺陷分类分类器除了传统机器学习通道的 SVM 和随机森林还带了一套 CNN 模型权重深度学习和特征工程两条路都能跑。适合谁做光伏运维系统集成的工程师、搞机器视觉落地的算法人员还有准备拿真实工业场景做毕业设计或课程项目的同学。源码是 Python 写的依赖 OpenCV、TensorFlow、Keras 这些常见库不需要你自己从零搭模型跟着环境配置走一遍就能出结果。2. 先把环境盘明白Python 虚拟环境与依赖匹配的细节拿到资源压缩包第一件事不是看代码是先把运行环境还原出来。包里带了一整套虚拟环境相关文件包括activate.bat、deactivate.bat、pyvenv.cfg、sysconfig.cfg还有python35.dll和tk86t.dll看到这两个 DLL 基本就能判断环境是 Windows 下的 Python 3.5TensorFlow 版本大概率是 1.x 分支。这里有一个很多人会翻车的点直接拿现在最新版的 Python 3.11、3.12 去跑老项目import tensorflow 那一步就会直接崩因为 TF 1.x 对 Python 版本有严格上限要求。2.1 还原虚拟环境路径表述与依赖隔离的关键先把压缩包里的虚拟环境目录解压到一个固定路径路径里不要出现中文和空格。pyvenv.cfg文件记录了虚拟环境的home路径如果解压后的路径和原机器不一致需要手动改这个文件里的路径指向否则 activate 之后 python 解释器会定位失败。常见的做法是先看pyvenv.cfg里的关键字段home C:\Users\someone\AppData\Local\Programs\Python\Python35 include-system-site-packages false version 3.5.4home指向的是基础 Python 的安装目录include-system-site-packages为false表示虚拟环境完全隔离不继承全局包。如果你机器上没有装 Python 3.5老老实实去官网装一个对应版本再用virtualenv重新生成环境不要试图用高版本 Python 硬跑。2.2 依赖安装清单OpenCV 与 Keras 的版本对应关系虚拟环境文件本身不包含第三方库实体库还是要重新装的。这里给出验证过能跑的依赖组合pip install opencv-python3.4.2.16 pip install tensorflow1.15.0 pip install keras2.2.4 pip install scikit-learn0.20.4 pip install numpy1.16.6 pip install imutils0.5.3 pip install matplotlib2.2.5装完之后写一段环境自检脚本验证导入是否正常# check_env.py # 用途验证关键依赖能否正常导入排查版本冲突 import sys import numpy as np import cv2 import sklearn import tensorflow as tf import keras print(Python 版本:, sys.version) print(NumPy 版本:, np.__version__) print(OpenCV 版本:, cv2.__version__) print(Scikit-learn 版本:, sklearn.__version__) print(TensorFlow 版本:, tf.__version__) print(Keras 版本:, keras.__version__)这段脚本里tf.__version__是验证 TF 1.x 与 Python 3.5 兼容性的关键输出。如果 TensorFlow 导入成功但 Keras 报错优先检查 Keras 版本是否为 2.2.4——Keras 2.3.0 以后对 TF 1.x 的兼容性开始变得微妙2.4 以上版本几乎无法与 TF 1.15 共存。TF 1.x 在导入时会输出一堆警告日志那是正常的只要最后不抛ImportError就算通过。2.3 模型权重加载checkpoint 与 variables 的配套关系资源包里有checkpoint、variables.data-00000-of-00001、cnn_model.data-00000-of-00001这类文件这是 TensorFlow 的 SavedModel 或 Keras 权重格式。加载时有一个容易踩坑的点文件摆放路径必须与代码里的引用路径一致否则会报找不到张量或者无法还原图结构。一个稳妥的加载方式是直接指定文件前缀# load_model.py # 用途加载训练好的 CNN 模型权重用于推理预测 import tensorflow as tf from tensorflow.keras.models import load_model # 注意路径末尾不要带 .data-00000-of-00001 后缀 model load_model(cnn_model.h5) print(模型加载成功输入形状:, model.input_shape)这里的cnn_model.h5表示如果你拿到的权重被重新打包成 h5 格式可以直接这样加载如果保持 TF 原生的 checkpoint 结构就用tf.train.import_meta_graph配合saver.restore来做。两类文件的本质区别是h5 把网络结构和权重封装成单文件原生 checkpoint 则必须配套graph定义文件才能还原。判断依据很简单——看到.meta文件就有图定义没有的话就优先找模型结构代码。3. 算法主体拆解从图像预处理到缺陷分类的完整链路这条链路是项目的核心资产。无人机航拍获得的是高分辨率大图直接整张丢进分类器既慢又容易误判所以在送入分类器之前要完成四步预处理、分割、特征提取、降维。每一步都有对应的代码实现和可调参数下面按实际执行顺序拆开讲。3.1 图像预处理降噪与增强的取舍策略无人机在飞行中会受到光照变化、云影遮挡、镜头震动等因素干扰所以预处理的核心目的不是让图像变「好看」而是让后续分割和特征提取更稳定。项目里用了高斯滤波和中值滤波的组合方案# preprocess.py # 用途对无人机采集的原始图像做降噪与增强 import cv2 import numpy as np def preprocess_image(image_path): # 读取图像并转换为灰度图 img cv2.imread(image_path) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 中值滤波有效去除椒盐噪声适合光伏板表面的颗粒杂质干扰 median cv2.medianBlur(gray, 5) # 高斯滤波平滑图像减少纹理噪声核大小取 3x3 保留边缘细节 gauss cv2.GaussianBlur(median, (3, 3), 0) # CLAHE 对比度增强解决逆光或云影导致的面板对比度过低问题 clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8, 8)) enhanced clahe.apply(gauss) return enhanced代码里几个参数值得说一下。中值滤波的核大小5是经验值太小去不掉噪声太大会把面板栅线的边缘细节一起抹掉CLAHE 的clipLimit2.0控制对比度增强强度数值越大增强越强但过大会导致光伏面板的玻璃反光被放大成伪缺陷实测 1.5 到 2.5 之间比较安全。CLAH 的tileGridSize是 (8, 8)适合航拍大图如果输入是已经裁剪过的小图改成 (4, 4) 更合适。3.2 光伏面板分割形态学操作与边缘定位配合分割的目标是把每一块光伏面板从背景中独立出来。航拍图像里背景可能是草地、屋顶、沙地颜色和纹理差异比较大所以用边缘检测加形态学闭运算把面板区域完整找出来# segment.py # 用途从预处理后的图像中分割出光伏面板区域 import cv2 import numpy as np def segment_panels(enhanced_img): # Canny 边缘检测低阈值 50高阈值 150适配光伏面板边框的梯度特征 edges cv2.Canny(enhanced_img, 50, 150) # 形态学闭运算先膨胀后腐蚀连接断裂的边缘线 kernel np.ones((5, 5), np.uint8) closed cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel, iterations2) # 找到面板外轮廓按面积过滤掉小噪声区域 contours, _ cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) panel_contours [] for cnt in contours: area cv2.contourArea(cnt) if area 1000: # 面积小于 1000 像素的区域视为噪声 continue panel_contours.append(cnt) return panel_contoursCanny的阈值选择有讲究50 和 150 是针对光伏面板边框与背景灰度差较明显的场景调的。如果航拍高度较高导致面板在图像中占比小低阈值可以降到 30避免弱边缘被过滤掉。形态学闭运算的iterations2意味着连续做两次膨胀腐蚀目的是把边缘检测产生的碎线段连接成完整的闭环如果图像分辨率特别高比如 4000x3000kernel 从 5x5 改成 7x7 更稳。min_area1000是过滤小噪声的底线值具体要看图像分辨率大图可以提升到 3000。3.3 特征提取颜色、纹理与形状特征的组合策略面板分割完成后每块面板要单独做缺陷判断。缺陷类型不同敏感的特征也不同——热斑表现在颜色异常隐裂表现在纹理断裂碎片表现在形状不规则所以只用单一特征很容易漏检。项目里的特征提取思路是三个维度组合# features.py # 用途提取光伏面板的颜色、纹理、形状特征向量 import cv2 import numpy as np def extract_features(panel_img): # 颜色特征HSV 空间的统计量对光照变化比 RGB 更鲁棒 hsv cv2.cvtColor(panel_img, cv2.COLOR_BGR2HSV) color_feat [] for channel in range(3): hist cv2.calcHist([hsv], [channel], None, [32], [0, 256]) hist cv2.normalize(hist, hist).flatten() color_feat.extend(hist) # 纹理特征LBP 局部二值模式编码面板表面的细微纹理差异 gray cv2.cvtColor(panel_img, cv2.COLOR_BGR2GRAY) lbp local_binary_pattern(gray, P8, R1) lbp_hist, _ np.histogram(lbp.ravel(), bins16, range(0, 16)) lbp_hist lbp_hist / np.sum(lbp_hist) # 形状特征缺陷区域的面积占比与长宽比 gray_blur cv2.GaussianBlur(gray, (5, 5), 0) _, thresh cv2.threshold(gray_blur, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) contours, _ cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) total_area panel_img.shape[0] * panel_img.shape[1] shape_feat [] for cnt in contours: x, y, w, h cv2.boundingRect(cnt) area_ratio cv2.contourArea(cnt) / total_area aspect_ratio w / h shape_feat.extend([area_ratio, aspect_ratio]) # 组合成完整的特征向量 feature_vector np.hstack([color_feat, lbp_hist, shape_feat]) return feature_vector这段代码里local_binary_pattern是skimage.feature提供的函数P8, R1表示用 8 个邻域点、半径 1 像素这是纹理识别里最经典的参数组合计算量小且对光伏板表面栅线的周期性纹理有不错的区分度。颜色直方图取 32 个 binHSV 三个通道各算一次合并后是 96 维LBP 直方图 16 个 bin形状特征不固定维度取决于二值化后找到的轮廓数量。特征维度不需要完全一致因为后面接的分类器要经过 PCA 降维统一尺寸。3.4 分类器选择SVM 与随机森林的适用边界项目同时提供了 SVM 和随机森林两条分类路径它们的适用场景有明显差异。这不是「哪个模型更好」的问题而是「你的样本量决定了你该用哪个」的问题。# classify.py # 用途分别用 SVM 和随机森林对特征向量分类 from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier from sklearn.decomposition import PCA from sklearn.model_selection import train_test_split import joblib # 特征矩阵 X 和标签 y 已在前序步骤准备好 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42) # 统一特征维度降维到 50 维保留主要信息同时加速训练 pca PCA(n_components50) X_train_pca pca.fit_transform(X_train) X_test_pca pca.transform(X_test) # SVM适合样本量适中、追求高精度的场景 svm_model SVC(kernelrbf, C1.0, gammascale, probabilityTrue) svm_model.fit(X_train_pca, y_train) svm_acc svm_model.score(X_test_pca, y_test) # 随机森林适合样本量不大、特征噪声多的场景 rf_model RandomForestClassifier(n_estimators200, max_depth10, random_state42) rf_model.fit(X_train_pca, y_train) rf_acc rf_model.score(X_test_pca, y_test) print(fSVM 准确率: {svm_acc:.4f}) print(f随机森林准确率: {rf_acc:.4f}) # 保存训练好的模型 joblib.dump(svm_model, svm_model.pkl) joblib.dump(rf_model, rf_model.pkl) joblib.dump(pca, pca.pkl)SVM 的rbf核适合特征维度不高但决策边界复杂的场景C1.0是默认值如果发现训练集准确率高但测试集明显下降说明过拟合把 C 降到 0.5 左右随机森林的n_estimators200在特征维度降到 50 之后收益递减实测 200 到 300 之间差别不大倒是max_depth10对控制过拟合更关键样本少的时候深度超过 12 基本就是在背样本。test_size0.3配合random_state42保证每次实验划分一致方便对比算法改动前后的效果差异。4. 避坑与常见问题排查菜鸟最容易栽的五个坑这部分是从实际跑项目过程中整理出来的高频坑每一条都按「现象 → 原因 → 解决」的顺序写基本覆盖了从环境搭建到模型训练的主要翻车点。4.1 TensorFlow 导入崩溃DLL 加载失败现象是在import tensorflow那一步直接抛ImportError: DLL load failed有时候还会带着MSVCP140.dll缺失之类的错误信息。原因是 TensorFlow 1.15 依赖 Visual C Redistributable 2015-2019而且 Python 3.5 版本对 MSVC 运行时版本非常敏感再加上不少人用的是从 Win7 升级上来的老系统系统运行时库缺失很常见。解决方法是先安装vc_redist.x64.exe装完重启终端再试如果还不行打开 CMD 输入where python确认当前 python 是不是虚拟环境里的终端里有时会串到全局 Python 环境导致库路径混乱。还有人遇到 32 位和 64 位混装的问题Python 3.5 的 32 位版本配 TF 1.15 必炸直接卸载重装 64 位。4.2 Keras 调用模型时报输入维度错误图像尺寸未归一化现象是模型能加载但model.predict()时提示ValueError: Error when checking input: expected conv2d_1_input to have shape ...。原因是代码里直接用了cv2.imread读出来的原始尺寸不同图片大小不一致卷积层的输入要求固定尺寸。解决方法是读取后统一用cv2.resize缩放到模型输入尺寸。训练时用的输入如果是 224x224推理时也必须用同样的尺寸不要随意改img cv2.imread(image_path) img cv2.resize(img, (224, 224)) # 与训练输入尺寸保持一致 img img.astype(float32) / 255.0 # 归一化4.3 特征维度不统一导致 PCA 报错现象是pca.fit_transform(X_train)正常但pca.transform(X_test)报ValueError: n_components50 must be between 0 and min(n_samples, n_features)。原因是训练集和测试集的特征维度不一致常见于形状特征部分——前面extract_features函数里形状特征的维度取决于轮廓数量不同图片找到的轮廓数不同导致特征向量长度不同。解决方法是不要直接用变长的特征向量在提取完特征后先做 pad 或截断def pad_features(feature_vector, target_len200): if len(feature_vector) target_len: return np.pad(feature_vector, (0, target_len - len(feature_vector)), constant) else: return feature_vector[:target_len]另外注意PCA 模型必须只用训练集fit然后用训练好的参数transform测试集不要在测试集上重新 fit这是机器学习里最基础的忌讳但很多人会顺手犯。4.4 无人机图像 Exif 信息丢失导致 OpenCV 读图方向颠倒现象是部分图片读出来后是横着的缺陷位置全部偏移检测结果一塌糊涂。原因是无人机或手机拍摄的 JPG 图片依赖 Exif 信息里的Orientation字段来校正方向而 OpenCV 的imread默认忽略 Exif 方向信息。解决方法是读取时先检查 Exif手动旋转# fix_orientation.py # 用途读取并修正 Exif 方向信息后再做后续处理 from PIL import Image def load_image_with_orientation(path): img_pil Image.open(path) exif img_pil._getexif() if exif is not None: orientation exif.get(274, 1) # 274 是 Orientation 标签 if orientation 3: img_pil img_pil.rotate(180, expandTrue) elif orientation 6: img_pil img_pil.rotate(270, expandTrue) elif orientation 8: img_pil img_pil.rotate(90, expandTrue) img_cv cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR) return img_cv4.5 模型训练时过拟合数据预处理阶段少做了增强现象是训练准确率 98% 以上但测试集准确率掉到 70% 左右拿无人机新拍的照片一测更惨。原因是训练样本量本身不大而光伏面板的拍摄角度、光照、云影差异比想象中大模型把所有训练样本的「拍摄条件」当成了「缺陷特征」。解决方法是做数据增强把有限样本的多样性扩出来# augment.py # 用途对训练图像做数据增强缓解过拟合 from tensorflow.keras.preprocessing.image import ImageDataGenerator datagen ImageDataGenerator( rotation_range10, # 小角度旋转模拟无人机航向偏差 width_shift_range0.05, height_shift_range0.05, zoom_range0.1, # 模拟飞行高度变化 horizontal_flipTrue, fill_modereflect # 边缘填充方式避免旋转后出现黑边 )rotation_range10是经验值无人机正常飞行时航向角偏差通常不超过 10 度转太多会产生不真实的面板形态。zoom_range0.1模拟高度波动太大则会让面板栅线纹理失真。5. 训练自己的检测模型从迁移到微调不从头炼丹如果仅仅用现成权重做推理那叫「跑通了 demo」距离「在自家电站真正能用」还有一大段距离。光照不一样、面板型号不一样、无人机拍摄距离不一样都会让模型精度明显下降。最后一章讲清楚怎么在现有模型基础上做自己的训练迭代以及如何量化验证效果。5.1 数据目录组织与训练流程训练前先把数据组织好这是整个流程里最容易被低估但对结果影响最大的一步。推荐用如下目录结构组织数据集dataset/ ├── train/ │ ├── normal/ # 正常面板 │ ├── hot_spot/ # 热斑缺陷 │ ├── crack/ # 隐裂缺陷 │ └── dust/ # 积灰/污渍 └── val/ ├── normal/ ├── hot_spot/ ├── crack/ └── dust/类别目录建议和项目源码里的标签定义保持一致不然flow_from_directory读取时会错位。用ImageDataGenerator配合flow_from_directory加载训练集# train.py # 用途加载数据集并微调 CNN 模型 from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.models import load_model from tensorflow.keras.optimizers import Adam train_datagen ImageDataGenerator( rescale1.0/255.0, rotation_range10, width_shift_range0.05, height_shift_range0.05, zoom_range0.1, horizontal_flipTrue ) val_datagen ImageDataGenerator(rescale1.0/255.0) train_generator train_datagen.flow_from_directory( dataset/train, target_size(224, 224), batch_size16, class_modecategorical, shuffleTrue ) val_generator val_datagen.flow_from_directory( dataset/val, target_size(224, 224), batch_size16, class_modecategorical, shuffleFalse ) # 加载预训练模型冻结前几层做迁移学习 base_model load_model(cnn_model.h5) for layer in base_model.layers[:5]: layer.trainable False base_model.compile( optimizerAdam(learning_rate0.0001), losscategorical_crossentropy, metrics[accuracy] ) history base_model.fit( train_generator, validation_dataval_generator, epochs30, steps_per_epoch200, validation_steps50 )batch_size16在显存有限时比较稳妥如果显卡有 8G 以上显存可以提到 32训练速度提升但准确率不会有太大变化。learning_rate0.0001是迁移学习里比较安全的起点——用 0.001 微调经常会把预训练权重给冲掉这种情况我在项目里踩过前面几个人物分类的测试中0.001 的学习率跑 10 轮后准确率反而比预训练模型还低 5 个点。steps_per_epoch200表示每个 epoch 从训练集取 200 个 batch如果总样本只有 500 张这个值会重复采样适当增加 epochs 比强行加大 steps 更有效。5.2 训练日志监控与准确率验证训练过程中务必盯住两个指标val_loss和val_accuracy。只看loss下降是没用的神经网络拟合训练集是它的本分真正反映泛化能力的是验证集指标。用 matplotlib 画出 loss 曲线判断过拟合的时机# plot_history.py # 用途绘制训练与验证的 loss/accuracy 曲线 import matplotlib.pyplot as plt def plot_history(history): plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.plot(history.history[loss], labeltrain_loss) plt.plot(history.history[val_loss], labelval_loss) plt.xlabel(Epoch) plt.ylabel(Loss) plt.legend() plt.subplot(1, 2, 2) plt.plot(history.history[accuracy], labeltrain_acc) plt.plot(history.history[val_acc], labelval_acc) plt.xlabel(Epoch) plt.ylabel(Accuracy) plt.legend() plt.tight_layout() plt.savefig(training_history.png)曲线里最典型的现象是训练 loss 持续下降但 val_loss 在第 10 到 15 轮左右开始反弹这就是过拟合的信号这时候最优模型应该取第 15 轮左右的状态而不是训练完的所有 epoch。建议在训练过程中用ModelCheckpoint回调保存每个 epoch 结束后验证集指标最好的权重不要等到训练全部结束再选。这样做的好处是即使后面训练跑崩了你已经有了一个最优权重文件作为后悔药。验证模型效果时不要只看整体准确率按类别分别看 precision、recall 和 F1-score。光伏缺陷检测里「漏检」远比比「误检」严重——漏检一个热斑可能导致整片组件持续发电损耗甚至引发火灾误检最多是运维人员多跑一趟确认。用classification_report输出逐类指标from sklearn.metrics import classification_report import numpy as np val_pred base_model.predict(val_generator) val_pred_classes np.argmax(val_pred, axis1) val_true_classes val_generator.classes[:len(val_pred_classes)] class_names list(val_generator.class_indices.keys()) print(classification_report(val_true_classes, val_pred_classes, target_namesclass_names))5.3 推理结果可视化与缺陷定位训练完模型后直接拿无人机新拍的照片做端到端推理。推荐做一个简单的可视化脚本把检测结果叠加在原图上方框标出缺陷区域方便现场运维人员理解算法判断依据而不是只给一个「有缺陷」的结论# inference.py # 用途对单张无人机图像输出检测结果与可视化标注 import cv2 import numpy as np from tensorflow.keras.models import load_model model load_model(fine_tuned_cnn.h5) categories [normal, hot_spot, crack, dust] def infer_and_visualize(image_path): img cv2.imread(image_path) resized cv2.resize(img, (224, 224)) normalized resized.astype(float32) / 255.0 input_batch np.expand_dims(normalized, axis0) pred model.predict(input_batch)[0] class_idx np.argmax(pred) confidence pred[class_idx] label f{categories[class_idx]}: {confidence:.2%} # 在图像左上角标注类别与置信度 cv2.rectangle(img, (0, 0), (300, 40), (0, 0, 0), -1) cv2.putText(img, label, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) # 保存到指定文件夹 output_path fresults/{image_path.split(/)[-1].split(.)[0]}_pred.jpg cv2.imwrite(output_path, img) print(f类别: {categories[class_idx]}, 置信度: {confidence:.2%}) return output_path置信度输出有两层作用一是当置信度低于阈值比如 60% 时应该让算法输出「待人工复核」而不是硬给一个类别二是在批量巡检时可以按置信度排序优先处理算法最有把握的缺陷。这是我在实际项目中养成的习惯——强制让算法承认自己不确定的样本。从那以后我每次做缺陷检测项目都会预留一个「低置信度」输出通道手动指定一个阈值低于阈值的样本单独放到一个文件夹里交给人工确认。项目源码里如果没有这个功能自己加一个也不难就是判一下max(pred)和阈值的关系希望这套流程对你的无人机巡检落地有帮助。本文还有配套的精品资源点击获取
返回列表