当前位置:   article > 正文

【精选项目】构建OpenCV和深度学习的商品识别系统:一站式指南_基于深度学习和opencv的无人售货购物系统

基于深度学习和opencv的无人售货购物系统

1.研究背景和意义

最近十几年以来,由于计算机算力的不断攀升,人们看到了以深度学习为代表的人工智能技术所展现出来的巨大潜力,人工智能技术如雨后春笋般层出不穷。人们广泛的将深度学习应用在科学研究、工业探测、商业推荐以及农业生产等领域,极大提升了各领域的生产效率,同时也提升了人们的生活水平。我们希望人工智能技术可以更好地赋能社会发展,于是我们着眼于新零售。由于大数据和人工智能的发展,传统的零售行业正在受到电商行业的巨大冲击,人们越来越多的在网上购买商品,这无疑挤压了实体零售的生存空间,因此实体零售为求生存必须要寻找新的零售模式,那么无人零售便是新的趋势。无人零售最主要的体现是在无人售货机(柜)上,比较于传统零售业而言,它不受到时间和地点的限定,既能部署在办公楼、宿舍等密闭式的场所,也可以出现在景区、车站、各种商圈等人口密集的场所。
无人售货柜的使用方案目前有两大类,一类是传统的方案,一类是结合深度学习的方案。在传统的方案中,用户首先通过柜外的购物显示屏或按钮选购商品,确定商品数量后付费,然后货物分发系统会通过机械传动装置将用户所选的商品传送到指定位置,用户拿走物品即可。另一类结合深度学习的方法是凭借着人工智能技术尤其是计算机视觉方向的迅猛发展,使得人们开始对传统的无人售货柜的方案进行创新,如采用目标识别与分析的技术来识别商品,省去了传统无人售货柜上面的购物显示屏了;如通过直接扫描无人售货柜上的二维码绑定身份后直接让用户开门来选购商品,省去传统无人售货柜中的复杂传送装置。诸如此类的方法一方面可以降低无人售货柜的成本,另一方面可以使得购物流程更加的流畅,使用户有更好的购物体验。
上述传统的无人售货方式因安全性高,货损率低而广受欢迎,但其繁琐的操作、空间利用率低和较高的成本使得部署这样的售货柜的成本变得很高;基于深度学习的方法可以大规模的降低成本,提升购物体验,但是其安全性和准确性等方面还有待提升。无人售货柜的市场需求很大。据调研,国内市场目前大约有上百万台的缺口,那么构建一套低成本、安全可靠的无人售货方案就显得尤为重要。
在这里插入图片描述

2.图片演示

在这里插入图片描述
在这里插入图片描述

3.视频演示

基于深度学习和OpenCV的商品识别系统_哔哩哔哩_bilibili

4.目标检测算法通用架构

目标检测算法的一般流程是:首先输入图像,然后通过算法获得目标的位置以及置信度。目标检测算法主流的架构有两种,一种是双阶段( two-stage)架构的模型;一种是单阶段( one-stage)架构的模型。下面结合图和来分析一下两种不同的目标检测算法的实现思路有何异同。
双阶段目标检测算法。双阶段的目标检测算法它的主要流程是先生成大量的候选框,然后使用卷积网络对候选框进行分类和位置回归,典型的双阶段的检测算法有 R-CNN系列算法。两阶段目标检测通用算法示意图如下所示:
在这里插入图片描述

5.无人售货场景下目标检测与追踪方法

传统的无人售货解决方案中货物存在不能重叠摆放、空间利用率低的问题。部分基于计算机视觉的方案,通过对比开关门时间段中的关键帧中商品的数量变化来判断商品的售卖状态。这种方法在商品堆叠、类似商品识别问题上表现不佳,而且摄像头数量要匹配货柜的层数导致物料成本增多。也有部分方案通过摄像头将购物过程拍摄下来并传输到云端进行处理分析,这种方案的优点是可以利用云端丰富的GPU算力对数据进行多维度的分析,如购物行为分析、购物商品分析等,缺点是需要良好的网络带宽支持和完善的云端建设,前者往往会因为网络的不稳定带来不确定的时延,后者则是需要较高的成本来构建和维护云端服务。
本文的目标是从端侧部署出发的,构建出一个可以在无人售货机本地部署的动态视觉解决方案。端侧部署是总原则,方案的其他部分要依照总原则来设计,即算法的选择和设计要考虑到端侧的计算能力和硬件支持情况。其次,本文中的“动态”体现在购物过程中动态的改变所购商品的状态信息,因为本质上目标检测都是通过一帧一帧的图像作为基本检测单元的。动态的记录商品状态原因有两个: a)在开放式的购物场景中,用户可能会出现在多件商品中择优选择的情况,这时候动态的记录用户在整个过程中的购物状态则显得尤为重要,因为如果还只看开关门时刻的情况,那么中间的很多状态则不可见,则不能明确的知道用户购买了哪些商品; b)因为我们采用了摄像头外置的策略,使得在购物时摄像头并不需要拍摄到货柜内的全部商品,只需要记录商品的进出货柜情况,这种能较好的避免因货柜内商品堆积到导致的密集场景下的漏检问题。这样动态的记录目标的进出信息还可以为后续的判断提供额外信息。
本文基于动态视觉的无人售货方案设计是要在尽可能保证准确率的情况下,使得这套方案能在端侧运行,在可接受的低时延和功耗下,充分利用计算机视觉技术赋能无人售货产业。
在这里插入图片描述

6.数据的收集

图片的收集

本文使用现有的公开数据集goodsdata,商品数据集包含12个种类的饮料,类别标签分别是“报纸”、"餐具”、“茶”、“充电宝”、“灯泡”、“电池”、“化妆品”、“肉制品”、“杀虫剂”、“书籍”、“温度计”和"药品”。为了提高算法的泛化性能,不仅数据采集的过程中进行多方位、多角度的拍摄,并且将拍摄后标注好的图片进行图片增广,如下图所示。
在这里插入图片描述

7.数据集的标注

使用labelImg进行标注

Labellmg是一个目标检测算法的标注工具,它无需安装,有GUI操作界面并提供了不同的标注存储格式,如以YOLO格式存储,以VOC格式存在等。从图中可以看到可以将GUI界面分为4个区域,分别为功能区,操作和预览区,label预览区和文件列表。功能区主要是标注的工具,如存储格式、放大缩小、删除等;操作和预览区可以对图像中的目标进行标注; label预览区是对标注好的包围框进行类别选择;文件列表可以看到文件中的所有代标注图片。Labellmg 操作流程为:首先,在功能区选择待标注的图片或图片所在的文件夹,选择存放标注文件的文件夹,选择需要以什么样的格式存储。然后,对目标进行标注,可以直接点击鼠标右键选择Create RectBox进行矩形框标注,当一个矩形画完后就会自动弹出一个类别选项列表,选择对应的类别后需要按Ctrl+S保存,不然切换到下一张图的时候并不会自动保存。
在这里插入图片描述
labelImg是一个图形化的图像注释工具,支持VOC和YOLO格式。以下是使用labelImg将图片标注为VOC格式的步骤:

(1)下载并安装labelImg。
(2)打开labelImg并选择“Open Dir”来选择你的图片目录。
(3)为你的目标对象设置标签名称。
(4)在图片上绘制矩形框,选择对应的标签。
(5)保存标注信息,这将在图片目录下生成一个与图片同名的XML文件。
(6)重复此过程,直到所有的图片都标注完毕。

在这里插入图片描述

8.数据集的处理

转换为YOLO格式

由于YOLO使用的是txt格式的标注,我们需要将VOC格式转换为YOLO格式。可以使用各种转换工具或脚本来实现。

下面是一个简单的方法是使用Python脚本,该脚本读取XML文件,然后将其转换为YOLO所需的txt格式。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import xml.etree.ElementTree as ET
import os

classes = []  # 初始化为空列表

CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))

def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)

def convert_annotation(image_id):
    in_file = open('./label_xml\%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('./label_txt\%s.txt' % (image_id), 'w')  # 生成txt格式文件
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        cls = obj.find('name').text
        if cls not in classes:
            classes.append(cls)  # 如果类别不存在,添加到classes列表中
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

xml_path = os.path.join(CURRENT_DIR, './label_xml/')

# xml list
img_xmls = os.listdir(xml_path)
for img_xml in img_xmls:
    label_name = img_xml.split('.')[0]
    print(label_name)
    convert_annotation(label_name)

print("Classes:")  # 打印最终的classes列表
print(classes)  # 打印最终的classes列表

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
整理数据文件夹结构

我们需要将数据集整理为以下结构:

-----data
   |-----train
   |   |-----images
   |   |-----labels
   |
   |-----valid
   |   |-----images
   |   |-----labels
   |
   |-----test
       |-----images
       |-----labels

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

确保以下几点:

所有的训练图片都位于data/train/images目录下,相应的标注文件位于data/train/labels目录下。
所有的验证图片都位于data/valid/images目录下,相应的标注文件位于data/valid/labels目录下。
所有的测试图片都位于data/test/images目录下,相应的标注文件位于data/test/labels目录下。
这样的结构使得数据的管理和模型的训练、验证和测试变得非常方便。

模型训练
 Epoch   gpu_mem       box       obj       cls    labels  img_size
 1/200     20.8G   0.01576   0.01955  0.007536        22      1280: 100%|██████████| 849/849 [14:42<00:00,  1.04s/it]
           Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 213/213 [01:14<00:00,  2.87it/s]
             all       3395      17314      0.994      0.957      0.0957      0.0843

 Epoch   gpu_mem       box       obj       cls    labels  img_size
 2/200     20.8G   0.01578   0.01923  0.007006        22      1280: 100%|██████████| 849/849 [14:44<00:00,  1.04s/it]
           Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 213/213 [01:12<00:00,  2.95it/s]
             all       3395      17314      0.996      0.956      0.0957      0.0845

 Epoch   gpu_mem       box       obj       cls    labels  img_size
 3/200     20.8G   0.01561    0.0191  0.006895        27      1280: 100%|██████████| 849/849 [10:56<00:00,  1.29it/s]
           Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|███████   | 187/213 [00:52<00:00,  4.04it/s]
             all       3395      17314      0.996      0.957      0.0957      0.0845
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

9.训练结果评价指标

本研究中的商品检测考虑精确度和召回率,本小节利用mAP、召回率率等参数来验证模型的性能,并对检测结果进行评价。
为了确认改进后的YOLOv5网络的各组件对最终性能的影响。通过ATCSP模块的整合,mAP@0.5从0.59631提升为提高到0.86144,提高幅度为44.5%,召回率从0.62提升到0.83,提高幅度为33.9%。这表明改进后的YOLOv5可以过滤其他级别的特征,并将有用的信息保持在该级别,以提高对小商品的检测精度。
Box:YOLO V5使用 GIOU Loss作为bounding box的损失,Box推测为GIoU损失函数均值,越小方框越准;Objectness:推测为目标检测loss均值,越小目标检测越准;Classification:推测为分类loss均值,越小分类越准,具体的含义:
1)位置损失函数(train(val)/box_loss)
位置损失函数用IOU值评价预测框和真实框的位置损失
2)置信度损失函数(train(val)/obj_loss)
置信度损失计算使用前文介绍过的IoU函数计算,IoU只解决两个物体重叠的情况,为了解决两物体重叠引入GIoU维持IoU尺寸的不变性,重叠时也能保持与IoU的强关联性。
3)分类损失函数(train(val)/cls_loss):分类损失使用二元交叉熵损失函数BCEWithLogitsLoss计算
4)平均准确率(mAP@0.5):即将IoU设为0.5时,计算每一类的所有图片的AP,然后所有类别求平均,即mAP
5)平均准确率(mAP@0.5:0.95):表示在不同IoU阈值(从0.5到0.95,步长0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP。
6)精度(precision):精度是精确性的度量,表示被分为正例的示例中实际为正例的比例,precision=TP/(TP+FP);
7)召回率(recall):召回率是覆盖面的度量,度量有多个正例被分为正例,recall=TP/(TP+FN)=TP/P=sensitive,可以看到召回率与灵敏度是一样的。
在这里插入图片描述

10.训练结果分析

在本节中,我们设计了一些实验来研究预训练、模型深度,容斥函数以及CSP模块对于模型的影响,以此来选择为特定场景下的无人售货商品识别选择一组合适的参数组合。
本节的第一个实验是关于验证预训练以及马赛克增强和 random_drop对于目标检测效果的影响。本实验采用的基准模型为yolov3-tiny模型,模型共有anchors 设置为[(10,14),(23,27),(37,58), (81,82), (135,169),(344,319)]共6 组框前后分为两组用在模型stride=16和 stride=32的特征图上。该模型在 MS-COCO 数据集上经过训练并收敛(在Ms-COCO数据集上的mAP@0.5:0.95为17.6%,mAP@0.5为 34.9%)。实验共分为四组,分别是pretrain模型(有马赛克增强),模型从头开始训练(train from scratch)(有马赛克增强),不添加马赛克增强(预训练),以及添加random_cut(预训练)。每个实验都训练了300个epoch。这四个实验的结果如表所示:
在这里插入图片描述

结果分析:从表可以看出,在我们自己采集的验证数据中,预训练和从头开始训练的从map@0.5:0.95指标上来看,差别只有0.89%,可能的原因是因为我们所收集的数据的数量相对来说是足够的,所以预训练和从头开始训练所能达到的效果是相当的。但是从模型的收敛速度来说,预训练的模型在70 个epoch 时就已经收敛了,而预训练模型则在220个epoch时损失才趋于平稳,说明预训练模型可以帮助模型加快收敛速度;图中值得注意的是没有使用马赛克增强导致模型的性能急剧下降,分析原因是因为采集的图片大多都是一张图片上只有一个目标,而验证集上有很多图片上有多个目标这导致了训练和测试之间的不平衡使得模型性能下降,而马赛克增强则是将多张图拼凑成一张图使得训练的过程和测试的之间的差别缩小,因为马赛克增强对于本文中的数据集特点来说是非常必要的。random_drop数据增强是为了模型有更好的泛化性能,因为限于我们所采集的环境有限,不能完全考虑到所有的场景,所以增加了random_drop增强操作来提升模型的训练难度,虽然从数据上来看效果不如预训练模型。

11.系统整合

下图完整源码&数据集&环境部署视频教程&自定义UI界面

在这里插入图片描述

参考博客《基于深度学习和OpenCV的商品识别系统》

12.参考文献


[1]佚名.An Improved KM Algorithm for Computing Structural Index of DAE System[C].2013.

[2]Ni, Jianjun,Zhang, Xue,Shi, Pengfei,等.An Improved Kernelized Correlation Filter Based Visual Tracking Method[J].Mathematical Problems in Engineering: Theory, Methods and Applications.2018,2018(Pt.16).6931020.1-6931020.12.DOI:10.1155/2018/6931020 .

[3]Wenguan Wang,Jianbing Shen.Deep Visual Attention Prediction[J].IEEE Transactions on Image Processing.2017,27(5).2368-2378.

[4]Angshuman Parashar,Minsoo Rhu,Anurag Mukkara,等.SCNN: An Accelerator for Compressed-sparse Convolutional Neural Networks[J].Computer architecture news.2017,45(2).27-40.

[5]Uijlings, J.R.R.,Van De Sande, K.E.A.,Gevers, T.,等.Selective search for object recognition[J].International Journal of Computer Vision.2013,104(2).154-171.DOI:10.1007/s11263-013-0620-5 .

[6]Kalal, Zdenek.Tracking-Learning-Detection[J].IEEE Transactions on Pattern Analysis & Machine Intelligence.2012,34(7).

[7]Matthews I.,Baker S..Lucas-Kanade 20 years on: A unifying framework[J].International Journal of Computer Vision.2004,56(3).

[8]Comaniciu, D.,Meer, P..Mean shift: a robust approach toward feature space analysis[J].Pattern Analysis & Machine Intelligence, IEEE Transactions on.2002,24(5).603-619.

[9]Hearst M.A.,Dumais S.T..Support vector machines[J].IEEE intelligent systems & their applications.1998,13(4).18-28.

[10]佚名.Learning representations by back-propagating errors[J].Nature.1986,323(6088).533-536.DOI:10.1038/323533a0 .

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/877929
推荐阅读
相关标签
  

闽ICP备14008679号