基于深度学习的瓶盖检测系统(Python+YOLOv5深度学习模型+清新界面)

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,5000CU*H 3个月
模型训练 PAI-DLC,5000CU*H 3个月
简介: 基于深度学习的瓶盖检测系统(Python+YOLOv5深度学习模型+清新界面)

前言


       对于饮料、医药、食品等生产厂家而言,瓶盖外观缺陷是产品生产制造环节常见的问题,由于对产品包装精细化、品质和连续批量生产的要求越来越高,传统人工检测容易造成漏检、误检,导致不良品流出且效率低,市场对瓶盖原厂质量检测提出了新的挑战。基于AI的全自动瓶盖视觉检测系统的出现,很好地解决了这一难点,成为越来越生产业企业新的选择。瓶盖检测系统既能确保包装质量,能对瓶盖材质进行检测,避免不符合食品安全标准的材料进入生产工序,保障了饮料食品的质量安全。

       本系统基于YOLOv5,采用登录注册进行用户管理,对于图片、视频和摄像头捕获的实时画面,可检测瓶盖的位置,系统支持结果记录、展示和保存,每次检测的结果记录在表格中。对此这里给出博主设计的界面,同款的简约风,功能也可以满足图片、视频和摄像头的识别检测,希望大家可以喜欢,初始界面如下图:



       检测类别时的界面截图(点击图片可放大)如下图,可识别画面中存在的多个类别,也可开启摄像头或视频检测:



        详细的功能演示效果参见博主的B站视频或下一节的动图演示,觉得不错的朋友敬请点赞、关注加收藏!系统UI界面的设计工作量较大,界面美化更需仔细雕琢,大家有任何建议或意见和可在下方评论交流。


1. 效果演示


       软件的颜值和功能同样重要,首先我们还是通过动图看一下识别的效果,系统主要实现的功能是对图片、视频和摄像头画面中的瓶盖进行识别,识别的结果可视化显示在界面和图像中,另外提供多个目标的显示选择功能,演示效果如下。

(一)系统介绍

       基于深度学习的瓶盖检测系统主要用于日常场景中瓶盖的检测识别,也可用于传送带等加工回收场景,检测瓶盖目标在图像中的类别、位置、数目、置信度等;可对图片、视频文件读取的图像,或从摄像头获取的实时画面中的瓶盖进行识别,算法模型可选择替换;系统界面包含用户注册、登录功能,方便用户进行管理和使用;识别结果可视化,结果实时显示并能够进行目标逐个标注、显示和数据展示;画面显示窗口表格记录历史结果,图片结果可点击按钮保存,方便后续查阅使用。



(二)技术特点

        (1)检测算法采用YOLOv5实现,模型可切换更新;

        (2)选择图片、视频或摄像头方式识别瓶盖;

        (3)提供目标数、类别、位置等结果展示、切换和保存功能;

        (4)支持用户登录、注册、管理,界面缩放、可视化等功能;

(三)选择图片识别

       系统允许选择图片文件进行识别,点击图片选择按钮图标选择图片后,显示所有识别的结果,可通过下拉选框查看单个结果,以便具体判断某一特定目标。本功能的界面展示如下图所示:



(四)视频识别效果展示

       很多时候我们需要识别一段视频中的多个瓶盖,这里设计了视频选择功能。点击视频按钮可选择待检测的视频,系统会自动解析视频逐帧识别多个瓶盖,并将瓶盖的分类和计数结果记录在右下角表格中,效果如下图所示:




2. 瓶盖数据集及训练


       本文实验的瓶盖数据集包含正面、侧面,不同光照背景,以及不同类型的瓶盖的图像。其中,训练集1601张图片,验证集105张图片,测试集67张图片,共计1773张图片,选取部分数据部分样本数据集如图所示。



       每张图像都包含一个标准文件,在.txt的文本文件的每一行都描述了一个边界框。检测框的坐标值经过图像尺寸归一化处理(即值介于 0 和 1 之间)



       data.yaml 是数据配置文件,记录数据集的详细信息。有以下参数:

       1、train、test和val:训练集、测试集和验证集的位置。

       2、nc:数据集中的类别数。

       3、names:数据集中类别的名称。

python
train: ./BottleCap/images/train
val: ./BottleCap/images/valid
test: ./BottleCap/images/test
nc: 1
names: ['bottle-cap']


       结果如下:



       使用 train.py 训练:打开此代码,查看def parse_opt()。

python
parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
    parser.add_argument('--cfg', type=str, default='models/yolov5s.yaml', help='model.yaml path')
    parser.add_argument('--data', type=str, default='/BottleCap/bottle-cap.yaml', help='garbage.yaml path')
    parser.add_argument('--hyp', type=str, default='data/hyp.scratch.yaml', help='hyperparameters path')
    parser.add_argument('--epochs', type=int, default=300)
    parser.add_argument('--batch-size', type=int, default=2, help='total batch size for all GPUs')
    parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='[train, test] image sizes')
    parser.add_argument('--rect', action='store_true', help='rectangular training')
    parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
    parser.add_argument('--notest', action='store_true', help='only test final epoch')
    parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
    parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters')
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
    parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')
    parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
    parser.add_argument('--name', default='', help='renames experiment folder exp{N} to exp{N}_{name} if supplied')
    parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
    parser.add_argument('--single-cls', action='store_true', help='train as single-class dataset')
    parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')
    parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
    parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')
    parser.add_argument('--logdir', type=str, default='BottleCap/logs', help='logging directory')
    parser.add_argument('--workers', type=int, default=1, help='maximum number of dataloader workers')
    opt = parser.parse_args()


       weights 参数是预训练权重,如果这里设置为空的话,重新训练模型。

       参数是模型配置文件,要使用自定义网络,请创建一个新文件并在运行时使用cfg标志指定它。

       data 参数是数据集配置文件,里面主要存放数据集的类别和路径。

       hyp 参数是超参数配置文件,超参数里面包含了大量的参数信息。默认的data/hyp.scratch.yaml如下。

python
lr0: 0.01  # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2  # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937  # SGD momentum/Adam beta1
weight_decay: 0.0005  # optimizer weight decay 5e-4
warmup_epochs: 3.0  # warmup epochs (fractions ok)
warmup_momentum: 0.8  # warmup initial momentum
warmup_bias_lr: 0.1  # warmup initial bias lr
box: 0.05  # box loss gain
cls: 0.5  # cls loss gain
cls_pw: 1.0  # cls BCELoss positive_weight
obj: 1.0  # obj loss gain (scale with pixels)
obj_pw: 1.0  # obj BCELoss positive_weight
iou_t: 0.20  # IoU training threshold
anchor_t: 4.0  # anchor-multiple threshold
# anchors: 0  # anchors per output grid (0 to ignore)
fl_gamma: 0.0  # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015  # image HSV-Hue augmentation (fraction)
hsv_s: 0.7  # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4  # image HSV-Value augmentation (fraction)
degrees: 0.0  # image rotation (+/- deg)
translate: 0.1  # image translation (+/- fraction)
scale: 0.5  # image scale (+/- gain)
shear: 0.0  # image shear (+/- deg)
perspective: 0.0  # image perspective (+/- fraction), range 0-0.001
flipud: 0.0  # image flip up-down (probability)
fliplr: 0.5  # image flip left-right (probability)
mosaic: 1.0  # image mosaic (probability)
mixup: 0.0  # image mixup (probability)


       epochs 参数是训练轮数,默认300 次。

       batch_size 参数是每批次输入的数据量,取值为 -1 ,将自动调节。

       imgsize、img、img-size,训练集和测试集图片的大小,默认 640*640。

       以上就是YOLOv5的整体介绍,接下来进行训练。本项目使用Yolov5训练了一个瓶盖检测模型,在笔记本的3070显卡下训练了300 epoch,在终端运行的截图如下:



       在深度学习中,我们通常通过损失函数下降的曲线来观察模型训练的情况。而YOLOv5训练时主要包含三个方面的损失:矩形框损失(box_loss)、置信度损失(obj_loss)和分类损失(cls_loss),在训练结束后,我们也可以在logs目录下找到生成对若干训练过程统计图。下图为博主训练舰船类识别的模型训练曲线图。



       一般我们会接触到两个指标,分别是召回率recall和精度precision,两个指标p和r都是简单地从一个角度来判断模型的好坏,均是介于0到1之间的数值,其中接近于1表示模型的性能越好,接近于0表示模型的性能越差,为了综合评价目标检测的性能,一般采用均值平均密度map来进一步评估模型的好坏。我们通过设定不同的置信度的阈值,可以得到在模型在不同的阈值下所计算出的p值和r值,一般情况下,p值和r值是负相关的,绘制出来可以得到如下图所示的曲线,其中曲线的面积我们称AP,目标检测模型中每种目标可计算出一个AP值,对所有的AP值求平均则可以得到模型的mAP值。



       以PR-curve为例,你可以看到我们的模型在验证集上的均值平均准确率为0.959。


3. 瓶盖检测识别


       在训练完成后得到最佳模型,接下来我们将帧图像输入到这个网络进行预测,运行testPicture.py从而得到预测结果

python
if __name__ == '__main__':
    img_path = "./UI_rec/test_/20220410_024444_jpg.rf.c7a82c73f24f2212609a325acbe6e169.jpg"
    image = cv_imread(img_path)
    image = cv2.resize(image, (850, 500))
    img0 = image.copy()
    img = letterbox(img0, new_shape=imgsz)[0]
    img = np.stack(img, 0)
    img = img[:, :, ::-1].transpose(2, 0, 1)  # BGR to RGB, to 3x416x416
    img = np.ascontiguousarray(img)
    pred, useTime = predict(img)
    det = pred[0]
    p, s, im0 = None, '', img0
    if det is not None and len(det):  # 如果有检测信息则进入
        det[:, :4] = scale_coords(img.shape[1:], det[:, :4], im0.shape).round()  # 把图像缩放至im0的尺寸
        number_i = 0  # 类别预编号
        detInfo = []
        for *xyxy, conf, cls in reversed(det):  # 遍历检测信息
            c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3]))
            # 将检测信息添加到字典中
            detInfo.append([names[int(cls)], [c1[0], c1[1], c2[0], c2[1]], '%.2f' % conf])
            number_i += 1  # 编号数+1
            label = '%s %.2f' % (names[int(cls)], conf)
            # 画出检测到的目标物
            plot_one_box(image, xyxy, label=label, color=colors[int(cls)])
    # 实时显示检测画面
    cv2.imshow('Stream', image)
    # if cv2.waitKey(1) & 0xFF == ord('q'):
    #     break
    c = cv2.waitKey(0) & 0xff



       博主对整个系统进行了详细测试,最终开发出一版流畅得到清新界面,就是博文演示部分的展示,完整的UI界面、测试图片视频、代码文件,以及Python离线依赖包(方便安装运行,也可自行配置环境),均已打包上传,感兴趣的朋友可以通过下载链接获取。


相关文章
|
4天前
|
机器学习/深度学习 数据采集 存储
使用Python实现智能农业灌溉系统的深度学习模型
使用Python实现智能农业灌溉系统的深度学习模型
29 6
|
2天前
|
机器学习/深度学习 PyTorch TensorFlow
使用Python实现智能食品质量检测的深度学习模型
使用Python实现智能食品质量检测的深度学习模型
27 1
|
2天前
|
机器学习/深度学习 数据采集 自然语言处理
如何使用深度学习模型来提高命名实体识别的准确率?
如何使用深度学习模型来提高命名实体识别的准确率?
|
5天前
|
机器学习/深度学习 数据采集 数据可视化
使用Python实现深度学习模型:智能植物生长监测与优化
使用Python实现深度学习模型:智能植物生长监测与优化
25 0
|
5天前
|
机器学习/深度学习 数据采集 人工智能
AI赋能教育:深度学习在个性化学习系统中的应用
【10月更文挑战第26天】随着人工智能的发展,深度学习技术正逐步应用于教育领域,特别是个性化学习系统中。通过分析学生的学习数据,深度学习模型能够精准预测学生的学习表现,并为其推荐合适的学习资源和规划学习路径,从而提供更加高效、有趣和个性化的学习体验。
38 9
|
4天前
|
机器学习/深度学习 监控 自动驾驶
深度学习在图像识别中的应用与挑战
本文探讨了深度学习在图像识别领域的应用现状,分析了其面临的主要技术挑战和解决方案。通过对比传统方法和深度学习模型的优势,揭示了深度学习如何推动图像识别技术的发展,并展望了未来的研究方向。
|
1天前
|
机器学习/深度学习 分布式计算 自动驾驶
深度学习在图像识别中的革命性应用####
【10月更文挑战第29天】 本文深入探讨了深度学习技术如何彻底革新图像识别领域,通过卷积神经网络(CNN)的架构优化、数据集增强策略及迁移学习的应用,显著提升了图像分类与目标检测的准确率。文章概述了深度学习模型训练的关键挑战,如过拟合、计算资源依赖性,并提出了创新性解决方案,包括正则化技术、分布式计算框架及自适应学习率调整策略。强调了深度学习在自动驾驶、医疗影像分析等领域的广阔应用前景,同时指出了隐私保护、模型可解释性等伦理法律问题的重要性,为未来研究提供了方向。 ####
17 5
|
2天前
|
机器学习/深度学习 人工智能 算法
探索深度学习在图像识别中的应用与挑战
【10月更文挑战第28天】 本文深入探讨了深度学习技术,特别是卷积神经网络(CNN)在图像识别领域的应用及其面临的主要挑战。通过分析CNN的工作原理和架构设计,揭示了其在处理大规模图像数据时的优势。同时,本文也讨论了当前深度学习模型在图像识别任务中遇到的一些关键问题,如过拟合、数据不平衡以及计算资源的需求等,并提出了相应的解决策略。此外,文章还展望了未来深度学习技术在图像识别领域的发展方向,包括模型优化、算法创新及应用场景的拓展。
12 1
|
8天前
|
机器学习/深度学习 算法 计算机视觉
深度学习在图像识别中的应用与挑战
【10月更文挑战第22天】 本文深入探讨了深度学习在图像识别领域的应用,分析了其技术原理、优势以及面临的挑战。通过实例展示了深度学习如何推动图像识别技术的发展,并对未来趋势进行了展望。
23 5
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习在图像识别中的应用与挑战
【10月更文挑战第20天】 随着人工智能技术的不断发展,深度学习已经在许多领域展现出强大的应用潜力。本文将探讨深度学习在图像识别领域的应用,以及面临的挑战和可能的解决方案。通过分析现有的研究成果和技术趋势,我们可以更好地理解深度学习在图像识别中的潜力和局限性,为未来的研究和应用提供参考。
37 7