当前位置:   article > 正文

基于YoloV5的智能零售柜商品识别_用yolo开发一个商品识别功能

用yolo开发一个商品识别功能

下载yolov5:

git clone https://github.com/ultralytics/yolov5

进入yolov5文件夹,下载依赖文件

pip install -r requirements.txt

深度学习第一步 准备好数据集:

附件中的train.zip。

图片数据集为稀疏商品图片, 格式为jpg,标注文件符合VOC数据集类型,文件格式为xml。

数据集分为 训练集,验证集,测试集,

数据集分割

首先从数据集中抽取一百张图片以及对应的标签文件,作为测试集

接下来是对训练集和验证集进行分类

以下是分类的代码

  1. import xml.etree.ElementTree as ET
  2. import pickle
  3. import os
  4. from os import listdir, getcwd
  5. from os.path import join
  6. import random
  7. from shutil import copyfile
  8. classes = ['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', '']
  9. TRAIN_RATIO = 99
  10. def clear_hidden_files(path):
  11. dir_list = os.listdir(path)
  12. for i in dir_list:
  13. abspath = os.path.join(os.path.abspath(path), i)
  14. if os.path.isfile(abspath):
  15. if i.startswith("._"):
  16. os.remove(abspath)
  17. else:
  18. clear_hidden_files(abspath)
  19. wd = os.getcwd()
  20. data_base_dir = os.path.join(wd, "train/")
  21. if not os.path.isdir(data_base_dir):
  22. os.mkdir(data_base_dir)
  23. work_sapce_dir = os.path.join(data_base_dir, "train/")
  24. if not os.path.isdir(work_sapce_dir):
  25. os.mkdir(work_sapce_dir)
  26. annotation_dir = os.path.join(work_sapce_dir, "xml/")
  27. if not os.path.isdir(annotation_dir):
  28. os.mkdir(annotation_dir)
  29. clear_hidden_files(annotation_dir)
  30. image_dir = os.path.join(work_sapce_dir, "img/")
  31. if not os.path.isdir(image_dir):
  32. os.mkdir(image_dir)
  33. clear_hidden_files(image_dir)
  34. yolo_labels_dir = os.path.join(work_sapce_dir, "labels/")
  35. if not os.path.isdir(yolo_labels_dir):
  36. os.mkdir(yolo_labels_dir)
  37. clear_hidden_files(yolo_labels_dir)
  38. yolov5_images_dir = os.path.join(data_base_dir, "images/")
  39. if not os.path.isdir(yolov5_images_dir):
  40. os.mkdir(yolov5_images_dir)
  41. clear_hidden_files(yolov5_images_dir)
  42. yolov5_labels_dir = os.path.join(data_base_dir, "labels/")
  43. if not os.path.isdir(yolov5_labels_dir):
  44. os.mkdir(yolov5_labels_dir)
  45. clear_hidden_files(yolov5_labels_dir)
  46. yolov5_images_train_dir = os.path.join(yolov5_images_dir, "train/")
  47. if not os.path.isdir(yolov5_images_train_dir):
  48. os.mkdir(yolov5_images_train_dir)
  49. clear_hidden_files(yolov5_images_train_dir)
  50. yolov5_images_test_dir = os.path.join(yolov5_images_dir, "val/")
  51. if not os.path.isdir(yolov5_images_test_dir):
  52. os.mkdir(yolov5_images_test_dir)
  53. clear_hidden_files(yolov5_images_test_dir)
  54. yolov5_labels_train_dir = os.path.join(yolov5_labels_dir, "train/")
  55. if not os.path.isdir(yolov5_labels_train_dir):
  56. os.mkdir(yolov5_labels_train_dir)
  57. clear_hidden_files(yolov5_labels_train_dir)
  58. yolov5_labels_test_dir = os.path.join(yolov5_labels_dir, "val/")
  59. if not os.path.isdir(yolov5_labels_test_dir):
  60. os.mkdir(yolov5_labels_test_dir)
  61. clear_hidden_files(yolov5_labels_test_dir)
  62. train_file = open(os.path.join(wd, "yolov5_train.txt"), 'w',encoding='utf-8')
  63. test_file = open(os.path.join(wd, "yolov5_val.txt"), 'w',encoding='utf-8')
  64. train_file.close()
  65. test_file.close()
  66. train_file = open(os.path.join(wd, "yolov5_train.txt"), 'a',encoding='utf-8')
  67. test_file = open(os.path.join(wd, "yolov5_val.txt"), 'a',encoding='utf-8')
  68. list_imgs = os.listdir(image_dir) # list image files
  69. prob = random.randint(1, 100)
  70. for i in range(0, len(list_imgs)):
  71. path = os.path.join(image_dir, list_imgs[i])
  72. if os.path.isfile(path):
  73. image_path = image_dir + list_imgs[i]
  74. voc_path = list_imgs[i]
  75. (nameWithoutExtention, extention) = os.path.splitext(os.path.basename(image_path))
  76. (voc_nameWithoutExtention, voc_extention) = os.path.splitext(os.path.basename(voc_path))
  77. annotation_name = nameWithoutExtention + '.xml'
  78. annotation_path = os.path.join(annotation_dir, annotation_name)
  79. label_name = nameWithoutExtention + '.txt'
  80. label_path = os.path.join(yolo_labels_dir, label_name)
  81. prob = random.randint(1, 100)
  82. if (prob < TRAIN_RATIO): # train dataset
  83. if os.path.exists(annotation_path):
  84. train_file.write(image_path + '\n')
  85. convert_annotation(nameWithoutExtention) # convert label
  86. copyfile(image_path, yolov5_images_train_dir + voc_path)
  87. copyfile(label_path, yolov5_labels_train_dir + label_name)
  88. else: # test dataset
  89. if os.path.exists(annotation_path):
  90. test_file.write(image_path + '\n')
  91. convert_annotation(nameWithoutExtention) # convert label
  92. copyfile(image_path, yolov5_images_test_dir + voc_path)
  93. copyfile(label_path, yolov5_labels_test_dir + label_name)
  94. train_file.close()
  95. test_file.close()

分割好的数据集文件夹结构:

  1. - train
  2. - labels
  3. - train
  4. - val
  5. - images
  6. - train
  7. - val

为了符合coco数据集格式,需要将xml标签文件转化为txt格式:

  1. def convert_annotation(image_id):
  2. in_file = open('train/train/xml/%s.xml' % image_id) # xml路径
  3. out_file = open('train/train/labels/%s.txt' % image_id, 'w')
  4. tree = ET.parse(in_file)
  5. root = tree.getroot()
  6. size = root.find('size')
  7. w = int(size.find('width').text)
  8. h = int(size.find('height').text)
  9. for obj in root.iter('object'):
  10. difficult = obj.find('difficult').text
  11. cls = obj.find('name').text
  12. if cls not in classes or int(difficult) == 1:
  13. continue
  14. cls_id = classes.index(cls)
  15. xmlbox = obj.find('bndbox')
  16. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
  17. float(xmlbox.find('ymax').text))
  18. bb = convert((w, h), b)
  19. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  20. in_file.close()
  21. out_file.close()
  22. def convert(size, box): # 边界框的转换
  23. dw = 1. / size[0]
  24. dh = 1. / size[1]
  25. x = (box[0] + box[1]) / 2.0
  26. y = (box[2] + box[3]) / 2.0
  27. w = box[1] - box[0]
  28. h = box[3] - box[2]
  29. x = x * dw
  30. w = w * dw
  31. y = y * dh
  32. h = h * dh
  33. return (x, y, w, h)

配置YAML文件

  1. architecture: yolov5s ##使用yolov5预训练
  2. batch_size: 16
  3. epochs: 50
  4. lr: 0.001
  5. names: ##类别
  6. - 3+2-2
  7. - 3jia2
  8. - aerbeisi
  9. - anmuxi
  10. - aoliao
  11. - asamu
  12. - baicha
  13. - baishikele
  14. - baishikele-2
  15. ...
  16. nc: 113 ##类别数目
  17. train: train/images/train ##训练集路径
  18. val: train/images/val ##验证集路径

训练模型:

python train.py --img 640 --batch 16 --epochs 50 --data ./data/my.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt  

训练好的模型存在runs/exp/best.pt

TensorRT加速

下载好tensorrt之后

python export.py --weights best.pt --data data/my.yaml --include engine --device 0 --half    

将best.pt导出为best.engine

目标识别

python detect.py --source train/images/val --data data/my.yaml --weights best.engine --device 0
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/826173
推荐阅读
相关标签
  

闽ICP备14008679号