手把手教你使用YOLOv5实现化妆品目标检测

YOLOv5目标检测框架搭建

源码下载
# 在github下载源码
$ git clone https://github.com/ultralytics/yolov5
环境搭建(GPU)
# 创建一个虚拟环境
python 3.8
pip install -r requirements

Ubuntu清理磁盘空间(磁盘空间不够)

# 查找100M以上的文件
sudo find / -size +100M |xargs ls -lh 
# 然后删除缓存中不需要的文件
环境搭建(CPU)
# 先安装torch,再安装tb-nightly,剩下按照requirement.txt所需包自适应安装
pip3 install torch==1.9.0+cpu torchvision==0.10.0+cpu torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
pip install tb-nightly
数据准备(略)与yolov3图片标注一样
搭建流程(训练自己的数据集)
  • 下载YOLOv5权重文件 放置到项目的根目录,或者新建自定义文件夹。(后面我直接将权重文件放到data文件夹下)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wfoiA0a2-1629983696166)(YOLOv5目标检测框架搭建.assets/image-20210708094051866.png)]

  • 在data目录下新建一下几个文件夹,把自己的数据集中图片放到JPEGImages文件夹中,图片对应的标签文件(xml文件)放到Annotations夹中,再把JPEGImages中的图片复制到images中。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UvD8jMM8-1629983696169)(YOLOv5目标检测框架搭建.assets/image-20210707143223664.png)]

  • 根目录创建make_txt.py
    import os
    import random
    trainval_percent = 0.1
    train_percent = 0.9
    xmlfilepath = 'data/Annotations'
    txtsavepath = 'data/ImageSets'
    total_xml = os.listdir(xmlfilepath)
    num = len(total_xml)
    list = range(num)
    tv = int(num * trainval_percent)
    tr = int(tv * train_percent)
    trainval = random.sample(list, tv)
    train = random.sample(trainval, tr)
    ftrainval = open('data/ImageSets/trainval.txt', 'w')
    ftest = open('data/ImageSets/test.txt', 'w')
    ftrain = open('data/ImageSets/train.txt', 'w')
    fval = open('data/ImageSets/val.txt', 'w')
    for i in list:
        name = total_xml[i][:-4] + '\n'
        if i in trainval:
            ftrainval.write(name)
            if i in train:
                ftest.write(name)
            else:
                fval.write(name)
        else:
            ftrain.write(name)
    ftrainval.close()
    ftrain.close()
    fval.close()
    ftest.close()
    
  • 根目录创建voc2_label.py
    import xml.etree.ElementTree as ET
    import pickle
    import os
    from os import listdir, getcwd
    from os.path import join
    sets = ['train', 'test','val']
    classes = ['bar','yt','dabao','kouhong','hf','fx','myl']  # 此处修改为你的分类
    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('data/Annotations/%s.xml' % (image_id))
        out_file = open('data/labels/%s.txt' % (image_id), 'w')
        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'):
            difficult = obj.find('difficult').text
            cls = obj.find('name').text
            if cls not in classes or int(difficult) == 1:
                continue
            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')
    wd = getcwd()
    print(wd)
    for image_set in sets:
        if not os.path.exists('data/labels/'):
            os.makedirs('data/labels/')
        image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
        list_file = open('data/%s.txt' % (image_set), 'w')
        for image_id in image_ids:
            list_file.write('data/images/%s.jpg\n' % (image_id))
            convert_annotation(image_id)
        list_file.close()
    
  • 依次执行上述文件,将生成以下文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kPuG3QoH-1629983696172)(YOLOv5目标检测框架搭建.assets/image-20210708094844937.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9aP8o8J-1629983696175)(YOLOv5目标检测框架搭建.assets/image-20210708095104976.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X6jFuczP-1629983696176)(YOLOv5目标检测框架搭建.assets/image-20210709140520319.png)]

  • 修改coco.yaml为自己数据集需要的形式,你可以复制一份重新命名,这里我复制一份命名为hzp.yaml
    # COCO 2017 dataset http://cocodataset.org
    # Train command: python train.py --data coco.yaml
    # Default dataset location is next to YOLOv5:
    #   /parent
    #     /datasets/coco
    #     /yolov5
    
    ## Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
    #path: ../datasets/coco  # dataset root dir
    #train: train2017.txt  # train images (relative to 'path') 118287 images
    #val: val2017.txt  # train images (relative to 'path') 5000 images
    #test: test-dev2017.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794
    
    # 此处修改 改成你的数据
    # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
    #path: ../datasets/coco  # dataset root dir
    train: data/train.txt  # train images (relative to 'path') 118287 images
    val: data/val.txt  # train images (relative to 'path') 5000 images
    test: data/test.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794
    
    # Classes
    #nc: 80  # number of classes
    #names: [ 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
    #         'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
    #         'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
    #         'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
    #         'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
    #         'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
    #         'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
    #         'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
    #         'hair drier', 'toothbrush' ]  # class names
    
    # 此处修改 你的类别数
    nc: 7
    # 此处修改 你的类别名称
    names: ['bar','yt','dabao','kouhong','hf','fx','myl']
    
    
    # Download script/URL (optional)
    download: |
      from utils.general import download, Path
    
      # Download labels
      segments = False  # segment or box labels
      dir = Path(yaml['path'])  # dataset root dir
      url = 'https://github.com/ultralytics/yolov5/releases/download/v1.0/'
      urls = [url + ('coco2017labels-segments.zip' if segments else 'coco2017labels.zip')]  # labels
      download(urls, dir=dir.parent)
    
      # Download data
      urls = ['http://images.cocodataset.org/zips/train2017.zip',  # 19G, 118k images
              'http://images.cocodataset.org/zips/val2017.zip',  # 1G, 5k images
              'http://images.cocodataset.org/zips/test2017.zip']  # 7G, 41k images (optional)
      download(urls, dir=dir / 'images', threads=3)
    
    
  • 修改models 下的yaml 文件,yolov5总共有四个模型,用哪个就修改那个,以yolov5s.yaml为例,只需修改 nc 为自己数据集的类别数即可
    # Parameters
    #nc: 80  # number of classes
    nc: 7  # number of classes   # 此处修改成你的类别数
    depth_multiple: 0.33  # model depth multiple
    width_multiple: 0.50  # layer channel multiple
    anchors:
      - [10,13, 16,30, 33,23]  # P3/8
      - [30,61, 62,45, 59,119]  # P4/16
      - [116,90, 156,198, 373,326]  # P5/32
    
    # YOLOv5 backbone
    backbone:
      # [from, number, module, args]
      [[-1, 1, Focus, [64, 3]],  # 0-P1/2
       [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
       [-1, 3, C3, [128]],
       [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
       [-1, 9, C3, [256]],
       [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
       [-1, 9, C3, [512]],
       [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
       [-1, 1, SPP, [1024, [5, 9, 13]]],
       [-1, 3, C3, [1024, False]],  # 9
      ]
    
    # YOLOv5 head
    head:
      [[-1, 1, Conv, [512, 1, 1]],
       [-1, 1, nn.Upsample, [None, 2, 'nearest']],
       [[-1, 6], 1, Concat, [1]],  # cat backbone P4
       [-1, 3, C3, [512, False]],  # 13
    
       [-1, 1, Conv, [256, 1, 1]],
       [-1, 1, nn.Upsample, [None, 2, 'nearest']],
       [[-1, 4], 1, Concat, [1]],  # cat backbone P3
       [-1, 3, C3, [256, False]],  # 17 (P3/8-small)
    
       [-1, 1, Conv, [256, 3, 2]],
       [[-1, 14], 1, Concat, [1]],  # cat head P4
       [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)
    
       [-1, 1, Conv, [512, 3, 2]],
       [[-1, 10], 1, Concat, [1]],  # cat head P5
       [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)
    
       [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
      ]
    
    
  • 训练模型
    # 参数可根据实际情况进行调整,这里注意各个文件的位置,如果是cpu,建议将batch调小,我设置的是1
    python train.py --img 640 --batch 4 --epoch 300 --data ./data/hzp.yaml --cfg ./models/yolov5s.yaml --weights data/yolov5s.pt --workers 0
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCTEareV-1629983696179)(YOLOv5目标检测框架搭建.assets/image-20210709101056247.png)]

  • 复制一份detect.py ,修改test_photo.py,后直接python test_photo.py 即可
    def parse_opt():
        parser = argparse.ArgumentParser()
        # 此处修改成你训练的模型
        parser.add_argument('--weights', nargs='+', type=str, default='runs/train/exp2/weights/best.pt', help='model.pt path(s)')
        # 此处修改成你要检测的照片
        parser.add_argument('--source', type=str, default='test_img/images', help='file/dir/URL/glob, 0 for webcam')
        parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='inference size (pixels)')
        parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold')
        parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold')
        parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image')
        parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
        parser.add_argument('--view-img', action='store_true', help='show results')
        parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
        parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
        parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes')
        parser.add_argument('--nosave', action='store_true', help='do not save images/videos')
        parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')
        parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
        parser.add_argument('--augment', action='store_true', help='augmented inference')
        parser.add_argument('--update', action='store_true', help='update all models')
        # 存放的文件夹
        parser.add_argument('--project', default='runs/detect', help='save results to project/name')
        # 存放默认名字exp 
        parser.add_argument('--name', default='exp', help='save results to project/name')
        parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
        parser.add_argument('--line-thickness', default=3, type=int, help='bounding box thickness (pixels)')
        parser.add_argument('--hide-labels', default=False, action='store_true', help='hide labels')
        parser.add_argument('--hide-conf', default=False, action='store_true', help='hide confidences')
        parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference')
        opt = parser.parse_args()
        return opt
    
    
  • 命令窗口中 测试命令可以对图片和视频进行检测
    # 使用训练好的模型测试test_img文件夹里面的照片
    python test_photo.py --source test_img/images/cup.jpg --weights runs/train/exp2/weights/best.pt --img 640
    # 视频测试,和图片一致
    python detect.py --source inference/2.mp4 --weights runs/exp27/weights/best.pt --output inference/detectoutput/ --device 0
    # 图片目录检测(暂时未使用)
    python detect.py --source inference/test --weights runs/exp27/weights/best.pt --output inference/detectoutput --conf-thres 0.5
    
  • 测试效果(测试口红检测效果)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Gt5n9uz-1629983696180)(YOLOv5%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E6%A1%86%E6%9E%B6%E6%90%AD%E5%BB%BA.assets/QQ%E5%9B%BE%E7%89%8720210826210550.jpg)]

  • 参考文章链接
    https://blog.csdn.net/qq_45359151/article/details/107591434
    https://www.icode9.com/content-3-774443.html
    https://www.cnblogs.com/monologuesmw/p/14465254.html
    
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 首先,你需要安装PyTorch和OpenCV。然后,你可以从GitHub上下载yolov5的代码。 接下来,你需要准备你的数据集。数据集应该包含你想要检测的物体的图像和标签。标签应该是一个XML文件,其中包含物体的类别和位置。 然后,你需要将数据集分成训练集和验证集。训练集用于训练模型,验证集用于评估模型的性能。 接下来,你需要创建一个配置文件,其中包含模型的参数和训练的超参数。你可以使用默认的配置文件,也可以根据你的需求进行修改。 然后,你可以开始训练模型。在训练过程中,你可以使用tensorboard来监视模型的性能。 最后,你可以使用训练好的模型来进行目标检测。你可以使用OpenCV来读取图像,并使用训练好的模型来检测物体。 总之,使用yolov5训练自己的目标检测模型需要一些准备工作和技能,但是一旦你掌握了这些技能,你就可以创建自己的目标检测模型了。 ### 回答2: Yolov5是一种便捷快速的目标检测框架,它在精度和速度上比之前的版本有所提高。如果你想要使用Yolov5训练自己的目标检测模型,以下是一些步骤和技巧。 1. 准备数据集:首先,必须准备一个数据集,该数据集包含你想要检测的物体的图像。数据集可以从其他公开数据集直接下载或从自己收集的数据集中获取。无论是哪种方式,数据集都必须以YOLOv5可读的格式组织,即每个图像必须有一个它的标签文件,标签文件中包含有关每个物体位置和类别的信息。 2. 安装必要的依赖项:安装YOLOv5需要具有Python,其次我们要安装所需的Python的库依赖,例如Pytorch、NumPy、Pandas,等等。 可以通过使用conda或pip来安装这些依赖项; 3. Clone YOLOv5 Github repostory:要下载Yolov5,可以克隆YOLOv5 Github网址。从命令行中运行以下命令: git clone https://github.com/ultralytics/yolov5.git cd yolov5 4. 这个项目结构: * ┣ data/ * ┃ ┣ image/ * ┃ ┃ ┣ train/ * ┃ ┃ ┃ ┣ image_1.jpg * ┃ ┃ ┃ ┣ image_1.txt * ┃ ┃ ┃ ...... * ┃ ┃ ┣ valid/ * ┃ ┣ train.py * ┃ ┣ utils/ * ┃ ┣ models/ * ┃ ┣ weights/ * ┣ name.names * ┣ yolov5s.yaml 5. 准备NGC预训练数据:在训练模型前,需要下载预训练权重。YOLOv5的权重文件可以从NGC上下载,也可以从 https://github.com/ultralytics/yolov5/releases/ 上下载发布的权重文件。 6. 配置自己的类别:可以通过YOLOv5的配置文件修改,Yolov5使用YAML(Yet Another Markup Language)格式来配置其超参数,如类别数量,学习率,训练epoch等。 7. 训练模型:准备好以上步骤后,就可以开始训练模型了。可以使用 train.py 脚本进行训练。比如: python train.py --img 640 --batch 16 --epochs 10 --data ./data/yolo.yaml --cfg models/yolov5s.yaml --weights "" 8. 验证、测试模型:尽管loss值很低,并不意味着模型一定很好。因此,为了更好的评估模型的性能,建议你对测试集进行评估,可以使用 detect.py 脚本来进行评估。比如: python detect.py --source data/images/test/ --weights runs/train/exp/weights/best.pt 9. 将模型导出为TensorRT引擎:为了在移动设备或嵌入式设备上使用Yolov5模型,可以将其导出为TensorRT引擎。可以使用Yolov5提供的 export.py 脚本导出为TensorRT引擎。 python export.py --weights runs/train/exp7/weights/best.pt --img 640 --batch 1 总的来说,使用Yolov5训练自己的目标检测模型需要一些前置工作去写,然后通过配置参数,运行训练、验证和测试脚本。在每个步骤中,需要十分清楚自己要做什么,处理好每一个细节问题,才能顺利地完成自己的目标检测模型训练并有一定的精度。 ### 回答3: Yolov5是一种深度学习模型,能够进行目标检测,它对于广泛的物体检测任务具有出色的性能。本文将手把手地介绍如何使用Yolov5进行目标检测模型的训练。 1. 下载和安装Yolov5 第一步是下载和安装Yolov5。我们可以在Github上得到最新的代码,并通过命令运行安装安装完成后,建议按照提示安装必要的Python依赖项。 2. 准备数据集 第二步是准备好训练和测试数据集,可以使用现成的数据集,也可以从头开始创建自己的数据集。对于自制数据集,需要将图像和注释文件存储在相应目录中。注释文件描述了图像中所有目标的位置和类别。当完成这一步骤时,我们应该获得训练和测试集目录,每个目录应该包含图像文件和相应的注释文件。 3. 配置训练参数 第三步是为训练配置所需的超参数。这些参数包括网络结构,学习率,批量大小,迭代次数等等。可以通过修改配置文件来设置这些参数。我们需要基于网络结构来选择模型的版本。在配置文件中,我们需要设置图像的大小、目标分类的数量、训练和测试数据集的路径以及其他必要的参数。 4. 训练模型 当所有参数设置完成后,可以开始训练模型。通过在命令行中运行yolo.py脚本,可以启动训练过程。该脚本在训练期间使用指定的超参数和数据集对模型进行训练,并输出各个batch的训练状态信息。 5. 评估模型 训练完模型后,需要对模型进行评估。评估过程包括计算模型的准确度、精度和召回率等指标。我们可以使用测试集对模型进行测试,并输出相关的指标信息。在测试期间,我们可以使用训练期超参数的某些变体或者优化超参数,以改进模型的精度。 6. 应用模型 最后一步是将模型应用于新的数据集。这可以通过在模型的输出上提取目标的位置和类别来完成,从而进行物体检测。在将模型应用于新数据集时,最好考虑训练和验证数据之间的数据分布差异,确保模型在新的数据集上的表现仍然良好。 总之,使用Yolov5进行目标检测模型的训练需要准备好训练和测试数据集、配置模型的超参数以及选择网络结构和版本。训练和评估模型后,就可以将模型应用于新的数据集。需要注意的是,在整个过程中,超参数的选择和调整对模型的性能有着关键性的影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小帆芽芽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值