本次笔记主要内容为对上次笔记中未分析完的代码进行梳理解读,另外简单熟悉一下提高模型性能的不同可用方法。
Baseline代码解读(2)
!wget http://mirror.coggle.club/yolo/yolov8n-v8.2.0.pt -O yolov8n.pt
!mkdir -p ~/.config/Ultralytics/
!wget http://mirror.coggle.club/yolo/Arial.ttf -O ~/.config/Ultralytics/Arial.ttf
执行shell命令:使用 wget 命令下载yolov8模型, -O 指定保存的文件名及路径;使用 mkdir 命令创建指定多级目录;使用 wget 命令下载Arial字体文件至该目录中。
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
import warnings
warnings.filterwarnings('ignore')
!pip install ultralytics
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model.train(data="yolo-dataset/yolo.yaml", epochs=2, imgsz=1080, batch=16)
通过设定环境变量os.environ["CUDA_VISIBLE_DEVICES"] = "0"指定使用的GPU;
通过filterwarning设定忽略警告;
使用ultralytics模块的YOLO方法将之前下载的yolov8模型实例化为初始模型,并进行训练。train方法中各参数含义如下:data:提供数据配置文件路径。epoch:训练轮次。imgsz:图片尺寸。batch:训练批次。
model = YOLO("runs/detect/train/weights/best.pt")
开始准备处理测试集。使用训练结果中效果最好的模型。
for path in glob.glob('测试集/*.mp4'):
submit_json = []
results = model(path, conf=0.05, imgsz=1080, verbose=False)
for idx, result in enumerate(results):
boxes = result.boxes # Boxes object for bounding box outputs
masks = result.masks # Masks object for segmentation masks outputs
keypoints = result.keypoints # Keypoints object for pose outputs
probs = result.probs # Probs object for classification outputs
obb = result.obb # Oriented boxes object for OBB outputs
if len(boxes.cls) == 0:
continue
xywh = boxes.xyxy.data.cpu().numpy().round()
cls = boxes.cls.data.cpu().numpy().round()
conf = boxes.conf.data.cpu().numpy()
for i, (ci, xy, confi) in enumerate(zip(cls, xywh, conf)):
submit_json.append(
{
'frame_id': idx,
'event_id': i+1,
'category': category_labels[int(ci)],
'bbox': list([int(x) for x in xy]),
"confidence": float(confi)
}
)
with open('./result/' + path.split('/')[-1][:-4] + '.json', 'w', encoding='utf-8') as up:
json.dump(submit_json, up, indent=4, ensure_ascii=False)
使用glob方法检索测试集中所有mp4文件,使用上面的模型检测出结果,并序列化为json文件格式。具体步骤如下:
指定置信度0.05,对由glob检索得到的视频路径使用模型进行检测,输出结果为results;
遍历results中的每一帧预测结果,获得边界框、分割掩码、关键点、分类概率和方向边界框信息;
如当前帧无检测结果,则跳过后续处理;
获取边框信息(xywh)、类别(clf)和置信度(conf),以要求的提交格式组合,添加到submit_json中;
使用json.dump将写入所有结果信息的submit_json序列化处理,写为json文件格式。
!\rm result/.ipynb_checkpoints/ -rf
!\rm result.zip
!zip -r result.zip result/
使用rm命令删除result文件夹中不需要的文件和原来的result.zip,重新打包新的result.zip
模型提升性能方法
1. 更改训练集大小
for anno_path, video_path in zip(train_annos[:5], train_videos[:5])
在原本的该行代码中使用train数据中的前五组作为训练用数据,可以适当增大。
2. 改换初始模型
!wget http://mirror.coggle.club/yolo/yolov8n-v8.2.0.pt -O yolov8n.pt
更改wget命令后的下载路径,可选择其他可用的YOLO模型版本。如果修改了-O后的保存路径,则后续调用该模型时的路径也需作相应修改。
3. 调整训练参数
results = model.train(data="yolo-dataset/yolo.yaml", epochs=2, imgsz=1080, batch=16)
修改训练语句中指定的轮次(epoch)和批次(batch),epoch过低则容易拟合程度不足,过高则可能过拟合。batch决定了将训练样本分为多少批,batchsize大小影响了模型优化程度和速度。
注意:重新训练后需修改该处路径,找到正确的train文件夹
model = YOLO("runs/detect/train/weights/best.pt")
初步调整后,得分即可由原始的0.005提升至0.014。在后续实验中,遇到了
RuntimeError: DataLoader worker (pid XXX) is killed by signal 的问题,尚待解决