目标检测 YOLOv5 使用入门

人工智能105

目标检测 YOLOv5 使用入门

在很早之前,在 《深度学习笔记(40) YOLO》 提及到 YOLO 目标检测

目标检测 YOLOv5 使用入门
目前已经出到了 YOLOv5,源码放在 Github

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

然后就进入该文件夹,安装依赖包

$ cd yolov5
$ pip3 install -r requirements.txt

安装好依赖后,还需要下载模型,官方模型 有很多:
目标检测 YOLOv5 使用入门

默认使用的 yolov5s.pt,可以提前下载后放置在 \weights 文件夹下
目标检测 YOLOv5 使用入门

; 2. 例子

官方里给的使用多种来源数据的检测目标的例子:

$ python detect.py --source 0
                           img.jpg
                           vid.mp4
                           path/
                           path/*.jpg
                           'https://youtu.be/Zgi9g1ksQHc'
                           'rtsp://example.com/media.mp4'

那么先来查看 detect.py 文件:

if __name__ == "__main__":
    opt = parse_opt()
    main(opt)

parse_opt 是关于参数的设置

def parse_opt():
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path(s)')
    parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob, 0 for webcam')
    parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='(optional) dataset.yaml path')
    parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
    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: --classes 0, or --classes 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('--visualize', action='store_true', help='visualize features')
    parser.add_argument('--update', action='store_true', help='update all models')
    parser.add_argument('--project', default=ROOT / 'runs/detect', help='save results to project/name')
    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')
    parser.add_argument('--dnn', action='store_true', help='use OpenCV DNN for ONNX inference')
    opt = parser.parse_args()
    opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1
    print_args(vars(opt))
    return opt

参数说明–weights权重文件的路径地址–source数据来源 图片/视频路径,也可以是'0'(摄像头),也可以是rtsp等视频流–data数据集–imgsz网络输入图片大小。在处理过程中的图像尺寸,不同权重参数推荐的也不同,以"6"为结尾的权重推荐设置为1280–conf-thres置信度阈值,越大标注框越少–iou-thres交并比阈值,越大所得的重叠框越多–max-det一张图片中最多的检测个数–device所用设备,如CPU或GPU,程序为自动选择–view-img是否展示预测之后的图片/视频,默认False–save-txt是否将预测的框坐标以txt文件形式保存,默认False–save-conf是否保存置信度值在–save-txt文件夹中–save-crop是否保存裁剪的预测框,默认False–nosave是否不保存预测结果,默认False,即默认是将预测结果保存的–classes设置只保留某一部分类别,形如0或者0 2 3–agnostic-nms进行nms是否也去除不同类别之间的框,默认False–augment推理的时候进行多尺度,翻转等操作(TTA)推理–visualize可视化特征,默认False–update如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息,默认为False–project预测结果的存储路径,默认在runs/detect目录下–name预测结果的存储路径下的文件夹名,默认exp–exist-ok若设置该参数,则在相同文件夹下生成文件–line-thickness标注狂的厚度–hide-labels隐藏标签–hide-conf隐藏置信度–half采用FP16半精度推理–dnn使用OpenCV DNN进行ONNX推断

然后进入主函数 main

def main(opt):
    check_requirements(exclude=('tensorboard', 'thop'))
    run(**vars(opt))

如果想要加快加载过程的话,确保环境安装ok的情况下屏蔽了依赖检查

  1. 运行

这里采用摄像头作为数据输入,权重设置为 yolov5s.pt,置信度阈值为0.5
只检测人类,在 detect.py 文件中数据集默认为 data/coco128.yaml,查看其文件


nc: 80
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']

person人类的序号为0,那么就可以这样运行:

python detect.py --source 0 --weights weights/yolov5s.pt --conf-thres 0.5 --classes 0

目标检测 YOLOv5 使用入门

一般要的就是目标的类型、位置和置信度,查看源码158-171,把相关信息写入文件保存的代码:


for *xyxy, conf, cls in reversed(det):
    if save_txt:
        xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()
        line = (cls, *xywh, conf) if save_conf else (cls, *xywh)
        with open(f'{txt_path}.txt', 'a') as f:
            f.write(('%g ' * len(line)).rstrip() % line + '\n')

    if save_img or save_crop or view_img:
        c = int(cls)
        label = None if hide_labels else (names[c] if hide_conf else f'{names[c]}{conf:.2f}')
        annotator.box_label(xyxy, label, color=colors(c, True))
    if save_crop:
        save_one_box(xyxy, imc, file=save_dir / 'crops' / names[c] / f'{p.stem}.jpg', BGR=True)

可以看出,类型为 cls ,位置信息为 xywh,置信度为 conf

利用源码的图片检测

$ python detect.py --source=data/images/zidane.jpg  --weights=weights/yolov5s.pt

目标检测 YOLOv5 使用入门

将其数据显示:

LOGGER.info("cls:{}, xywh:{}, conf:{:.2f}".format(int(cls),(xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist(), conf))

得到齐祖和安胖,以及他们的Tie

cls:0, xywh:[0.32734376192092896, 0.6340277791023254, 0.4625000059604645, 0.7319444417953491], conf:0.67
cls:27, xywh:[0.3667968809604645, 0.7965278029441833, 0.04296875, 0.3791666626930237], conf:0.68
cls:0, xywh:[0.736328125, 0.5333333611488342, 0.31171876192092896, 0.9333333373069763], conf:0.88
cls:27, xywh:[0.7828124761581421, 0.5069444179534912, 0.03593749925494194, 0.14166666567325592], conf:0.26

谢谢

Original: https://blog.csdn.net/qq_32618327/article/details/125206372
Author: 氢键H-H
Title: 目标检测 YOLOv5 使用入门



相关阅读1

Title: WeNet语音识别实战

WeNet简介

WeNet是出门问问语音团队联合西工大语音实验室开源的一款面向工业落地应用的语音识别工具包,该工具用一套简洁的方案提供了语音识别从训练到部署的一条龙服务,其主要特点如下:

  • 使用conformer网络结构和CTC/attention loss联合优化方法,具有业界一流的识别效果。
  • 提供云上和端上直接部署的方案,最小化模型训练和产品落地之间的工程工作。
  • 框架简洁,模型训练部分完全基于pytorch生态,不依赖于kaldi等安装复杂的工具。
  • 详细的注释和文档,十分适合用于学习端到端语音识别的基础知识和实现细节。

目标检测 YOLOv5 使用入门

GitHub 地址:

https://github.com/wenet-e2e/wenet

WeNet-PC端

WeNet-移动端

文档和技术支持

WeNet本身的代码注释详细,便于初学者学习端到端语音识别的相关知识和实现技巧。

目标检测 YOLOv5 使用入门

基于WeNet的端到端语音识别产业应用

WeNet吸收了众家所长,既可以在模型训练上达到在各数据集上SOTA的效果,也可以给出比较完善的工业方案。 WeNet与以往工具不同之处在于,自问世起,它就同时提供了基于python/pytorch的训练脚本和基于c++/libtorch的工程化部署方案,是真正面向工业界的ASR工具。

目标检测 YOLOv5 使用入门

WeNet的技术方案目前已经落地到京东,网易,英伟达,喜马拉雅,作业帮,地平线,虎牙等公司的语音识别项目上。

开发者社区

目标检测 YOLOv5 使用入门

基于WeNet框架的开源项目,应用在众多领域。开发者技术交流、数据开源、论文分享等,让AI变得更简单为使命的开源社区。

目标检测 YOLOv5 使用入门

WeNet项目社区

WeNet的核心目标是为语音识别提供一套高性能易部署的工业级解决方案,完全聚焦于语音识别任务,同时对于常用的语音识别应用场景提出了一套效果极佳的端到端解决方案,而不去提供各类模型方案的大而全的集合。正因为这一明确的设计目标, WeNet在保持简洁易用的同时,在语音识别正确率、实时率和延时性都有着非常出色表现,可以直接在工业场景中落地应用。

WeNet语音识别实战课

语音之家-AI工匠学堂推出 WeNet 语音识别实战课》WeNet是目前工业界最流行的开源端到端语音识别系统之一,也是学习端到端语音识别的最佳实践项目。语音识别的学习者和从业者,可以通过学习这门课程高效全面的掌握 WeNet的基本原理和实战方法,降低自己摸索的成本,快速构建出高性能的语音识别系统。

讲师力量

目标检测 YOLOv5 使用入门

目标检测 YOLOv5 使用入门

目标检测 YOLOv5 使用入门

目标检测 YOLOv5 使用入门

课程目录

目标检测 YOLOv5 使用入门

课程必备入门基础

目标检测 YOLOv5 使用入门

机器学习基础

目标检测 YOLOv5 使用入门

Python

目标检测 YOLOv5 使用入门

C++

课程收获

目标检测 YOLOv5 使用入门

全套课程服务

  • 怎么上课?在哪上课? 报名后,班主任会引导你按时上课。本门课程采取录播的形式,电脑/手机都能随时看课,同时配有微信学习群,授课教师、助教老师在线答疑解惑。
  • 我可以在任何时间学习课程吗?课程有效期是多久? 课程有效期内,任何时间都可以学习。本门课一共设置10节课,学习期2个月,课程有效期为开课后一年,可在一年内反复学习。
  • 有不懂的地方,是否有专门的老师来提供帮助? 除了授课教师外,本门课还配有班主任及助教老师,班主任会督促引导你按时学习,学习中有不懂的地方助教老师或授课老师在线提供帮助。
  • 答疑课中我的问题一定会被回答到么? 课程学习中,会安排老师做在线答疑课,班主任会提前收集学生提问,答疑课后有问题也可以随时在学习群里提问,有问必答。
  • 怎么进入该课程答疑群? 报名后,由班主任邀请进入本门课程学习群。
  • 课程不满意,可以退款吗? 开课学习7天内不满意可无条件退款。
  • 课程学完后,如果还需要求职帮助,怎么办? 在你学完全部课程后,老师会为你做一份专属的学习情况总结,如果你还有求职需要,可以联系你的班主任问询。

Original: https://blog.csdn.net/weixin_48827824/article/details/125389681
Author: 语音之家
Title: WeNet语音识别实战

相关阅读2

Title: 简洁优美的深度学习包-bert4keras

在鹅厂实习阶段,follow苏神(科学空间)的博客,启发了idea,成功改进了线上的一款模型。想法产出和实验进展很大一部分得益于苏神设计的bert4keras,清晰轻量、基于keras,可以很简洁的实现bert,同时附上了很多易读的example,对nlp新手及其友好!本文推荐几篇基于bert4keras的项目,均来自苏神,对新手入门bert比较合适~

  • tokenizer:分词器,主要方法:encode,decode。
  • build_transformer_model:建立bert模型,建议看源码,可以加载多种权重和模型结构(如unilm)。
import numpy as np
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
from bert4keras.snippets import to_array

config_path = '/root/kg/bert/chinese_L-12_H-768_A-12/bert_config.json'
checkpoint_path = '/root/kg/bert/chinese_L-12_H-768_A-12/bert_model.ckpt'
dict_path = '/root/kg/bert/chinese_L-12_H-768_A-12/vocab.txt'

tokenizer = Tokenizer(dict_path, do_lower_case=True)
model = build_transformer_model(
    config_path=config_path, checkpoint_path=checkpoint_path, with_mlm=True
)

token_ids, segment_ids = tokenizer.encode(u'科学技术是第一生产力')

token_ids[3] = token_ids[4] = tokenizer._token_mask_id
token_ids, segment_ids = to_array([token_ids], [segment_ids])

probas = model.predict([token_ids, segment_ids])[0]
print(tokenizer.decode(probas[3:5].argmax(axis=1)))

  • 句子1和句子2拼接在一起输入bert。
  • bert模型的pooler输出经dropout和mlp投影到2维空间,做分类问题。
  • 最终整个模型是一个标准的keras model。
class data_generator(DataGenerator):
    """数据生成器
"""
    def __iter__(self, random=False):
        batch_token_ids, batch_segment_ids, batch_labels = [], [], []
        for is_end, (text1, text2, label) in self.sample(random):
            token_ids, segment_ids = tokenizer.encode(
                text1, text2, maxlen=maxlen
            )
            batch_token_ids.append(token_ids)
            batch_segment_ids.append(segment_ids)
            batch_labels.append([label])
            if len(batch_token_ids) == self.batch_size or is_end:
                batch_token_ids = sequence_padding(batch_token_ids)
                batch_segment_ids = sequence_padding(batch_segment_ids)
                batch_labels = sequence_padding(batch_labels)
                yield [batch_token_ids, batch_segment_ids], batch_labels
                batch_token_ids, batch_segment_ids, batch_labels = [], [], []

bert = build_transformer_model(
    config_path=config_path,
    checkpoint_path=checkpoint_path,
    with_pool=True,
    return_keras_model=False,
)

output = Dropout(rate=0.1)(bert.model.output)
output = Dense(
    units=2, activation='softmax', kernel_initializer=bert.initializer
)(output)

model = keras.models.Model(bert.model.input, output)
model = build_transformer_model(
    config_path,
    checkpoint_path,
    application='unilm',
    keep_tokens=keep_tokens,
)

NLG任务的loss是交叉熵,示例中的实现很美观:

  • CrossEntropy类继承Loss类,重写compute_loss。
  • 将参与计算loss的变量过一遍CrossEntropy,这个过程中loss会被计算,具体阅读Loss类源码。
  • 最终整个模型是一个标准的keras model。
class CrossEntropy(Loss):
    """交叉熵作为loss,并mask掉输入部分
"""
    def compute_loss(self, inputs, mask=None):
        y_true, y_mask, y_pred = inputs
        y_true = y_true[:, 1:]
        y_mask = y_mask[:, 1:]
        y_pred = y_pred[:, :-1]
        loss = K.sparse_categorical_crossentropy(y_true, y_pred)
        loss = K.sum(loss * y_mask) / K.sum(y_mask)
        return loss

model = build_transformer_model(
    config_path,
    checkpoint_path,
    application='unilm',
    keep_tokens=keep_tokens,
)

output = CrossEntropy(2)(model.inputs + model.outputs)

model = Model(model.inputs, output)
model.compile(optimizer=Adam(1e-5))
model.summary()

预测阶段自回归解码,继承AutoRegressiveDecoder类可以很容易实现beam_search。

项目地址:SimBert
融合了unilm和对比学习,data generator和loss类的设计很巧妙,值得仔细阅读,建议看不懂的地方打开jupyter对着一行一行print来理解。

bert4keras项目的优点:

  • build_transformer_model一句代码构建bert模型,一个参数即可切换为unilm结构。
  • 继承Loss类,重写compute_loss方法,很容易计算loss。
  • 深度基于keras,训练、保存和keras一致。
  • 丰富的example!苏神的前沿算法研究也会附上bert4keras实现。

Original: https://blog.csdn.net/weixin_44597588/article/details/123910248
Author: 一只用R的浣熊
Title: 简洁优美的深度学习包-bert4keras

相关阅读3

Title: tensorflow2.X和pytorch实现polyloss

polyloss是Cross-entropy loss和Focal loss的优化版本,PolyLoss在二维图像分类、实例分割、目标检测和三维目标检测任务上都明显优于Cross-entropy loss和Focal loss。

作者认为可以将常用的分类损失函数,如Cross-entropy loss和Focal loss,分解为一系列加权多项式基。

它们可以被分解为∑ j = 1 n α j ( 1 − P t ) j \sum_{j=1}^n\alpha_j(1-P_t)^j ∑j =1 n ​αj ​(1 −P t ​)j的形式,其中α j ∈ R + \alpha_j∈R^+αj ​∈R +为多项式系数,P t P_t P t ​为目标类标签的预测概率。每个多项式基( 1 − P t ) j (1-P_t)^j (1 −P t ​)j由相应的多项式系数α j ∈ R + \alpha_j∈R^+αj ​∈R +进行加权,这使PolyLoss能够很容易地调整不同的多项式基。

  • 当α j = 1 / j \alpha_j=1/j αj ​=1 /j时,PolyLoss等价于常用的Cross-entropy loss,但这个系数分配可能不是最优的。

注意:在图像分类训练时该polyloss已经对网络预测结果进行softmax缩放,在网络的最后一层可以不加softmax激活函数。但是预测图片时记得添加!

import tensorflow as tf

def poly1_cross_entropy(epsilon=1.0):
    def _poly1_cross_entropy(y_true, y_pred):

        pt = tf.reduce_sum(y_true * tf.nn.softmax(y_pred), axis=-1)
        CE = tf.nn.softmax_cross_entropy_with_logits(y_true, y_pred)
        Poly1 = CE + epsilon * (1 - pt)
        loss = tf.reduce_mean(Poly1)
        return loss
    return _poly1_cross_entropy

def poly1_focal_loss(gamma=2.0, epsilon=1.0, alpha=0.25):
    def _poly1_focal_loss(y_true, y_pred):
        p = tf.math.sigmoid(y_pred)
        ce_loss = tf.nn.sigmoid_cross_entropy_with_logits(y_true, y_pred)
        pt = y_true * p + (1 - y_true) * (1 - p)
        FL = ce_loss * ((1 - pt) ** gamma)

        if alpha >= 0:
            alpha_t = alpha * y_true + (1 - alpha) * (1 - y_true)
            FL = alpha_t * FL
        Poly1 = FL + epsilon * tf.math.pow(1 - pt, gamma + 1)
        loss = tf.reduce_mean(Poly1)
        return loss
    return _poly1_focal_loss

注意:在图像分类训练时该polyloss已经对网络预测结果进行softmax缩放,在网络的最后一层可以不加softmax激活函数。但是预测图片时记得添加!

import torch
import torch.nn as nn
import torch.nn.functional as F

class Poly1CrossEntropyLoss(nn.Module):
    def __init__(self,
                 num_classes: int,
                 epsilon: float = 1.0,
                 reduction: str = "none"):
"""
        Create instance of Poly1CrossEntropyLoss
        :param num_classes:
        :param epsilon:
        :param reduction: one of none|sum|mean, apply reduction to final loss tensor
"""
        super(Poly1CrossEntropyLoss, self).__init__()
        self.num_classes = num_classes
        self.epsilon = epsilon
        self.reduction = reduction
        return

    def forward(self, logits, labels):
"""
        Forward pass
        :param logits: tensor of shape [N, num_classes]
        :param labels: tensor of shape [N]
        :return: poly cross-entropy loss
"""
        labels_onehot = F.one_hot(labels, num_classes=self.num_classes).to(device=logits.device,
                                                                           dtype=logits.dtype)
        pt = torch.sum(labels_onehot * F.softmax(logits, dim=-1), dim=-1)
        CE = F.cross_entropy(input=logits, target=labels, reduction='none')
        poly1 = CE + self.epsilon * (1 - pt)
        if self.reduction == "mean":
            poly1 = poly1.mean()
        elif self.reduction == "sum":
            poly1 = poly1.sum()
        return poly1

class Poly1FocalLoss(nn.Module):
    def __init__(self,
                 num_classes: int,
                 epsilon: float = 1.0,
                 alpha: float = 0.25,
                 gamma: float = 2.0,
                 reduction: str = "none"):
"""
        Create instance of Poly1FocalLoss
        :param num_classes: number of classes
        :param epsilon: poly loss epsilon
        :param alpha: focal loss alpha
        :param gamma: focal loss gamma
        :param reduction: one of none|sum|mean, apply reduction to final loss tensor
"""
        super(Poly1FocalLoss, self).__init__()
        self.num_classes = num_classes
        self.epsilon = epsilon
        self.alpha = alpha
        self.gamma = gamma
        self.reduction = reduction
        return

    def forward(self, logits, labels):
"""
        Forward pass
        :param logits: output of neural netwrok of shape [N, num_classes] or [N, num_classes, ...]
        :param labels: ground truth of shape [N] or [N, ...], NOT one-hot encoded
        :return: poly focal loss
"""

        p = torch.sigmoid(logits)

        if labels.ndim == 1:
            labels = F.one_hot(labels, num_classes=self.num_classes)

        else:
            labels = F.one_hot(labels.unsqueeze(1), self.num_classes).transpose(1, -1).squeeze_(-1)

        labels = labels.to(device=logits.device,
                           dtype=logits.dtype)

        ce_loss = F.binary_cross_entropy_with_logits(logits, labels, reduction="none")
        pt = labels * p + (1 - labels) * (1 - p)
        FL = ce_loss * ((1 - pt) ** self.gamma)

        if self.alpha >= 0:
            alpha_t = self.alpha * labels + (1 - self.alpha) * (1 - labels)
            FL = alpha_t * FL

        poly1 = FL + self.epsilon * torch.pow(1 - pt, self.gamma + 1)

        if self.reduction == "mean":
            poly1 = poly1.mean()
        elif self.reduction == "sum":
            poly1 = poly1.sum()

        return poly1

以resnet18为例,训练过程loss图被删了,所以只能在花朵识别在验证集中识别一下,结果正确率上升了6%左右,数据集如下:
链接:https://pan.baidu.com/s/1zs9U76OmGAIwbYr91KQxgg
提取码:bhjx
有兴趣的小伙伴可以自己尝试一下。

Original: https://blog.csdn.net/qq_42025868/article/details/124559449
Author: Haohao+++
Title: tensorflow2.X和pytorch实现polyloss