如图所示,在使用yolov8进行训练得模型进行推理时,我发现yolov8官方推理和我自己的推理结果不一致,排查后发现,yolov8与yolov5的推理程序也不一致
问题原因:
排查了一下图像预处理,两者一致,之后排查后处理,发现yolov5多出来了一个softmax操作,去除该操作后,推理结果一致。
解决方案:
1、去掉推理程序中的softmax处理
2、修改yolov8的classify部分,也就是head,路径如下
yolov8/ultralytics/nn/modules/head.py
代码中Classify部分
class Classify(nn.Module):
"""YOLOv8 classification head, i.e. x(b,c1,20,20) to x(b,c2)."""
def __init__(self, c1, c2, k=1, s=1, p=None, g=1):
"""Initializes YOLOv8 classification head with specified input and output channels, kernel size, stride,
padding, and groups.
"""
super().__init__()
c_ = 1280 # efficientnet_b0 size
self.conv = Conv(c1, c_, k, s, p, g)
self.pool = nn.AdaptiveAvgPool2d(1) # to x(b,c_,1,1)
self.drop = nn.Dropout(p=0.0, inplace=True)
self.linear = nn.Linear(c_, c2) # to x(b,c2)
def forward(self, x):
"""Performs a forward pass of the YOLO model on input image data."""
if isinstance(x, list):
x = torch.cat(x, 1)
x = self.linear(self.drop(self.pool(self.conv(x)).flatten(1)))
return x #修改后
# return x if self.training else x.softmax(1) #修改前
如代码所示,最后forward的return部分会在非train状态下,自动添加softmax,yolov5则没有该部分,直接像我代码一样返回x即可