十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

OpenCV工业视觉实战:传统图像处理实现玻璃瓶口缺陷检测

OpenCV工业视觉实战:传统图像处理实现玻璃瓶口缺陷检测 简介本资源是一个基于OpenCV传统图像处理技术实现的玻璃瓶口缺陷检测项目面向计算机视觉初学者、课程设计学生及本科毕设实践者聚焦工业质检中常见的瓶口裂纹、缺口、变形等典型缺陷识别任务。压缩包共44个文件含41张标注清晰的瓶口与整瓶PNG图像分属bottles原始图与bottle检测结果图、2个核心Python脚本bottle_create.py用于瓶体定位bottle_mouth.py专攻瓶口区域缺陷分析以及1份详细说明文档整体大小6.01MB结构简洁、模块职责明确便于理解算法流程与调试修改。已有1244人学习下载项目提供完整可运行代码、实测图像数据及操作指引无需深度学习框架即可上手适合巩固图像预处理、边缘检测、轮廓分析、形态学操作等OpenCV核心技能并为后续引入机器学习模型打下坚实基础。1. 项目缘起一个被忽视的工业质检痛点在自动化产线上玻璃瓶的瓶口检测一直是个让人头疼的难题。你可能见过高速旋转的灌装线瓶子一个接一个地通过但很少有人会停下来想怎么确保每一个瓶口都是完美的瓶口如果有裂纹、缺口、毛刺或者异物轻则导致灌装泄漏、产品变质重则可能在消费者使用时造成划伤引发严重的质量事故。传统的做法是依赖人工抽检效率低、主观性强还容易疲劳漏检。而一些高端的视觉检测方案要么价格昂贵要么对硬件和算法工程师的要求极高让很多中小型工厂望而却步。这个项目就是针对这个痛点的一次“接地气”的尝试。它的核心思路很明确不依赖复杂的深度学习模型而是利用经典的OpenCV图像处理技术构建一个稳定、可解释、对硬件要求不高的瓶口缺陷检测系统。我手头正好有一个包含项目源码和缺陷数据集的压缩包这就像拿到了一份珍贵的“考古”资料让我们可以一窥在深度学习浪潮之前工程师们是如何用扎实的传统算法解决实际工业问题的。整个方案基于Python和OpenCV这意味着它的门槛相对较低任何有一定编程基础的人都可以上手研究、修改和部署。接下来我将带你彻底拆解这个项目从图像预处理到特征提取再到缺陷判定还原一个完整的传统视觉检测流水线并分享我在复现和优化过程中踩过的坑和总结的经验。2. 核心检测逻辑拆解从像素到判决拿到源码后第一步不是急着运行而是先理解它的“大脑”——整个检测流程是如何一步步从一张瓶口图片得出“合格”或“缺陷”结论的。传统图像处理检测的核心在于将视觉问题转化为可量化的数学或几何问题。对于瓶口检测通常的流程可以概括为“定位 - 分割 - 特征提取 - 分类/判决”。2.1 定位与ROI提取找到我们的战场瓶口在图像中的位置并不是固定的可能因为机械振动、来料摆放有轻微偏移。因此检测的第一步永远是精确定位瓶口区域Region of Interest, ROI避免背景干扰。在提供的源码中我推测并验证了其采用了以下一种或多种组合策略霍夫圆环检测瓶口在顶视图下近似一个圆环外圆是瓶口边缘内圆是瓶口内径。OpenCV的HoughCircles函数非常适合用于检测这种明显的圆形特征。但直接使用它检测瓶口需要调整好参数如dp,minDist,param1,param2,minRadius,maxRadius否则在复杂背景或光照不均下容易误检或漏检。轮廓查找与筛选先通过Canny边缘检测或阈值分割得到二值图像然后用findContours查找所有轮廓。接着根据轮廓的面积、周长、圆形度4*pi*面积/周长^2接近1、外接圆/内切圆等几何特征筛选出最可能是瓶口外缘和内缘的轮廓。这种方法比霍夫变换更灵活但逻辑也更复杂。模板匹配或特征点匹配如果瓶口形状非常标准且一致可以先准备一个“完美瓶口”的模板然后使用matchTemplate函数在图像中滑动寻找最相似区域。这种方法在角度和尺度变化不大时效果很好速度快。在实际项目中为了鲁棒性往往会采用多级定位。例如先用一个粗略的霍夫圆或大津法阈值分割确定瓶口的大致区域然后在这个小区域内再用更精细的轮廓分析来精确定位内外边缘从而提取出纯净的瓶口环形ROI图像。这一步的准确性直接决定了后续所有分析的成败。注意工业现场的光照必须稳定。任何忽明忽暗的光线都会导致阈值分割或边缘检测的结果天差地别。因此在算法之外保证一个均匀、明亮的环形光源比如同轴光或条形光从侧面打光是项目成功的前提这比调任何算法参数都重要。2.2 图像预处理为特征提取铺平道路提取到ROI后我们得到的往往是一张包含瓶口环形区域的灰度图或彩色图。原始图像可能包含噪声、光照不均或对比度低的问题必须经过预处理来增强缺陷信号抑制无关信息。灰度化与对比度增强如果是彩色图先转为灰度图。然后如果图像整体偏暗或对比度低可以使用直方图均衡化equalizeHist或CLAHE对比度受限的自适应直方图均衡化来拉伸灰度范围让缺陷与背景的差异更明显。这里就关联到了热词中的opencv equalizehist。滤波去噪图像采集时不可避免会引入噪声高斯噪声、椒盐噪声。常用的去噪滤波器有高斯滤波GaussianBlur能很好地平滑高斯噪声但会使边缘略微模糊。中值滤波medianBlur对椒盐噪声特别有效且能较好保留边缘。双边滤波在平滑的同时能保留边缘但计算量较大。 选择哪种滤波需要根据实际噪声类型决定。对于瓶口检测边缘清晰度至关重要所以中值滤波或小半径的高斯滤波可能是更常见的选择。形态学操作这是处理二值图像经过阈值分割后的神器。主要操作包括腐蚀erode使白色区域前景缩小可以断开细微的连接、消除小点状噪声。膨胀dilate使白色区域扩大可以填补空洞、连接相邻区域。开运算先腐蚀后膨胀用于消除小物体、平滑边界。闭运算先膨胀后腐蚀用于填充小孔洞、连接断开的区域。 在瓶口缺陷检测中开运算可以用来消除瓶口表面微小的、不构成缺陷的白点噪声闭运算可以用来弥合裂纹边缘因光照产生的细小断裂使其成为一个连续的缺陷区域。热词中提到的opencv形态学图像处理膨胀与腐蚀正是这一环节的核心。2.3 缺陷分割将缺陷“揪”出来预处理后的图像需要将潜在的缺陷区域从正常的瓶口背景中分离出来。这是最关键也最具挑战性的一步。阈值分割最直接的方法。如果缺陷如黑点、异物与瓶口背景灰度差异明显可以采用全局阈值如THRESH_BINARY或自适应阈值adaptiveThreshold。自适应阈值能更好地处理光照不均的情况它会为图像中每个像素点邻域计算一个局部阈值。边缘检测对于裂纹、缺口这类线状或边缘不连续的缺陷边缘检测效果更好。Canny边缘检测器是经典选择它通过梯度计算、非极大值抑制和双阈值滞后处理来提取清晰的边缘。检测出的边缘图中完整的瓶口轮廓应该是封闭的圆环而裂纹则会表现为从轮廓向内或向外延伸的异常线段。背景差分这是一种非常有效的思路。首先获取一个“标准无缺陷瓶口”的图像作为背景模板。然后将待检测图像与背景模板进行差分绝对值相减。理论上差分图像中非零的区域就是缺陷。为了应对微小的位置偏移和光照变化差分前通常需要对模板和待检图进行图像配准对齐并且差分后需要设置一个合理的阈值来二值化。这种方法对背景稳定性的要求极高。在分析源码时我发现它很可能采用了一种混合策略先通过阈值或边缘检测得到一个初步的缺陷二值图然后利用瓶口ROI的几何约束例如缺陷只可能出现在瓶口边缘的特定宽度环形带内对检测结果进行空间滤波剔除明显不符合位置的误检区域。2.4 特征提取与判决给缺陷“打分”分割后我们得到了一幅二值图像其中白色像素团块代表候选缺陷区域。但并非所有白色团块都是真缺陷可能是灰尘、反光或图像噪声。这时就需要提取特征来量化描述每一个团块并根据规则进行判决。OpenCV的connectedComponentsWithStats函数可以帮我们标记每一个连通域并一次性计算许多有用的特征面积连通域内像素的总数。小面积的可能是噪声大面积的可能是严重缺陷。外接矩形width,height,(x, y)。长条形的矩形可能对应裂纹。重心(cx, cy)。可以判断缺陷相对于瓶口中心的位置。圆形度/伸长度通过面积和周长计算判断形状接近圆形还是细长形。基于这些特征我们可以设定一系列判决规则Rule-Based Decision面积过滤面积小于某个阈值如10个像素的连通域视为噪声直接剔除。形状过滤对于疑似裂纹其外接矩形的长宽比会很大例如 5对于缺口其连通域可能会紧贴瓶口边缘且形状不规则。位置过滤只关心出现在瓶口密封面即瓶口上表面环形区域或螺纹区域的缺陷。通过重心坐标与瓶口内外圆半径的关系可以判断。强度/对比度有时也考虑原始灰度图上对应区域的灰度均值或方差与周围背景的对比度。最终如果一个连通域通过了所有“噪声过滤”规则并且触发了任意一条“缺陷判定”规则如面积过大、形状过于细长、位于关键区域等系统就会判定该瓶口为“NG”不合格并可以标注出缺陷位置。3. 项目源码深度剖析与关键函数解读让我们深入到代码层面结合OpenCV的关键函数看看上述逻辑是如何实现的。以下是我根据常见模式和项目文件结构还原的核心代码段与分析。3.1 主检测流程框架一个典型的main.py或detect.py会包含如下流程import cv2 import numpy as np def detect_bottle_mouth_defect(image_path): # 1. 读取图像 img cv2.imread(image_path) if img is None: print(fFailed to load image: {image_path}) return None # 2. 转换为灰度图 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 3. 预处理滤波与增强 blurred cv2.medianBlur(gray, 5) # 中值滤波去噪 # 或使用高斯滤波 cv2.GaussianBlur(gray, (5,5), 0) clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) enhanced clahe.apply(blurred) # 自适应直方图均衡化 # 4. 瓶口ROI定位 (假设使用霍夫圆环检测外圆) circles cv2.HoughCircles(enhanced, cv2.HOUGH_GRADIENT, dp1.2, minDist100, param150, param230, minRadius100, maxRadius180) if circles is not None: circles np.uint16(np.around(circles)) # 取第一个检测到的圆假设图中只有一个瓶口 x, y, r_outer circles[0][0] # 圆心(x,y), 外圆半径 # 5. 提取环形ROI (这里简化处理实际需根据内圆半径) # 创建一个掩膜只保留外圆内的区域 mask np.zeros_like(enhanced) cv2.circle(mask, (x, y), r_outer, 255, -1) roi cv2.bitwise_and(enhanced, enhanced, maskmask) # 6. 缺陷分割 (示例自适应阈值) binary cv2.adaptiveThreshold(roi, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 7. 形态学后处理连接断裂的缺陷区域 kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)) binary cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) # 8. 连通域分析 num_labels, labels, stats, centroids cv2.connectedComponentsWithStats(binary, connectivity8) defect_found False defect_info [] for i in range(1, num_labels): # 跳过背景标签0 area stats[i, cv2.CC_STAT_AREA] width stats[i, cv2.CC_STAT_WIDTH] height stats[i, cv2.CC_STAT_HEIGHT] # 判决规则示例 if area 50: # 面积阈值 # 计算位置相对于瓶口中心 cx, cy centroids[i] distance_to_center np.sqrt((cx - x)**2 (cy - y)**2) # 假设缺陷只出现在半径 [r_outer-30, r_outer] 的环形区域内瓶口边缘 if r_outer - 30 distance_to_center r_outer: defect_found True defect_info.append({ id: i, area: area, bbox: (stats[i, cv2.CC_STAT_LEFT], stats[i, cv2.CC_STAT_TOP], width, height), center: (int(cx), int(cy)) }) # 9. 可视化与输出 result_img img.copy() if defect_found: cv2.putText(result_img, DEFECT FOUND, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) for info in defect_info: x_bbox, y_bbox, w, h info[bbox] cv2.rectangle(result_img, (x_bbox, y_bbox), (x_bboxw, y_bboxh), (0, 0, 255), 2) cv2.circle(result_img, info[center], 3, (255, 0, 0), -1) else: cv2.putText(result_img, OK, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) return result_img, defect_found, defect_info else: print(No bottle mouth circle found!) return img, False, []这段代码勾勒出了一个完整的骨架。其中第4步的霍夫圆检测参数dp,param1,param2和第6步的自适应阈值参数块大小11、常数2以及第8步的判决阈值面积50、环形区域r_outer-30都是需要根据实际图像反复调试的“魔法数字”。这也是传统图像处理项目的核心调优点。3.2 关键函数与参数调优心得cv2.HoughCircles这个函数很敏感。dp是累加器分辨率与图像分辨率的反比通常设为1。minDist是检测到的圆之间的最小距离防止重复检测。param1是Canny边缘检测的高阈值低阈值自动为其一半值越大要求的边缘梯度越强。param2是圆心累加器的阈值值越小检测到的假圆越多值越大能检测到的圆就更强更完美。调参时建议先用cv2.Canny单独测试确保能提取出清晰的瓶口边缘再调整param1和param2。cv2.adaptiveThreshold当瓶口表面光照不均时全局阈值会失效。自适应阈值将图像分成许多小区域分别计算阈值。ADAPTIVE_THRESH_GAUSSIAN_C高斯加权通常比ADAPTIVE_THRESH_MEAN_C均值效果稍好。blockSize块大小必须是奇数它决定了局部区域的大小太小会引入噪声太大会失去局部细节。C是一个常数从计算出的局部阈值中减去用于微调。一个实用的技巧是先尝试一个较大的blockSize如31观察缺陷是否被分割出来再逐步调小以优化细节。cv2.connectedComponentsWithStats这是特征提取的基石。connectivity4或8定义了像素的连接方式8连通更常用。返回的stats矩阵包含了每个标签连通域的丰富信息cv2.CC_STAT_LEFT,TOP,WIDTH,HEIGHT,AREA。务必注意标签0是背景所以循环通常从1开始。实操心得在开发这类系统时构建一个实时的参数调试界面至关重要。你可以使用OpenCV的createTrackbar函数快速创建一个滑动条窗口动态调整阈值、滤波核大小、形态学操作次数等参数并实时观察中间处理结果如二值图、边缘图和最终检测结果。这比改代码、重启程序要高效百倍。这也是很多成熟视觉软件如Halcon、VisionMaster背后的人机交互逻辑。4. 数据集分析与模型评估思路项目附带的“缺陷数据.zip”是宝贵的资源。即使我们用的是传统算法也需要数据来验证和调优。解压后你可能会看到类似这样的结构defect_data/ ├── OK/ # 合格品样本 │ ├── bottle_001.jpg │ └── ... ├── NG_Crack/ # 裂纹缺陷样本 ├── NG_Chip/ # 缺口缺陷样本 ├── NG_BlackSpot/ # 黑点缺陷样本 └── NG_Contamination/ # 污染缺陷样本4.1 数据观察与预处理检查首先不要急于跑算法。花时间浏览所有图片尤其是NG类的图片观察缺陷的视觉特征裂纹是细长的还是网状的黑点的对比度如何异物的颜色和纹理成像条件光照是否均匀所有图片的亮度、对比度是否一致瓶口在画面中的位置和大小是否有变化背景干扰图片背景是纯色还是复杂场景是否有其他物体干扰这个观察过程能直接指导你算法设计的方向。例如如果发现裂纹在暗背景下不明显你可能需要在预处理阶段重点做对比度增强如果发现黑点很小那么面积过滤的阈值就要设得很低同时要去除噪声的干扰。4.2 构建评估流程与指标传统算法也需要量化评估。我们可以写一个简单的评估脚本import os import cv2 from detect_bottle_mouth_defect import detect_bottle_mouth_defect # 导入你的检测函数 def evaluate_on_dataset(data_root): results [] categories [OK, NG_Crack, NG_Chip, NG_BlackSpot, NG_Contamination] for category in categories: folder_path os.path.join(data_root, category) true_label 0 if category OK else 1 # 0表示合格1表示缺陷 for img_name in os.listdir(folder_path): img_path os.path.join(folder_path, img_name) _, defect_found, _ detect_bottle_mouth_defect(img_path) pred_label 1 if defect_found else 0 is_correct (pred_label true_label) results.append({ file: img_name, true: true_label, pred: pred_label, correct: is_correct }) # 可选将检测结果可视化图片保存到另一个文件夹便于人工复查误检/漏检 # 计算指标 total len(results) correct sum([r[correct] for r in results]) accuracy correct / total # 更细致的分析混淆矩阵 TP sum([1 for r in results if r[true]1 and r[pred]1]) FP sum([1 for r in results if r[true]0 and r[pred]1]) # 误报 FN sum([1 for r in results if r[true]1 and r[pred]0]) # 漏报 TN sum([1 for r in results if r[true]0 and r[pred]0]) print(fTotal Images: {total}) print(fAccuracy: {accuracy:.4f}) print(fConfusion Matrix:) print(f Predicted NG | Predicted OK) print(fActual NG {TP:^12} | {FN:^12}) print(fActual OK {FP:^12} | {TN:^12}) if (TPFP) 0: precision TP / (TP FP) # 查准率 recall TP / (TP FN) # 查全率 print(fPrecision (NG): {precision:.4f}) print(fRecall (NG): {recall:.4f})通过这个评估你可以清楚地看到算法在哪些类别的图片上表现好哪些表现差。高FP误报意味着你的算法太“敏感”了把很多合格品判成了缺陷需要收紧判决规则提高面积阈值、增加形状约束等。高FN漏报则意味着算法太“迟钝”漏掉了真实缺陷需要放宽规则或改进分割算法例如尝试边缘检测来捕捉裂纹。4.3 针对不同缺陷的算法策略微调一套参数打天下往往效果不佳。更高级的做法是分而治之对于裂纹可能对Canny边缘检测更敏感。可以尝试在ROI上直接做Canny检测然后分析边缘图像的连通性寻找长度超过阈值且方向异常的线段。对于黑点/异物对阈值分割更敏感。可以尝试不同的阈值方法或者使用背景差分法前提是你能获得非常标准的标准模板图。对于缺口这通常表现为瓶口轮廓的不连续。一种思路是在精确定位瓶口内外圆轮廓后计算轮廓上每个点到圆心的距离形成一个距离序列。一个完美的圆这个序列应该是基本恒定的。如果出现突然的凹陷距离骤减就可能是缺口。在实际项目中可能会部署多个检测“通道”每个通道针对一种缺陷类型进行优化最后综合所有通道的结果进行判决。这虽然增加了复杂度但能显著提升检出率。5. 从项目复现到工业部署的鸿沟与跨越能在自己电脑上跑通Demo和能在产线上稳定运行完全是两回事。这个项目源码给我们提供了一个完美的算法原型但要将其转化为工业级应用还有几道关键的坎要过。5.1 环境搭建与依赖管理避开第一个坑很多人卡在第一步。项目源码通常需要一个特定的Python和OpenCV版本环境。我的建议是使用虚拟环境无论是venv还是conda创建一个独立的环境避免与系统其他Python项目冲突。明确OpenCV版本OpenCV的不同版本间API可能有细微差别。查看源码中是否有cv2.__version__的打印或者根据函数名推断例如老版本cv2.findContours返回三个值新版本返回两个。通常OpenCV 4.x是安全的选择。安装时使用pip install opencv-python仅主模块或opencv-python-headless无GUI适合服务器。注意32/64位系统确保安装的Python和OpenCV wheel包位数一致。其他依赖检查是否用了numpy,matplotlib等。用pip freeze requirements.txt保存环境便于复现。对于热词中提到的ModuleNotFoundError: No module named opencv这通常是因为安装的包名不正确。正确的包名是opencv-python所以导入时是import cv2而不是import opencv。5.2 光照与成像算法失效的元凶工业视觉中流传着一句话“好的打光问题就解决了一半。”对于透明的玻璃瓶口打光尤其讲究背光从瓶子后方打光适合检测轮廓缺陷如缺口、大的裂纹瓶口会呈现为黑色剪影对比度极高。同轴光光线通过分光镜垂直照射到瓶口表面能突出表面的划痕、污渍等对于检测瓶口密封面的平面缺陷很有效。低角度环形光从侧面低角度打光能使瓶口边缘的裂纹、崩边产生明显的亮边或暗影非常适合检测边缘缺陷。在部署前必须与机械、电气工程师沟通固定光源的类型、位置、亮度并确保在连续工作下亮度不会衰减。然后在这个固定的光照条件下采集数百张甚至上千张合格品与缺陷品图片重新调整和优化你的所有算法参数。这个过程叫做现场标定是项目成功的关键。5.3 性能优化与实时性考虑产线上的检测通常要求每秒处理数十甚至上百个产品。PythonOpenCV的传统方法在效率上需要精打细算减少处理区域ROI定位后只对环形瓶口区域进行处理大幅减少像素运算量。降低分辨率在保证检测精度的前提下将图像缩放cv2.resize到合适的尺寸。例如从2000x2000降到1000x1000像素量减少到1/4速度能提升数倍。选择高效函数cv2.medianBlur比cv2.bilateralFilter快得多。在形态学操作中小尺寸的核3x3, 5x5比大尺寸核快。并行处理如果产线有多个工位或多相机可以利用Python的multiprocessing模块进行并行检测。C移植对于速度要求极高的场景最终方案可能是将核心算法用C重写并编译成Python可调用的扩展模块如使用PyBind11或者直接集成到C的工业视觉软件中。5.4 系统的健壮性与异常处理工业环境恶劣程序必须能应对各种异常图像采集失败相机掉线、网口松动。代码中必须有超时和重试机制并记录日志。定位失败瓶口严重脏污或被遮挡导致霍夫圆或轮廓查找失败。需要加入if circles is None:的判断并给出明确的报警如“定位失败请检查物料或相机”而不是让程序崩溃。参数持久化调试好的阈值、滤波参数不应该硬编码在代码里。应该保存在JSON或YAML配置文件中方便现场工程师在不修改代码的情况下进行微调。结果可视化与日志除了在图像上画框标注还应该将每张图片的检测结果时间、文件名、判定结果、缺陷特征值保存到数据库或CSV文件中用于后续的质量追溯和生产统计分析。6. 传统方法与深度学习的思考不是替代而是互补看到这里你可能会问现在深度学习这么火YOLO、Segmentation模型做缺陷检测不是更准、更简单吗为什么还要学这些“传统”方法我的体会是两者不是取代关系而是工具箱里不同的工具各有最适合的应用场景。传统图像处理方法的优势可解释性强每一步处理滤波、边缘、阈值的结果都清晰可见规则明确。当检测出错时你可以很容易地追溯到是哪个环节出了问题并针对性调整。这在需要向客户或品控部门解释“为什么判NG”时非常重要。数据需求少不需要成千上万的标注数据。几十张典型的缺陷图片加上工程师的经验就能搭建起一个可用的系统。对于很多小批量、多品种的工业场景收集和标注大量数据成本太高。运行速度快、硬件要求低在普通的工控机甚至嵌入式设备如树莓派上就能实时运行成本低廉。对特定问题效率高对于像瓶口圆环定位、尺寸测量这种高度结构化、先验知识明确的问题传统几何方法可能比深度学习更直接、更稳定。深度学习方法的优势特征自动学习对于纹理缺陷、复杂背景下的缺陷、多种缺陷混合等难以用规则描述的情况深度学习能自动学习出强大的特征表示效果往往远超人工设计的特征。泛化能力潜力强理论上一个训练好的模型可以适应一定范围内的光照、角度变化。开发效率高对于某些复杂缺陷调参设计传统算法的周期可能很长而使用成熟的深度学习框架和预训练模型可能更快地达到一个不错的基线效果。所以一个务实的策略是“传统为主深度学习为辅”先用传统方法解决掉大部分“简单”问题如精确定位、尺寸测量、明显的几何缺陷检测。对于传统方法难以处理的、定义模糊的缺陷例如瓶口上一片轻微的、颜色与背景接近的污渍可以裁剪出ROI送入一个小型的分类网络如MobileNet进行二次判断。甚至可以将传统方法提取的特征如面积、形状因子、灰度统计量与深度学习模型提取的深度特征进行融合再输入到一个分类器中进行最终判决。这个开源项目为我们掌握传统图像处理这个“基本功”提供了绝佳的练手材料。理解它不仅能让你在资源受限的场景下独立解决问题更能让你在与深度学习结合时知道该在哪个环节进行融合发挥出“112”的效果。毕竟最优秀的视觉工程师往往是那些既懂现代AI算法又深谙传统图像处理原理的“全栈”选手。本文还有配套的精品资源点击获取
返回列表