智能零售柜商品检测软件(Python+YOLOv5深度学习模型+清新界面)

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 智能零售柜商品检测软件(Python+YOLOv5深度学习模型+清新界面)

前言


       智能零售柜商品检测系统是指利用计算机视觉技术和深度学习算法对零售柜中的商品进行实时检测和识别,以便为消费者提供更加智能和便捷的购物体验。该系统主要通过使用摄像头对零售柜内商品进行实时拍摄和录制,然后利用深度学习算法对商品的特征进行提取和分析,最终实现对商品的检测和识别。智能零售柜商品检测系统的主要功能包括实时监测零售柜中的商品,识别商品的种类、品牌、价格等信息,提供商品库存信息,帮助消费者更加便捷地进行购物,提高消费体验。该系统可以广泛应用于超市、便利店、餐饮等场所,有助于提高商品销售效率和管理效率,减少人工成本和误差率。同时,智能零售柜商品检测系统还可以结合其他技术手段,如语音识别、人脸识别等,实现更加智能化的购物体验,推动零售业的数字化转型和升级。

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



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



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


1. 效果演示


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

(一)系统介绍

       智能零售柜商品检测软件主要用于零售柜商品的智能检测与识别,利用零售柜顶部鱼眼相机采集的图像,基于深度学习技术识别柜内常见的113种零售商品,输出商品的标记框坐标和类别,以辅助自动化获取商品销售情况;软件提供登录注册功能,可进行用户管理;软件能够有效识别相机采集的图片、视频等文件形式,检测柜内商品销售情况,并记录识别结果在界面表格中方便查看;可开启摄像头实时监测和统计当前视野范围各种类型商品数目,支持结果记录、展示和保存。

(二)技术特点

        (1)YoloV5目标检测算法识别商品,模型支持更换;

        (2)摄像头实时检测柜内商品,展示、记录和保存销售情况;

        (3)检测图片、视频等图像中的零售柜商品;

        (4)支持用户登录、注册,检测结果可视化功能;

        (5)提供训练数据集和代码,可重新训练模型;

(三)用户注册登录界面

       这里设计了一个登录界面,可以注册账号和密码,然后进行登录。界面还是参考了当前流行的UI设计,左侧是一个logo图,右侧输入账号、密码、验证码等等。



(四)选择图片识别

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



(五)视频识别效果展示

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



(六)摄像头检测效果展示

       在真实场景中,我们往往利用摄像头获取实时画面,同时需要对零售柜商品进行识别,因此本文考虑到此项功能。如下图所示,点击摄像头按钮后系统进入准备状态,系统显示实时画面并开始检测画面中的零售柜商品,识别结果展示如下图:




2. 数据集及训练


       这里我们使用的商品数据集,其中包含零售柜中常见的113种零售商品,比如奶茶、方便面、可乐、果汁等各种商品,其类别如下:

python
Chinese_name = {'3+2-2': "3+2-2", '3jia2': "3+2", 'aerbeisi': "阿尔卑斯", 'anmuxi': "安慕希", 'aoliao': "奥利奥",
                'asamu': "阿萨姆", 'baicha': "白茶", 'baishikele': "百事可乐", 'baishikele-2': "百事可乐-2",
                'baokuangli': "宝矿力", 'binghongcha': "冰红茶", 'bingqilinniunai': "冰淇淋牛奶",
                'bingtangxueli': "冰糖雪梨", 'buding': "布丁", 'chacui': "茶萃", 'chapai': "茶π", 'chapai2': "茶π-2",
                'damaicha': "大麦茶", 'daofandian1': "到饭点-1", 'daofandian2': "到饭点-2", 'daofandian3': "到饭点-3",
                'daofandian4': "到饭点-4", 'dongpeng': "东鹏特饮", 'dongpeng-b': "东鹏特饮-b", 'fenda': "芬达",
                'gudasao': "顾大嫂", 'guolicheng': "果粒橙", 'guolicheng2': "果粒橙-2", 'haitai': "海苔",
                'haochidian': "好吃点", 'haoliyou': "好丽友", 'heweidao': "合味道", 'heweidao2': "合味道-2",
                'heweidao3': "合味道-3", 'hongniu': "红牛", 'hongniu2': "红牛-2", 'hongshaoniurou': "红烧牛肉",
                'jianjiao': "尖叫", 'jianlibao': "健力宝", 'jindian': "金典", 'kafei': "咖啡", 'kaomo_gali': "烤馍-咖喱",
                'kaomo_jiaoyan': "烤馍-椒盐", 'kaomo_shaokao': "烤馍-烧烤", 'kaomo_xiangcon': "烤馍-香葱", 'kebike': "可比克",
                'kele': "可乐", 'kele-b': "可乐-b", 'kele-b-2': "可乐-b-2", 'laotansuancai': "老坛酸菜",
                'liaomian': "撩面", 'libaojian': "力保健", 'lingdukele': "零度可乐", 'lingdukele-b': "零度可乐-b",
                'liziyuan': "李子园", 'lujiaoxiang': "鹿角巷",
                'lujikafei': "露吉咖啡", 'luxiangniurou': "卤香牛肉", 'maidong': "脉动", 'mangguoxiaolao': "芒果小酪",
                'meiniye': "梅尼耶", 'mengniu': "蒙牛",
                'mengniuzaocan': "蒙牛早餐奶",
                'moliqingcha': "茉莉清茶", 'nfc': "NFC果汁", 'niudufen': "牛肚粉", 'niunai': "牛奶",
                'nongfushanquan': "农夫山泉", 'qingdaowangzi-1': "青岛王子-1",
                'qingdaowangzi-2': "青岛王子-2",
                'qinningshui': "沁柠水", 'quchenshixiangcao': "屈臣氏香草味苏打水", 'rancha-1': "燃茶", 'rancha-2': "燃茶",
                'rousongbing': "肉松饼",
                'rusuanjunqishui': "乳酸菌汽水",
                'suanlafen': "酸辣粉",
                'suanlaniurou': "酸辣牛肉", 'taipingshuda': "太平梳打", 'tangdaren': "汤达人", 'tangdaren2': "汤达人-2",
                'tangdaren3': "汤达人-3", 'ufo': "UFO",
                'ufo2': "UFO-2",
                'wanglaoji': "王老吉", 'wanglaoji-c': "王老吉-c",
                'wangzainiunai': "旺仔牛奶", 'weic': "维C", 'weitanai': "维他奶", 'weitanai2': "维他奶-2",
                'weitanaiditang': "维他奶低糖",
                'weitaningmeng': "维他柠檬", 'weitaningmeng-bottle': "维他柠檬-瓶装",
                'weiweidounai': "维他豆奶", 'wuhounaicha': "午后奶茶", 'wulongcha': "乌龙茶", 'xianglaniurou': "香辣牛肉",
                'xianguolao': "鲜果捞",
                'xianxiayuban': "鲜虾鱼板面", 'xuebi': "雪碧", 'xuebi-b': "雪碧-b",
                'xuebi2': "雪碧-2", 'yezhi': "椰汁", 'yibao': "怡宝", 'yida': "益达", 'yingyangkuaixian': "营养快线",
                'yitengyuan': "伊藤园",
                'youlemei': "优乐美", 'yousuanru': "优酸乳", 'youyanggudong': "有养谷咚",
                'yuanqishui': "元气水", 'zaocanmofang': "早餐魔方", 'zihaiguo': "自嗨锅"}


        该数据集中,训练集有3796张图片,验证集1084张图片,测试集542张图片,共计5422张图片,选取部分数据部分样本数据集如图所示。



       每张图像均提供了图像类标记信息,图像中零售柜商品的bounding box,零售柜商品的关键part信息,以及零售柜商品的属性信息,数据集并解压后得到如下的图片



        对于原始的数据集标签文件格式不一致的问题,由于yolov5只认txt而不认json,因此还要有一个转换的过程:批量json转txt。可采用如下代码:

python
import json
import os
name2id = {'stitches': 0}  # 标签名称
def convert(img_size, box):
    dw = 1. / (img_size[0])
    dh = 1. / (img_size[1])
    x = (box[0] + box[2]) / 2.0 - 1
    y = (box[1] + box[3]) / 2.0 - 1
    w = box[2] - box[0]
    h = box[3] - box[1]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)
def decode_json(json_floder_path, json_name):
    txt_name = '/mnt/data/yolov5-master/nxm_data/labels_txt/' + json_name[0:-5] + '.txt'
    # 存放txt的绝对路径
    txt_file = open(txt_name, 'w')
    json_path = os.path.join(json_floder_path, json_name)
    data = json.load(open(json_path, 'r', encoding='gb2312', errors='ignore'))
    img_w = data['imageWidth']
    img_h = data['imageHeight']
    for i in data['shapes']:
        label_name = i['label']
        if (i['shape_type'] == 'rectangle'):
            x1 = int(i['points'][0][0])
            y1 = int(i['points'][0][1])
            x2 = int(i['points'][1][0])
            y2 = int(i['points'][1][1])
            bb = (x1, y1, x2, y2)
            bbox = convert((img_w, img_h), bb)
            txt_file.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')
if __name__ == "__main__":
    json_floder_path = '/mnt/data/yolov5-master/nxm_data/labels/'
    # 存放json的文件夹的绝对路径
    json_names = os.listdir(json_floder_path)
    for json_name in json_names:
        decode_json(json_floder_path, json_name)


        YoloV5原作者给出了4种模型的配置,分别为YoloV5s,YoloV5m,YoloV5l,YoloV5x,根据根据自己的实时性需求选择对应的网络。



        接下来只需要在train.py中修改对应的配置文件就好了,对于本数据集配置的yaml文件内容如下:。

python
train: ./Goods/images/train
val: ./Goods/images/val
test: ./Goods/images/test
nc: 113
names: ['3+2-2', '3jia2', 'aerbeisi', 'anmuxi', 'aoliao', 'asamu', 'baicha','baishikele', 'baishikele-2','baokuangli',
        'binghongcha', 'bingqilinniunai', 'bingtangxueli', 'buding', 'chacui', 'chapai', 'chapai2', 'damaicha',
        'daofandian1', 'daofandian2', 'daofandian3', 'daofandian4', 'dongpeng', 'dongpeng-b', 'fenda', 'gudasao',
        'guolicheng', 'guolicheng2', 'haitai', 'haochidian', 'haoliyou', 'heweidao', 'heweidao2', 'heweidao3',
        'hongniu', 'hongniu2', 'hongshaoniurou', 'jianjiao', 'jianlibao', 'jindian', 'kafei', 'kaomo_gali',
        'kaomo_jiaoyan', 'kaomo_shaokao', 'kaomo_xiangcon', 'kebike', 'kele', 'kele-b', 'kele-b-2',
        'laotansuancai', 'liaomian', 'libaojian', 'lingdukele','lingdukele-b','liziyuan','lujiaoxiang',
        'lujikafei','luxiangniurou','maidong','mangguoxiaolao','meiniye','mengniu','mengniuzaocan',
        'moliqingcha','nfc','niudufen','niunai','nongfushanquan','qingdaowangzi-1','qingdaowangzi-2',
        'qinningshui','quchenshixiangcao','rancha-1','rancha-2','rousongbing','rusuanjunqishui','suanlafen',
        'suanlaniurou','taipingshuda','tangdaren','tangdaren2','tangdaren3','ufo','ufo2','wanglaoji','wanglaoji-c',
        'wangzainiunai','weic', 'weitanai','weitanai2','weitanaiditang','weitaningmeng','weitaningmeng-bottle',
        'weiweidounai','wuhounaicha','wulongcha','xianglaniurou','xianguolao','xianxiayuban','xuebi','xuebi-b',
        'xuebi2','yezhi','yibao','yida','yingyangkuaixian','yitengyuan','youlemei','yousuanru','youyanggudong',
        'yuanqishui','zaocanmofang','zihaiguo']


        (1)train 指定训练集图像路径

        (2)val 指定验证集图像路径

        (3)test 指定测试集图像路径

        (4)nc 指定目标类别数量

        (5)目标对应类别名称

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



       在我们的训练过程中,mAP50作为一种常用的目标检测评估指标很快达到了较高水平,而mAP50:95也在训练的过程中不断提升,说明我们模型从训练-验证的角度表现良好。读入一个测试文件夹进行预测,通过训练得到的选取验证集上效果最好的权重best.pt进行实验,得到PR曲线如下图所示。



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



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


3. 智能零售柜商品检测


       在训练完成后得到最佳模型,接下来我们将帧图像输入到这个网络进行预测,从而得到预测结果,预测方法(predict.py)部分的代码如下所示:

python
def predict(img):
    img = torch.from_numpy(img).to(device)
    img = img.half() if half else img.float()
    img /= 255.0
    if img.ndimension() == 3:
        img = img.unsqueeze(0)
    t1 = time_synchronized()
    pred = model(img, augment=False)[0]
    pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes,
                               agnostic=opt.agnostic_nms)
    t2 = time_synchronized()
    InferNms = round((t2 - t1), 2)
    return pred, InferNms


       可以运行testPicture或testVideo两个脚本分别对图片和视频进行测试,其效果如下图所示:



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


相关文章
|
2天前
|
机器学习/深度学习 算法 搜索推荐
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
30 12
|
3天前
|
机器学习/深度学习 边缘计算 监控
深度学习赋能智能监控:图像识别技术的革新与应用
【4月更文挑战第23天】 随着人工智能的迅猛发展,深度学习技术在图像处理领域取得突破性进展,特别是在智能监控系统中,基于深度学习的图像识别已成为提升系统智能化水平的核心动力。本文旨在探讨深度学习如何优化智能监控系统中的图像识别过程,提高监控效率和准确性,并分析其在不同应用场景下的具体实施策略。通过深入剖析关键技术、挑战及解决方案,本文为读者提供了一个关于深度学习图像识别技术在智能监控领域应用的全面视角。
|
3天前
|
机器学习/深度学习 监控 安全
智能监控的革新者:基于深度学习的图像识别技术
【4月更文挑战第23天】 在智能监控领域,基于深度学习的图像识别技术已经成为一种革命性的工具。这种技术能够自动识别和分类图像中的对象,提供实时的、准确的信息,从而提高监控系统的效率和准确性。本文将探讨深度学习在图像识别中的应用,以及其在智能监控中的潜在价值。
|
3天前
|
机器学习/深度学习 运维 监控
深度学习在智能监控领域的革新:图像识别技术的崛起
【4月更文挑战第23天】 随着人工智能技术的飞速发展,深度学习已经成为推动计算机视觉进步的核心技术之一。特别是在智能监控领域,基于深度学习的图像识别技术正逐渐改变着安全监控的传统模式,提升系统的智能化水平。本文将探讨基于深度学习的图像识别技术在智能监控系统中的应用现状与挑战,分析其在目标检测、行为分析以及异常事件识别中的作用,并展望其未来发展趋势。
|
7天前
|
机器学习/深度学习 监控 算法
深度学习驱动下的智能监控革新:图像识别技术的前沿应用
【4月更文挑战第19天】 在数字时代,智能监控系统作为城市安全和效率的守护者,正经历着前所未有的技术变革。本文深入探讨了基于深度学习的图像识别技术如何重塑智能监控领域,通过算法创新提升识别准确率,实时处理大量数据,并在各种环境条件下稳定运行。我们将分析当前最前沿的技术应用案例,探讨其在实际应用中遇到的挑战及未来发展趋势,从而为相关领域的研究者和实践者提供参考和启示。
|
机器学习/深度学习 数据可视化 定位技术
Python 深度学习第二版(GPT 重译)(四)(4)
Python 深度学习第二版(GPT 重译)(四)
15 3
|
机器学习/深度学习 算法 算法框架/工具
Python 深度学习第二版(GPT 重译)(四)(2)
Python 深度学习第二版(GPT 重译)(四)
26 2
|
机器学习/深度学习 存储 计算机视觉
Python 深度学习第二版(GPT 重译)(四)(1)
Python 深度学习第二版(GPT 重译)(四)
23 3
|
机器学习/深度学习 API 算法框架/工具
Python 深度学习第二版(GPT 重译)(三)(3)
Python 深度学习第二版(GPT 重译)(三)
19 2
|
机器学习/深度学习 监控 算法框架/工具
Python 深度学习第二版(GPT 重译)(三)(2)
Python 深度学习第二版(GPT 重译)(三)
33 1