【Datawhale AI夏令营第五期】 CV方向 Task03 各种尝试,想方设法上分
教程部分:
首先是我自己没事瞎点,发现了DataWhale的开源课程平台链接:
https://linklearner.com/learn
传送门
接下来看看本期教程:
我之前跟着B站大佬@同济子豪兄的视频《两天搞定人工智能毕业设计》项目的时候,有一个步骤就是把图片旋转翻转缩放一顿操作,当时只知道是增加模型适应奇葩数据的能力,现在才知道原来这是数据集增强,而且还有这么多我不知道的神奇操作。
而且YOLO支持同时处理图像和视频。
(说到这个“感兴趣的对象”,我还真的很好奇,计算机视觉能显示模型对什么感到好奇吗?如果没有认为给模型传达要识别什么东西的任务,模型眼里的世界是什么样子?模型会不会自发对环境的某个部分感到好奇想了解,并把注意力分配到那里去呢??)
感觉这张表有点不准确?都没具体数字,哪来的概率为0,置信度为92%??
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n.pt") # pretrained YOLOv8n model
# Run batched inference on a list of images
results = model(["im1.jpg", "im2.jpg"]) # return a list of Results objects
# Process results list
for result in 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
result.show() # display to screen
result.save(filename="result.jpg") # save to disk
一些灵活的小技巧:
应该看不到那去但还是搬来的参考资料:
https://docs.ultralytics.com/modes/predict/#inference-arguments
https://docs.ultralytics.com/yolov5/tutorials/tips_for_best_training_results/?h=result#model-selection
https://docs.ultralytics.com/yolov5/tutorials/test_time_augmentation/
想方设法跟着Baseline的提示再往上卷分:
之前把训练集从喂5个改成喂15个,结果一下子得分都翻了三倍。
下面这是第一次的结果:
改成喂15个视频的结果:
但是我感觉第二次的result图片有点怪,不太确定是不是我没搞对??现在想回去看结果发现机器的GPU无了,只能重开一台……
这次我又想了几个混分的可能优化方案:
1.把训练集拉满,有的全用上!
2.换参数尽可能多的模型,让他多学点特征!
3.超参数这边看看能不能在通义千问的帮助下,使用Optuna调参提升效果!
4.如果有需要的话,让通义千问和Kimi看看怎么避免过拟合?
第一点不用说,直接把训练集全送进去就是 。注意要给验证集留点数据,这俩不能重复,按照Kimi帮写的代码,我设置训练集:验证集为4:1.
注意这一步可能会把电脑搞得比较卡……过程很漫长。
然而这招行不通,会把机器占满:
我重开了两台机器以后,看总数据量在52条左右,决定训练集就拿25条数据。
就这样都还多了,CUDA不够训练的……那我还是就保持15条吧。
这都还不行,6。给我整得有点不会了,看群里都讨论有没有人把训练集冲完了,咋个我这边没喂几条数据就报错呢???
难道是下面这个第二点的yolo8x模型太大了???
第二点这是我以前学校学到的经验,模型的后缀其实表示了这个模型的参数量和计算量大小,我要试试这个顶配,也就是后缀为x的这一款。
把下载和使用的模型换了:
鉴于这个机器实在太不能装了,我这次换最大的模型+10条训练数据看看。
即便这样,都还是报CUDA out of memory……
好吧 ,那我就按默认模型的配置,把训练数据量往上拉,看看能不能配合一下Optuna。
先看看最初模型+20组训练集的result表现如何:
所以训练数据多了还不如第二轮了是吗……66666。
我先把完整代码给Kimi,让它帮我写了Optuna的代码,但我看得陷入了沉思……
import optuna
from ultralytics import YOLO
import os
# 假设你有一个函数来计算验证集上的 mAP
def get_validation_map(model, data_path, img_size):
# 这里应该是你的模型验证代码
# 请用你的模型验证逻辑替换这里的代码
# 返回验证集上的 mAP 值
return 0.85 # 示例 mAP 值
# 定义 Optuna 目标函数
def objective(trial):
data_dict = {
"path": "./yolo-dataset/",
"train": "./yolo-dataset/train/",
"val": "./yolo-dataset/val/"
}
epochs = trial.suggest_int("epochs", 10, 50)
batch_size = trial.suggest_categorical("batch_size", [8, 16, 32, 64])
lr = trial.suggest_float("learning_rate", 1e-5, 1e-2, log=True)
imgsz = trial.suggest_categorical("imgsz", [416, 512, 608, 864, 1080])
# 配置模型
model = YOLO("yolov8n.pt")
# 训练模型(这里假设 YOLO 类有一个 train 方法)
results = model.train(data=data_dict, epochs=epochs, imgsz=imgsz, batch=batch_size, lr=lr)
# 计算验证集上的 mAP
validation_map = get_validation_map(model, data_dict["val"], imgsz)
return validation_map
# 创建 Optuna 研究
study = optuna.create_study(direction="maximize")
# 运行优化
study.optimize(objective, n_trials=100)
# 打印最佳超参数
print("Best trial:")
trial = study.best_trial
print(f" Value: {
trial.value}")
print(f" Params: {
trial.params}")
# 使用最佳超参数重新训练模型
best_params = {
"epochs": trial.params["epochs"],
"batch_size": trial.params["batch_size"],
"lr": trial.params["learning_rate"],
"imgsz": trial.params["imgsz"]
}
# 重新训练模型并保存最佳模型
model = YOLO("yolov8n.pt")
results = model.train(data=data_dict, **best_params)
# 假设模型训练结果中包含了最佳模型的路径
best_model_path = results.get("best_model_path", "path_to_best_model.pt")
# 保存模型(这里需要根据你的模型实现来调整)
我决定放弃了……真没搞懂我应该怎么用这玩意。试试原样拷贝粘贴进去吧,满屏幕爆红,真心崩溃。
果然要干点啥还是不容易……像我之前还是有一些CV和机器学习基础的,好不容易想出这么多损招,就没啥能实现的。
以及喜提全网第一合影留念打卡!感谢和鲸平台举办这么干货满满的学习活动,有缘再见!