问题:
在使用指令
yolo detect train model=XXX data=XXX
训练U版rtdetr时,博主发现训练完成后进行验证时,可以正常print各项指标(P、R、map)
然而,在使用指令
yolo detect val model=XXX data=XXX
进行验证时却出现指标全部为0的问题
本菜鸡摸索了好久终于找到了解决方法:
解决步骤:
1、将/ultralytics/models/rtdetr/__init__.py进行如下修改:
# Ultralytics YOLO 🚀, AGPL-3.0 license
from .model import RTDETR
from .predict import RTDETRPredictor
from .val import RTDETRValidator
from .train import RTDETRTrainer
__all__ = 'RTDETRPredictor', 'RTDETRValidator', 'RTDETR', 'RTDETRTrainer'
2、在/ultralytics/models/yolo/model.py文件中进行如下修改:
# Ultralytics YOLO 🚀, AGPL-3.0 license
from ultralytics.engine.model import Model
from ultralytics.models import yolo, rtdetr
from ultralytics.nn.tasks import ClassificationModel, DetectionModel, OBBModel, PoseModel, SegmentationModel
class YOLO(Model):
"""YOLO (You Only Look Once) object detection model."""
@property
def task_map(self):
"""Map head to model, trainer, validator, and predictor classes."""
return {
'classify': {
'model': ClassificationModel,
'trainer': yolo.classify.ClassificationTrainer,
'validator': yolo.classify.ClassificationValidator,
'predictor': yolo.classify.ClassificationPredictor, },
################修改validator&predictor######################################
'detect': {
'model': DetectionModel,
'trainer': yolo.detect.DetectionTrainer,
'validator': rtdetr.RTDETRValidator,
'predictor': rtdetr.RTDETRPredictor, },
################修改validator&predictor######################################
'segment': {
'model': SegmentationModel,
'trainer': yolo.segment.SegmentationTrainer,
'validator': yolo.segment.SegmentationValidator,
'predictor': yolo.segment.SegmentationPredictor, },
'pose': {
'model': PoseModel,
'trainer': yolo.pose.PoseTrainer,
'validator': yolo.pose.PoseValidator,
'predictor': yolo.pose.PosePredictor, },
'obb': {
'model': OBBModel,
'trainer': yolo.obb.OBBTrainer,
'validator': yolo.obb.OBBValidator,
'predictor': yolo.obb.OBBPredictor, }, }
修改完成后再次使用yolo val指令进行验证:
成功解决!(不过好像有点误差。。。)
总结:
问题的原因是,修改之前ulralytics默认使用的是yolo的相关后处理方法,修改后才是正确的rtdetr的后处理。