当前位置:   article > 正文

YOLOv8及其改进系列(五) modules.py 文件划分子集 | 标签透明化与文字大小调节 | 框粗细调节_yolov8检测框字体修改

yolov8检测框字体修改

前言

最近 YOLOv8 的官方项目又迎来了一个大更新,这次更新对基础不好的同学影响可能比较大,

这次更新主要就是将原本的 ultralytics/nn/modules.py 拆分成了以下6个文件:

  1. _init_.py
  2. block.py
  3. conv.py
  4. head.py
  5. trasnformer.py
  6. utils.py

有的同学可能不知道该加哪里了,我这里给大家说一下


原本添加模块流程

我们原本的添加模块的修改思路如下,以 space_to_depth 举例子:

  1. ultralytics/models/v8文件夹下新建一个 yolov8-SPD-Conv.yaml
  2. 将本文上面提供的 SPD-Conv 代码添加到 ultralytics/nn/modules.py 文件末尾;
  3. SPD-Conv 这个类的名字加入到 ultralytics/nn/tasks.py 中;
  4. 修改 yolov8-SPD-Conv.yaml ,使用space_to_depth构建SPD-Conv主干网络 ;
  5. 修改 ultralytics/yolo/cfg/default.yaml 文件的 '--model' 默认参数,或者直接使用指令,就可以开始训练了。

具体步骤

在代码更新后,我们添加模块的修改思路如下,除第 2 步外,其它步骤完全没有改变,

那么现在第 2 步可以拆分为如下几步,我依然拿 space_to_depth 举例子,

  1. 首先我们在 block.py 的最下方添加模块代码。(当然加到 conv.pyhead.py什么的都没问题的)
    在这里插入图片描述
  2. 随后 依然在 block.py 上方添加如下代码:
    在这里插入图片描述
  3. 最后就是要在 _init__.py 中添加如下的代码:
    在这里插入图片描述

添加好后,其它步骤和之前一模一样,目前 YOLOv8 的主分支还在不停的更新,大家用的版本几乎都不一样,所以大家可以根据自己代码情况自行判断。

还有一点值得注意,大家在 task.py 导包时,别忘了把刚加的模块导进去。

在这里插入图片描述

标签透明化 | 标签文字大小调节 | 框粗细调节

YOLOv8 标签透明化

alpha = 0.4alpha = 0.7
请添加图片描述请添加图片描述

可能大家在检测一些密集目标时经常会遇到标签名互相遮挡的情况,这里给大家分享一个调整标签透明度的方法。

修改方式非常简单,只需要修改一个文件 ultralytics/yolo/utils/plotting.py


第一步将 cv2.rectangle(self.im, p1, p2, color, thickness=self.lw, lineType=cv2.LINE_AA) 这句注释掉,

换成下面这三句:

            overlay = self.im.copy()
            alpha = 0.7  # 透明度 数值越小 透明度越高
            cv2.rectangle(overlay, p1, p2, color, thickness=self.lw, lineType=cv2.LINE_AA)
  • 1
  • 2
  • 3

在这里插入图片描述

随后将下方这两句替换掉

                cv2.rectangle(overlay, p1, p2, color, -1, cv2.LINE_AA)  # filled
                cv2.putText(overlay,
  • 1
  • 2

在这里插入图片描述

最后添加这句

self.im = cv2.addWeighted(overlay, alpha, self.im, 1 - alpha, 0)
  • 1

在这里插入图片描述


最后附上 box_label 的完整代码

    def box_label(self, box, label='', color=(128, 128, 128), txt_color=(255, 255, 255)):
        """Add one xyxy box to image with label."""
        if isinstance(box, torch.Tensor):
            box = box.tolist()
        if self.pil or not is_ascii(label):
            self.draw.rectangle(box, width=self.lw, outline=color)  # box
            if label:
                if self.pil_9_2_0_check:
                    _, _, w, h = self.font.getbbox(label)  # text width, height (New)
                else:
                    w, h = self.font.getsize(label)  # text width, height (Old, deprecated in 9.2.0)
                outside = box[1] - h >= 0  # label fits outside box
                self.draw.rectangle(
                    (box[0], box[1] - h if outside else box[1], box[0] + w + 1,
                     box[1] + 1 if outside else box[1] + h + 1),
                    fill=color,
                )
                # self.draw.text((box[0], box[1]), label, fill=txt_color, font=self.font, anchor='ls')  # for PIL>8.0
                self.draw.text((box[0], box[1] - h if outside else box[1]), label, fill=txt_color, font=self.font)
        else:  # cv2
            p1, p2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))
            # cv2.rectangle(self.im, p1, p2, color, thickness=self.lw, lineType=cv2.LINE_AA)
            overlay = self.im.copy()
            alpha = 0.7  # 透明度 数值越小 透明度越高
            cv2.rectangle(overlay, p1, p2, color, thickness=self.lw, lineType=cv2.LINE_AA)
            if label:
                tf = max(self.lw - 1, 1)  # font thickness
                w, h = cv2.getTextSize(label, 0, fontScale=self.lw / 3, thickness=tf)[0]  # text width, height
                outside = p1[1] - h >= 3
                p2 = p1[0] + w, p1[1] - h - 3 if outside else p1[1] + h + 3
                # cv2.rectangle(self.im, p1, p2, color, -1, cv2.LINE_AA)  # filled
                # cv2.putText(self.im,
                cv2.rectangle(overlay, p1, p2, color, -1, cv2.LINE_AA)  # filled
                cv2.putText(overlay,
                            label, (p1[0], p1[1] - 2 if outside else p1[1] + h + 2),
                            0,
                            self.lw / 3,
                            txt_color,
                            thickness=tf,
                            lineType=cv2.LINE_AA)
                self.im = cv2.addWeighted(overlay, alpha, self.im, 1 - alpha, 0)
  • 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

YOLOv8 标签文字大小调节

原始 lw/3调整后 lw/5
在这里插入图片描述在这里插入图片描述

同样的,只需要修改一个文件 ultralytics/yolo/utils/plotting.py,原始的文字尺寸是线的宽度除 3 ,我们如果想缩小就直接把分母变大,改如下的两个位置。

在这里插入图片描述

YOLOv8 检测框粗细调节

顺便说一下文本框的粗细调节,这个不用修改代码的,直接超参数后调就行了。

最新版调节框粗细的超参数是 --line_width ,默认是 3 ,可以设置成 1

line_width=3line_width=1
在这里插入图片描述在这里插入图片描述

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

闽ICP备14008679号