IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【YoLov5实战】记录一次不太成功的实战,足球场人物识别 -> 正文阅读

[人工智能]【YoLov5实战】记录一次不太成功的实战,足球场人物识别

实战项目参考:

yolov5实战

我是从打标签开始,一步一步的做的。

起因是想自己做点什么,而且觉得要从打标签这种比较“无聊乏味”的工作开始,对yolov5的整个流程好有个完整的认识。

想法来源:

之前看过一则新闻,AI摄像误认裁判光头为足球
想一想觉得很有趣,如果识别技术不是单纯的追踪足球,而是改为类似“综合考虑球员密度和足球位置”这样的设计会不会更好?
譬如:球场22个人,确定在一个确定的摄像机画面大小范围内,把摄像机角度调整为足球位置和球员数量都最佳的位置。这样就把问题变成了一个足球位置和球员密度的双目标优化问题,不单单考虑足球的位置,还要考虑足球和球员聚类中心的位置。根据二者的位置来实现镜头调度。

我的想法大概是这样一个流程:
1. 用YOLO做一个识别算法能够随时标记出画面内球员位置和足球位置
2. 设计一种算法,计算球员聚类中心(这个不能是简单的中心,因为持球队员、空挡位置接应点球员、防守球员、暂时无关球员等等,他们之间的权重肯定是不同的)
3. 设计一种调度算法,根据球员聚类中心、足球位置、二者运动方向来同时确定摄像机调度
4. 在现实世界进行一个物理测试

具体要怎么处理这个复杂问题,首先要设计一阵规则,怎样衡量足球位置和球员密度的重要程度,设计怎样的函数来表示球员密度、表示所谓的“足球位置最佳”?如果运动到了边路镜头该怎么变化?如果有快速的传切配合,足球位置快速的变化,怎样保证镜头不会剧烈晃动?门将开大脚,足球位置和球员位置中心距离巨大这种情况又该怎么考虑?具体的处理这个问题实在是太复杂了。我一个人很难搞定,而且也没有时间、也没有摄像机以及球场上的两只球队来配合我我测试(= =、)。但是我还是可以把这个设想的第一步搞一搞——用yolo5对画面分析,分析当前镜头的球员数量和足球位置。

于是目标也就计划好了。

项目目标:

总之就是最后得到给一段俯视球场镜头,识别技术能标出镜头内球员位置和足球位置。这就是我能做到的事情。后续的,以后再说吧。
这就是我要实现的样子做出这种样子,就是要实现的目标(虽然这幅图片上并没有足球(被人挡住了))

项目实现:

STEP1 获取数据集图片

作为一名阿森纳球迷,我选择了20-21赛季阿森纳的一场比赛。阿森纳vs曼城

首先下载视频。
然后每隔12秒取一帧图片,这里我一开始取的是前一个小时的,但是实际上最后并没有用这么多

import cv2
capture=cv2.VideoCapture(r'F:/素材资源/足球比赛/【英语解说】20-21赛季英超第25轮|阿森纳VS曼城 全场录像 - 1.21.02.2021(Av416851693,P1).mp4')  #视频名称
print(capture.isOpened())
num=0

# 总共输出一个小时  24*60*60 = 86400   
# 每4秒钟输出一帧 24 * 12 = 288
# 86400 / 288 = 300 能够得到300张数据集
while True: 
    ret,img=capture.read()  
    if not ret:
        print("path 1")
        break
  
    if num % 288 ==0:            
        cv2.imwrite(r'arsvsmcn/%s.jpg'%('pic_'+str(num)),img)  #写出视频图片.jpg格式
        print("已输出:"+str(num//288)+"帧")
    
    if num == 86400:               # 一个小时
        break
    num=num+1
    
capture.release()
  • 效果
    在这里插入图片描述
    一共300张图片,之后要人工筛选,把近景的全部删掉,因为我们本身就是对主摄像图像画面来做工作的,近景的都没必要继续留下。
    还剩下213张。
    在这里插入图片描述

再继续,就是打标签了。

STEP2 打标签

参考:利用labelimg打标签
计划:把这213张图片全部打完标签。
实际情况:这个部分真的好痛苦,差不多平均每张图片有10名左右的球员,以及时有时无的足球。一共213张图片,我打了107张(正好一半),大概总共打了1000多个标签,实在是不想再打了,断断续续用了大概4到5个小时左右吧?当时的心态是就打算先试验性的进行下一步骤了,如果效果还可以就这样,不行的话在接着打。
当然也在这里我犯了个可以说是系统性错误的问题,暂时按下不表。
在这里插入图片描述

最终效果
在这里插入图片描述
最后把xml格式转为yolo格式即可(这个地方是参考了一个博客做的,但是具体链接没有保存)
在这里插入图片描述

STEP3 对yolo5项目调参

接下来就是调参了,首先去gitHub下载yolov5
导入pycharm

  • 选yolov5s.pt作为预训练权重
  • data文件夹下确定数据yaml文件
  • models文件夹下确定模型yaml文件
# data文件要修改的参数(此行不要出现)
# number of classes
nc: 2

# class names
names: [ 'person','football' ]
# models
# parameters
nc: 2  # number of classes
  • 编码有关注意: yaml文件不支持UTF-8 因此不能输入任何中文注释

STEP4 训练

  • train.py修改的参数(main部分)
   parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default='weights/yolov5s.pt', help='initial weights path')
    parser.add_argument('--cfg', type=str, default='models/nowusing.yaml', help='model.yaml path')
    parser.add_argument('--data', type=str, default='data/nowusing.yaml', help='data.yaml path')
    parser.add_argument('--hyp', type=str, default='data/hyp.scratch.yaml', help='hyperparameters path')
    parser.add_argument('--epochs', type=int, default=100)
    parser.add_argument('--batch-size', type=int, default=8, help='total batch size for all GPUs')      # CUDA out of memory.

因为我的笔记本只有好几年前的1050Ti,所以batch-size没敢调太大,只设置了8个batch。其他的参数基本也没什么可说的

  • 训练过程出现的bug
问题1

ValueError: Media Bounding Box Debugger/Images is invalid.Please remove invalid …

这个问题是wandb导致的,这里我一开始选择正经的注册了wandb账号,然后开辟了项目,但是还是报错,而且是很没有什么头绪的Warning和Error,后来感觉我压根就不需要这个辅助功能,干脆选择吧这个部分给Ban了得了。就选用了本文的解决办法
在utils/wandb_logging/wandb_utils.py中一开始的try/except模块后加入

wandb = None        # add this

把这个BAN了,这样就好了。

问题2

AttributeError: Cant get attribute SPPF on module models.common

这个问题的解决方法
但我并没有搞明白为什么会出现这种情况。

  • 之后就能正常运行了
正式试验

第一次试了30个epoch,速度还是挺快的,可能数据集确实不是很多,所以很快就结束了,得到了结果。之后又进行了第二次试验,跑了100个epoch,跑了20分钟

第一次30个epoch
在这里插入图片描述
第二次100个epoch
在这里插入图片描述
最后tensorboard的结果
在这里插入图片描述
之后又看了一下loss,没有我想象的那么差,所以在“纸面上”还是挺能打的,具体看效果就需要用其他的数据来检验一下了。

STEP5 测试检验

首先是用原视频来检验一下,因为我选取的是前60分钟的(虽然并没有都用完),我直接用了后面的视频来进行检验。

  • 这里一开始还出现了一个小bug,就是标签太大了,具体差不多是按照[这里的办法来修改的](https://blog.csdn.net/ghostype/artic在这里插入图片描述
    le/details/122113895)

效果图展示
在这里插入图片描述
在这里插入图片描述
比我想象的要好,因为人都识别的比较准确,除了说第二张图片在人比较密集的时候,他会出现识别的人变多了之类的情况之外其他都还好。

然后我继续用其他的录像来进行测试检验
布雷顿0-2埃弗顿的一场比赛
在这里插入图片描述
切尔西vs利物浦的一场比赛
在这里插入图片描述
这场比赛阳光很足,球场分为了阴阳两面,在这种情况还能识别出来,说明鲁棒性是比较强的。我本以为能适应好原来训练用的那场比赛就可以了,没想到其他的比赛也基本上可以,这还真的让我有点开心。

不过看着看着我就发现了一个很严重的问题——为什么只有person标记,没有football标记??

存在问题

几乎所有的视频,几乎每一帧,都只显示了person标记,而没有显示过football标记。
发现这个问题的时候我是有点懵逼的,后来仔细一想就想清楚了,因为我每一张图片都是少则5个多则20多个person标记,但是football标记只有1个,如果被球员挡住了甚至连一个都没有,football标记的数量太少了,而且足球所占的像素本身就很少,在切出来的训练集里还有很多是击球一瞬间的虚影状态,被争抢状态的混战状态,这些情况导致了足球标记无法出现,也可以说是有其必然性的。这可以说是系统性问题了,一开始设计数据集就出现了纰漏,所以可以说,我值完成了一半的目标(识别人),而另一半的目标(识别球)没有完成。
在这里插入图片描述
这里看得我实在有点…

改进目标与展望

一点小感想

虽然总的来说这次并不是很成功,不过总的来说也不算太差,对自己来说是一次完整的yolo实战(从自己搞数据集开始,到训练、验证、测试一套流程走下来),很有意思,也很让我感觉快乐(跑出结果那一瞬间真的有种小时候格斗游戏打掉boss时候的那种快乐感)。所以还是比较满意的。

改进的可能

既然问题是打的标签不平衡,person太多football太少,解决办法便是把图片切开,每张图片保证一个人、一个足球,大概这样的程度。不过这样的话不仅仅是我要从打标签开始从头再来,我还需要把现有的图片筛选分割切片,选出持球人和足球了。这个工作量想一想就有点太头皮发麻了,刚刚经历了5个小时打标签的我短时间内实在是不想在经历一次了。而且我还有其他的事情,所以这个就先按下暂且不表了。

展望

2021年一整年的经历之后我明白了目前自己更想做的是那些“有意义的事情”,不想把浪费时间在一些很虚的东西上,类似辩经啊、自己骗自己的做一些所谓的努力之类的,所以打算做点“正事”,学点自己想干的,不管是对自己也好还是对谁,起码是要有收获,真的留下点什么,不想学了点皮毛就去装模作样的搞的自己很高深的样子,希望能从细枝末节的事情出发。一点一点的做东西吧,之后还会在计算机视觉这方面努力。
然后就是等目前手上的事情结束了去啃yolo的源码,CNN的基本数学原理已经搞明白了,batch-size之类的参数的作用也基本都懂,但总的来说在代码层面目前还是个调包侠,慢慢把这些落到实处吧。

打完标签的数据集

链接:https://pan.baidu.com/s/1_VMK5845PJJPi6sRg8dVUw
提取码:rcpx

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:00:00  更:2022-01-08 14:02:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 22:34:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码