毕业设计:基于计算机视觉的大蒜蒜粒品质检测
毕业设计:基于计算机视觉的大蒜蒜粒品质检测
随着农业现代化和智能化的发展,传统的人工质量检测方式逐渐无法满足大规模生产的需求。大蒜作为一种重要的农作物,其品质直接影响到市场需求和经济效益。实现自动化的品质检测不仅能够提升检测效率,降低人力成本,还能提高检测的准确性。通过深度学习和计算机视觉技术,结合自制数据集,可以有效地识别和分类大蒜蒜粒的质量,帮助农民和企业更好地管理和优化生产流程。
技术思路
算法理论基础
1.1 特征提取
基于面积和颜色特征对大蒜蒜粒进行品质检测,设计的检测流程主要分为大蒜蒜粒图像输入、图像预处理、特征提取、品质识别与标记四部分。相机拍摄获得的大蒜蒜粒图像为彩色图像,由红、绿、蓝三个独立分量图像组成。彩色图像处理需要较大的数据量,并且在拍摄过程中会受到设备、外界环境等各种条件的影响,导致图像存在瑕疵,因此需对图像进行预处理,以提高检测效果。
对采集的大蒜蒜粒图像进行灰度化处理,即将RGB图像转换为灰度图像。灰度图像不含色彩信息,仅包含亮度特征,类似于黑白照片,只展示亮度变化。量化亮度值的操作通常将灰度级划分为0-255的256个级别,其中0代表全黑,255代表全白。灰度图像通常用于图像处理。灰度化的目的是将RGB图像转换为灰度图像,去除色调特征和饱和度信息,同时保留亮度。实现灰度化有多种方法,如最大值法、平均值法和加权平均法。在获取大蒜蒜粒图像的过程中,容易受到工作环境和设备特性的影响,导致噪声产生;
图像分割是将图像分成若干个特定区域并提取感兴趣目标的技术与过程,是图像处理到研究分析的重要步骤。目前主要有几种图像分割方法:阈值分割法、区域分割法、边缘分割法以及基于一定理论的分割方法。利用中值滤波法可以有效去除大蒜蒜粒图像中的随机噪声,但仍可能存在一些影响较大的小颗粒噪声。此外,通过相机拍摄的图像中可能出现蒜粒上下相叠或相互粘连的现象,这对后续特征提取造成极大影响。采用数学形态学对图像进行处理,不仅能将粘连的蒜粒分隔开,还可对图像中残存的噪声进行清除,从而提高图像质量,令蒜粒外轮廓线更加光滑。
数学形态学是图像预处理的基础理论,形态学操作包括腐蚀与膨胀、开运算与闭运算。通过这些基础操作的排列组合可形成多种图像处理算法,能对图像进行质量增强、特征提取和图像分割等多种功能的分析处理。
- 腐蚀操作缩减目标区域面积,使图像的边界轮廓收缩,从而消除微小杂物。使用结构元素B对结构元素A进行腐蚀,膨胀操作增大目标区域面积,原理是将同目标范围交接的一些点融合到目标中,导致目标轮廓边界向外增大。膨胀操作能消除目标范围内的小颗粒噪声,并对小洞进行填补。使用结构元素B对结构元素A进行膨胀。
- 开运算使图像轮廓更加光滑,去除孤立小点、毛刺,断开狭窄的间断,同时保持整体位置和形状不变。使用结构元素B对集合A进行开运算,定义为:开运算的实现原理为:首先通过结构元素B对结构元素A进行腐蚀,之后腐蚀后的元素再利用结构元素B进行膨胀。
- 闭运算同样使图像轮廓变得光滑,通常能填平小孔,弥合图像轮廓上的小裂缝,消除狭窄的间断和细长的鸿沟。使用结构元素B对集合A进行闭运算,定义为:闭运算的实现原理为:首先通过结构元素B对结构元素A进行膨胀,之后膨胀后的元素再利用结构元素B进行腐蚀。
- 轮廓在形状描述和物体检测中起着重要作用。轮廓跟踪是通过顺序找出目标的边缘点来跟踪边界,目标是获取每粒大蒜蒜粒的外部轮廓特征,为获取几何特征(如面积、周长等)做准备。经过形态学处理得到的二值图像中,大蒜蒜粒与背景良好分离,但需对分离出的蒜粒轮廓进行跟踪并提取。分割后的蒜粒图像为二值图像,区域内像素值相同,轮廓追踪采用8连通区域。
1.2 目标检测算法
YOLO算法通过利用基于锚点的方法,运用各种尺度的锚点实现目标框的回归,并输出目标框的位置和类别置信度。在检测过程中,大蒜蒜粒数据集设置输入图片尺寸为640×640,训练时输入的图片尺寸并非固定,,YOLOv5能够利用拼接技术将四张图片组合为一张尺寸确定的输入图片。由于大多数图像尺寸与设定的输入大小不匹配,因此在输入步骤中进行了尺寸重构,从而使先前标注的边界框尺寸也随之改变。锚点是根据输入网络中的边界框大小计算得到的,因此在重构过程中需要重新聚类锚点。
Backbone去除了Focus模块,主要由CBS、BottleneckCSP/C3和SPP/SPPF等组成。CSP结构旨在更好地提取图像的深层特征,通过局部跨层融合,利用不同层的特征信息获取更加丰富的特征图。要了解Bottleneck模块,需从ResNet网络讲起,该网络利用包含快捷连接的残差结构构建多个层次,其中BasicBlock代表浅层网络的残差模块,Bottleneck则用于深层网络。Bottleneck与BasicBlock的主要区别在于卷积核的内部结构。BasicBlock采用两个3×3的卷积层,而Bottleneck则采用两个1×1卷积层和一个3×3卷积层,通过降低维数再恢复,减少计算流程中的参数量,提高速度。
CSP中的Bottleneck结构与ResNet的差异在于,CSP在输入维度减半后未再使用1×1卷积核升维,而是直接将原始输入降维,采用拼接的方法得到与原始输入相同维度的输出。ResNet中的快捷连接通过相加实现,而CSP则通过增加通道数量实现。可以根据任务需求设置是否使用快捷连接,例如在Backbone中设为True,而在Neck中设为False。
SSPF模块对特征图进行多次池化操作,尽管特征图尺寸保持不变,通道数目也未改变,因此最后四个输出特征可以在通道维度上实现融合。Neck部分的结构由CBS、上采样、拼接和不带快捷连接的CSP(C3)组成,借鉴了FPN+PAN的结构。FPN通过自顶向下的侧边连接在所有尺度上构建高级语义特征图,形成特征金字塔。
边界框是包含检测目标的最小矩形框,其输出为一组(x,y,w,h)数据,其中(x,y)表示边界框左上角,w和h分别为边界框的宽度和高度。数据(x,y,w,h)能够唯一确定目标的边界框。IoU用于衡量边界框的定位精度,定义为预测框与真实框的相交面积与预测框和真实框的并集面积之比。IoU值越大,说明重合度越好,表示模型预测精度越高;反之,则说明模型性能较差。
Head网络结构的主要成分由三个检测器组成,通过基于网格的锚点在不同尺度的特征图上实现目标检测。Detect网络用于模型的最终检测部分,包括边界框损失函数和非极大值抑制。该部分将锚框应用于上一层输出的特征图,并输出包含目标类别概率和目标框坐标的向量。YOLO通过预测值与真实值之间的平方和误差计算损失函数,损失函数用于评判模型预测值与真实值差异,决定模型性能。损失函数包括分类预测损失、坐标预测损失和置信度预测损失。分类损失和置信度损失使用二元交叉熵损失计算,定位损失使用IoU函数计算。
数据集
图像采集阶段选择了自主拍摄与互联网采集相结合的方式。通过在互联网爬取相关图片,获取了数千张大蒜蒜粒的图像数据。这些图像包含两类目标:质量良好的大蒜蒜粒与破损、变质的蒜粒。在选取过程中,考虑到图像质量对检测的影响,特别是存在大量不清晰图片,因此对爬取的图片进行了严格筛选,确保最终的数据集涵盖的图像清晰、可用。
import requests
from bs4 import BeautifulSoup
import os
def download_images(url, folder_name):
if not os.path.exists(folder_name):
os.makedirs(folder_name)
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
img_tags = soup.find_all('img')
for img in img_tags:
img_url = img['src']
if img_url.startswith('http'):
img_data = requests.get(img_url).content
img_name = os.path.join(folder_name, img_url.split('/')[-1])
with open(img_name, 'wb') as f:
f.write(img_data)
# 示例调用
download_images('https://example.com/search?q=garlic', 'Images')
在数据标注阶段,使用了标注工具LabelImg对每张图像中的大蒜蒜粒进行框选标注。标注信息以YOLO格式保存,生成相应的文本文件。每个文本文件与其对应的图像文件名称一一对应,其中每一行代表一个标注目标,信息内容包括目标类别ID、经过归一化的中心点x坐标、y坐标以及目标框的宽度w和高度h。
数据集的组织结构将所有图像放置于名为“Image”的文件夹下,相应的标注文本文件则存储在“Labels”文件夹中。这种结构化的管理方式便于后续的数据处理与模型训练,确保数据集的高效使用。
实验及结果分析
实验环境搭建
模型训练
模型训练之前,需要对大蒜蒜粒的图像进行预处理,以提高图像质量并降低检测误差。可以使用各种图像处理技术,如直方图均衡化、锐化和噪声去除等。这些方法能够增强图像的对比度和清晰度,从而使模型更容易识别特征。使用LabelImg工具对图像中的大蒜蒜粒进行标注,并根据标注结果制作训练集、验证集和测试集。将样本分为正常蒜粒和残缺发霉蒜粒两类。每个标注结果生成一个YOLO格式的文本文件,便于后续训练和评估。
import cv2
import numpy as np
def enhance_image(image_path):
img = cv2.imread(image_path)
# 直方图均衡化
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
img = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)
# 锐化
kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]])
img = cv2.filter2D(img, -1, kernel)
return img
选择YOLOv5轻量模型进行训练。配置训练参数,如批量大小、学习率、训练轮数等。通过调用训练脚本,开始模型训练过程。训练过程中,模型将学习如何识别正常和残缺发霉的大蒜蒜粒。训练完成后,使用验证集对模型进行评估。采用准确率、精确率、召回率、平均精度(AP)和平均精度均值(mAP)等指标来评估模型性能。将预测结果与标注数据进行对比,计算各项指标,分析模型的检测能力。
# 训练YOLOv5模型
!python train.py --img 640 --batch 16 --epochs 50 --data dataset.yaml --weights yolov5s.pt
根据模型的预测结果,将样本数据分为真正例(TP)、假正例(FP)、真反例(TN)和假反例(FN)。通过这些分类结果,可以深入分析模型的检测性能,识别出模型的优缺点,进而优化模型。
# 假设results是模型的检测结果
TP = sum((results['preds'] == 1) & (results['targets'] == 1))
FP = sum((results['preds'] == 1) & (results['targets'] == 0))
TN = sum((results['preds'] == 0) & (results['targets'] == 0))
FN = sum((results['preds'] == 0) & (results['targets'] == 1))
print(f"TP: {TP}, FP: {FP}, TN: {TN}, FN: {FN}")