前言
最近 YOLOv8
的官方项目又迎来了一个大更新,这次更新对基础不好的同学影响可能比较大,
这次更新主要就是将原本的 ultralytics/nn/modules.py
拆分成了以下6
个文件:
_init_.py
block.py
conv.py
head.py
trasnformer.py
utils.py
有的同学可能不知道该加哪里了,我这里给大家说一下
原本添加模块流程
我们原本的添加模块的修改思路如下,以 space_to_depth
举例子:
- 在
ultralytics/models/v8
文件夹下新建一个yolov8-SPD-Conv.yaml
; - 将本文上面提供的
SPD-Conv
代码添加到ultralytics/nn/modules.py
文件末尾; - 将
SPD-Conv
这个类的名字加入到ultralytics/nn/tasks.py
中; - 修改
yolov8-SPD-Conv.yaml
,使用space_to_depth
构建SPD-Conv
主干网络 ; - 修改
ultralytics/yolo/cfg/default.yaml
文件的'--model'
默认参数,或者直接使用指令,就可以开始训练了。
具体步骤
在代码更新后,我们添加模块的修改思路如下,除第 2 步外,其它步骤完全没有改变,
那么现在第 2 步可以拆分为如下几步,我依然拿 space_to_depth
举例子,
- 首先我们在
block.py
的最下方添加模块代码。(当然加到conv.py
,head.py
什么的都没问题的)
- 随后 依然在
block.py
上方添加如下代码:
- 最后就是要在
_init__.py
中添加如下的代码:
添加好后,其它步骤和之前一模一样,目前 YOLOv8
的主分支还在不停的更新,大家用的版本几乎都不一样,所以大家可以根据自己代码情况自行判断。
还有一点值得注意,大家在 task.py
导包时,别忘了把刚加的模块导进去。
标签透明化 | 标签文字大小调节 | 框粗细调节
YOLOv8 标签透明化
alpha = 0.4 | alpha = 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)
随后将下方这两句替换掉
cv2.rectangle(overlay, p1, p2, color, -1, cv2.LINE_AA) # filled
cv2.putText(overlay,
最后添加这句
self.im = cv2.addWeighted(overlay, alpha, self.im, 1 - alpha, 0)
最后附上 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)
YOLOv8 标签文字大小调节
原始 lw/3 | 调整后 lw/5 |
---|---|
同样的,只需要修改一个文件 ultralytics/yolo/utils/plotting.py
,原始的文字尺寸是线的宽度除 3 ,我们如果想缩小就直接把分母变大,改如下的两个位置。
YOLOv8 检测框粗细调节
顺便说一下文本框的粗细调节,这个不用修改代码的,直接超参数后调就行了。文章来源:https://www.toymoban.com/news/detail-840646.html
最新版调节框粗细的超参数是 --line_width
,默认是 3 ,可以设置成 1文章来源地址https://www.toymoban.com/news/detail-840646.html
line_width=3 | line_width=1 |
---|---|
到了这里,关于YOLOv8及其改进系列(五) modules.py 文件划分子集 | 标签透明化与文字大小调节 | 框粗细调节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!