yolov8的val.py的结果默认只在控制台显示,其中主要包括
Class Images Instances Box(P R mAP50 mAP50-95)
本文就是要将这些个信息都输出到指定文件(***.log文件)中保存,就不用每次要看数据都运行val.py了
原理:
就是将官方用logging模块输出到控制台的所有信息全部再输出到.log文件中,步骤一解决的是输出问题,步骤二是往log文件添加提示信息,步骤三解决的是.log文件的文件名字问题
步骤一:修改ultralytics-8.1.9-final/ultralytics/utils/__init__.py文件
定位到函数:def set_logging(name=LOGGING_NAME, verbose=True):
# ---------------将日志结果输出到文件中-----------------#
log_path = os.path.dirname(os.getcwd()) + '/ultralytics-8.1.9-final/runs/val/'#指定文件夹路径
from val import result_name
logfile = log_path + result_name+'.log'#“result_name”是和val.py运行生成的“文件夹的名称”一致方便一一对应
print_handler = logging.FileHandler(filename=logfile,encoding='utf-8') # 定义输出的文件名字
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s") # 是否加入时间
print_handler.setFormatter(formatter) # 设置屏幕上显示的格式为formatter,和上一句一起使用
logger.addHandler(print_handler)#往上面定义的logger对象中添加输出方式(print_handler这一个往文件输出的输出方式)
# ---------------将日志结果输出到文件中-----------------#
步骤二:修改ultralytics/models/yolo/detect/val.py
步骤二目的:这个步骤是让结果文件中出现
Class Images Instances Box(P R mAP50 mAP75 mAP50-95)
如果你不介意少了这个只有数据那就不用,直接步骤三
具体操作:定位到函数:def get_desc(self):
添加
由于我是添加了map75的,所以我的和你们的不一样,因此
直接用你们代码里面的绿框替换黄框
步骤三:调整我们跑验证的val.py文件
有些人可能并没有用单独的val来跑,用官方的val或者命令行来跑,不过添加方法也是一样的,先来看看用自己单独的val.py跑的如何添加
①用自己的val.py跑
自己原始的val.py
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('runs/train/yolov8/weights/best.pt')
model.val(data='ultralytics/cfg/datasets/mydata2021bbox.yaml',
split='val',
imgsz=640,
batch=16,
iou=0.6,
conf=0.001,
# rect=False,
# save_json=True, # if you need to cal coco metrice
project='runs/val/yolov8',
name='exp',
workers=0,
)
修改后的val.py
黄框的这个引用的位置调整是为了防止步骤一的那个文件引用result_name这个路径变量的时候再一次import了yolo报错
红框就是添加的部分,如果是最后val.py所有图片和结果的文件夹名字,不但给本文件使用,而且给日志的输出文件使用
②用官方的val.py跑
这个也一样,就是把红框的部分改变一模一样的改到官方的val.py中
结果:
运行val.py后生成了红框的两个文件
下面的红框的文件就是本文所要的文件