首页 > 其他分享 >Datawhale AI 夏令营 第五期 CV方向 02进阶

Datawhale AI 夏令营 第五期 CV方向 02进阶

时间:2024-08-29 22:37:46浏览次数:12  
标签:02 进阶 idx min AI frame img anno path

上次的baseline方案,训练的模型,获得分数并不高,DataWhale提供了两个上分的思路

  1. 增加训练数据集
  2. 切换不同模型预训练权重

增加训练集的大小通常可以提高模型的泛化能力,因为更多的数据可以帮助模型学习到更多的特征和模式。但是,越大的数据集,就意味着需要更多的计算资源和时间来训练模型,以及可能出现的过拟合问题。

增加训练数据集

增大数据集的一些方法:

  1. 数据增强: 通过对现有数据进行变换(如旋转、缩放、裁剪、颜色调整等)来增加数据集的多样性。

  2. 合成数据: 使用数据合成技术生成新的训练样本,尤其是在数据稀缺的情况下。

  3. 数据挖掘: 从互联网或公共数据集中收集更多相关数据。

  4. 众包: 利用众包平台收集和标注数据。

  5. 迁移学习: 使用预训练模型作为起点,然后在较小的数据集上进行微调。

  6. 分层抽样: 确保数据集中的每个类别都有足够数量的样本。

  7. 交叉验证: 使用交叉验证来更有效地利用有限的数据,同时评估模型的稳定性。

  8. 正则化技术: 如L1或L2正则化,以减少过拟合的风险。

  9. 早停法: 在验证集上的性能不再提升时停止训练,以避免过拟合。

  10. 调整模型复杂度: 根据数据集的大小调整模型的复杂度,以找到最佳的模型容量。

这里,我们直接从数据集中划分更多的数据作为训练数据,同时,验证集也增大

训练集增大到30

for anno_path, video_path in zip(train_annos[:30], train_videos[:30]):
    print(video_path)
    anno_df = pd.read_json(anno_path)
    cap = cv2.VideoCapture(video_path)
    frame_idx = 0 
    while True:
        ret, frame = cap.read()
        if not ret:
            break

        img_height, img_width = frame.shape[:2]
        
        frame_anno = anno_df[anno_df['frame_id'] == frame_idx]
        cv2.imwrite('./yolo-dataset/train/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.jpg', frame)

        if len(frame_anno) != 0:
            with open('./yolo-dataset/train/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.txt', 'w') as up:
                for category, bbox in zip(frame_anno['category'].values, frame_anno['bbox'].values):
                    category_idx = category_labels.index(category)
                    
                    x_min, y_min, x_max, y_max = bbox
                    x_center = (x_min + x_max) / 2 / img_width
                    y_center = (y_min + y_max) / 2 / img_height
                    width = (x_max - x_min) / img_width
                    height = (y_max - y_min) / img_height

                    if x_center > 1:
                        print(bbox)
                    up.write(f'{category_idx} {x_center} {y_center} {width} {height}\n')
        
        frame_idx += 1

验证集

for anno_path, video_path in zip(train_annos[-10:], train_videos[-10:]):
    print(video_path)
    anno_df = pd.read_json(anno_path)
    cap = cv2.VideoCapture(video_path)
    frame_idx = 0 
    while True:
        ret, frame = cap.read()
        if not ret:
            break

        img_height, img_width = frame.shape[:2]
        
        frame_anno = anno_df[anno_df['frame_id'] == frame_idx]
        cv2.imwrite('./yolo-dataset/val/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.jpg', frame)

        if len(frame_anno) != 0:
            with open('./yolo-dataset/val/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.txt', 'w') as up:
                for category, bbox in zip(frame_anno['category'].values, frame_anno['bbox'].values):
                    category_idx = category_labels.index(category)
                    
                    x_min, y_min, x_max, y_max = bbox
                    x_center = (x_min + x_max) / 2 / img_width
                    y_center = (y_min + y_max) / 2 / img_height
                    width = (x_max - x_min) / img_width
                    height = (y_max - y_min) / img_height

                    up.write(f'{category_idx} {x_center} {y_center} {width} {height}\n')
        
        frame_idx += 1

切换不同模型预训练权重

先了解一下YOLO系列中常见的不同版本(s, m, l, x)的区别:

  1. YOLO-S (Small): 这是YOLO系列中的小型版本,通常具有较少的参数和较低的计算需求。它适用于资源受限的环境,如移动设备或嵌入式系统,但可能在检测精度上有所牺牲。

  2. YOLO-M (Medium): 中型版本提供了一个平衡点,它比小型版本有更多的参数和更高的计算需求,同时保持了较好的检测精度和速度。

  3. YOLO-L (Large): 大型版本拥有最多的参数和最高的计算需求。它提供了更高的检测精度,但速度可能会慢于小型和中型版本。

  4. YOLO-X (Extra Large): 这是YOLO系列中的超大型版本,它具有最多的参数和最高的计算需求。YOLO-X通常用于需要最高精度的场景,尽管它的速度可能不如其他版本快。

这里选择了YOLOv8s的预训练模型

同时增加训练回合

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

import warnings
warnings.filterwarnings('ignore')


from ultralytics import YOLO
# model = YOLO("yolov8n.pt")
model = YOLO("yolov8s.pt")
results = model.train(data="yolo-dataset/yolo.yaml", epochs=30, imgsz=1080, batch=16)

这是baseline的训练日志

这是优化以后的训练日志

可以看到:
泛化能力(dfl_loss)和准确性(cls_loss)都有提高

标签:02,进阶,idx,min,AI,frame,img,anno,path
From: https://www.cnblogs.com/zynevergiveup12/p/18387605

相关文章

  • 插件开发:生成AI虚拟主播直播带货!
    随着人工智能技术的飞速发展,AI虚拟主播在电商直播领域逐渐成为新宠,它们不仅具备无档期风险、人设稳定可控、24小时不间断直播等优势,还能通过智能交互显著提升用户体验和购买转化率。本文将深入探讨如何开发一个AI虚拟主播直播带货插件,并通过解析六段关键源代码,帮助读者理解这一复杂......
  • 广电数安 未来已展 | 天空卫士亮相BIRTV2024
    8月21日至24日,第三十一届北京国际广播电影电视展览会(BIRTV2024)在北京隆重举行。开幕当天,中宣部及广电总局领导莅临我司展位,对安全科技引领以及护航新质生产力等方面提出期望和要求。天空卫士作为唯一一家数据安全厂商受邀参展,借此机遇,向与会嘉宾展示了为广电行业量身打造的全新数据......
  • 最高等级,首批通过!文心快码通过中国信通院可信AI智能编码工具评估
    在当下这个快节奏的开发时代,每一个程序员都在追求更高效、更准确的编码方式。而在这个追求中,百度文心快码(BaiduComate)不负众望,从众多AI智能编码工具中脱颖而出,成为中国信通院首批“可信AI智能编码工具”评估中的佼佼者,荣获最高评级。想象一下,你正在为一段复杂的代码逻辑而苦恼,文心......
  • 基于LangChain手工测试用例转Web自动化测试生成工具
    在传统编写Web自动化测试用例的过程中,基本都是需要测试工程师,根据功能测试用例转换为自动化测试的用例。市面上自动生成Web或App自动化测试用例的产品无非也都是通过录制的方式,获取操作人的行为操作,从而记录测试用例。整个过程类似于但是通常录制出来的用例可用性、可维护性......
  • 层序遍历(广度优先搜索)-102
    题目描述给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。解题思路这里我们层次遍历我们需要使用到队列这个数据结构,我们依次从根节点开始遍历,我们需要使用一个变量来记录此时我们队列中元素的数量,因为这样我们才知道这一层我们需要从队列......
  • 2024 牛客多校 6
    https://ac.nowcoder.com/acm/contest/81601#questionB-Cake2考虑平面图欧拉定理:\(V-E+F=2\)每条线段相交的数量可以由小的那一侧顶点数推出,\(k\ne\frac{n}{2}\)时有\(V=2\min(k-1,n-k-1)\timesn\times\frac{1}{2},E=2\min(k-1,n-k-1)\timesn\)也可以打表C-Cake3......
  • day02-面向对象-多态&抽象类&接口
    一、⭐多态⭐1.1概述1.多态  是在继承/实现情况下的一种现象,表现为对象多态和行为多态​2.⭐对象多态写法:​继承:父类变量=new子类1();​父类变量=new子类2();实现:接口变量=new实现类();​......
  • 第三届电力工程与电气技术国际学术会议(ICPEET 2024) 2024 3rd International Conferenc
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus大会时间:2024年9月13-15日大会地点:马来西亚·吉隆坡最终截稿:2024年9月9日(23:......
  • 2024年图像处理、机器学习与模式识别国际学术会议(IPMLP 2024)2024 International Conf
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus会议时间:2024.9.13-15日会议地点:中国广州最终截稿时间:2024年9月9日23时59分......
  • P9041 [PA2021] Fiolki 2
    简要题意可以去看其他题解。前置知识:LGV引理。看到这道题我们先考虑该怎么判定\(f(l,r)\)是否等于\(x\)。看完题面后很难不让人想到LGV引理(不相交路径,起点集\(S\)和终点集\(T\))。但是LGV引理是用于计数的,放在这里似乎并不好用。但是我们可以注意到,只要没有合法情况,......