赞
踩
最近 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
导包时,别忘了把刚加的模块导进去。
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)
原始 lw/3 | 调整后 lw/5 |
---|---|
同样的,只需要修改一个文件 ultralytics/yolo/utils/plotting.py
,原始的文字尺寸是线的宽度除 3 ,我们如果想缩小就直接把分母变大,改如下的两个位置。
顺便说一下文本框的粗细调节,这个不用修改代码的,直接超参数后调就行了。
最新版调节框粗细的超参数是 --line_width
,默认是 3 ,可以设置成 1
line_width=3 | line_width=1 |
---|---|
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。