实战项目参考:

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")breakif num % 288 ==0:            cv2.imwrite(r'arsvsmcn/%s.jpg'%('pic_'+str(num)),img)  #写出视频图片.jpg格式print("已输出:"+str(num//288)+"帧")if num == 86400:               # 一个小时breaknum=num+1capture.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

【YoLov5实战】记录一次不太成功的实战,足球场人物识别相关推荐

  1. js cookie 存储checkbox_[cookie实战记录-1]种下一个cookie

    [cookie实战记录-1]种下一个cookie 引子 cookie ~ 也是前端实际工作中一定会碰到的(哎?为什么要说也呢...) 而且由于前一阵 Chrome 的更新改了关于 cookie sam ...

  2. 内存很空却频繁gc_记一次不太成功的频繁 full gc 排查过程

    上周自己负责的一个应用出现频繁full gc的问题,不得不尝试优化一下.第一次做这种事只能先看看网上的文章,然后亲自尝试怎么去完成减少full gc的频率,降低young gc的频率这一目标.虽然最终 ...

  3. 实战记录:爬大众点评评论区

    实战记录:爬大众点评评论区 近日,小伙伴的女票要写论文,需要点数据. 借此机会,我也实战了一把.着实有趣. 迭代日志: 2021-01-09: 抓取完一个页面停止 3 秒钟 添加自动切换解密方式 修正 ...

  4. 【C/C++基础进阶系列】实战记录 -- Dump 文件生成与分析

    [C/C++基础进阶系列]实战记录 -- Dump 文件生成与分析 [1]Windows 端 Dump 文件的捕获与分析 [1.1]添加 Windows 端 Dump 捕获的代码 代码下载,windo ...

  5. tensorrt部署YOLOv5模型记录【附代码,支持视频检测】

    训练出来的模型最终都需要进行工业部署,现今部署方案有很多,tensorflow和pytorch官方也都有发布,比如现在pytorch有自己的Libtorch进行部署[可以看我另一篇文章有讲利用Libt ...

  6. 【网络通信 -- SIP 电话】项目实战记录 -- SIP 服务器 OPENSIPS 搭建测试与 SIP 客户端 PJSIP 编译安装测试

    [网络通信 -- SIP 电话]项目实战记录 -- SIP 服务器 OPENSIPS 搭建测试与 SIP 客户端 PJSIP 编译安装测试 [1]SIP 服务器 OPENSIPS 搭建 1.1 安装环 ...

  7. python数据分析与挖掘项目实战记录

    python数据挖掘项目实战记录 取自<Python数据分析与挖掘实战>一书,整理各个项目中用到的数据处理方法: 数据预处理方法 建立模型方法 绘制图形 对于分类问题:用模型分类:混淆矩阵 ...

  8. 微信Hook实战记录2:动手实现恶意dll内存插入器

    Hook任何软件,整体思路都是通过内存调试软件对软件运行时内存进行断点调试,找到想要hook的内存地址,转为可以通过程序主dll可以获得的相对地址,然后再此处插入自己的恶意汇编代码,如果代码比较复杂, ...

  9. (B站云e办)SpringBoot开发项目实战记录(七)(员工管理(分页知识))

    (B站云e办)SpringBoot开发项目实战记录(七) 一.员工管理 1.1 准备工作(分页配置类.日期格式化类) 1. mybatisplus配置类分页 2. 日期格式化类(converter) ...

最新文章

  1. 小技巧: 从开始菜单进行网络搜索
  2. AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)...
  3. python 的filter()函数
  4. elementui中tabs切换item中的内容会变_中后台UX优化之道
  5. Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法...
  6. 服务器上的文件怎么取名,给新的服务器取名你会取神马?
  7. 安卓逆向系列教程(二)APK 和 DEX
  8. 对于数组使用sizeof(a)和使用sizeof(a[0])
  9. 将图片url转换成 BufferedImage
  10. 多账号统一登陆,账号模块的系统设计
  11. (论文加源码)基于自动编码器和LSTM的脑电情感识别(数据集为DEAP)提取了功率谱密度,并进行了无编码和SVM的对比实验。
  12. openssl加密解密
  13. 英语语法总结--特殊词精讲
  14. 利用ArcGIS创建要素与表之间的关系类并发布带有关系数据表的要素服务
  15. TinyXML-2解析XML数据
  16. Java--反编译软件
  17. C4D R19 图文安装教程
  18. 菲律宾苏禄省天主教堂连环爆炸造成20人死81人伤
  19. 前端常用的工具方法,常用js方法
  20. 大数据分析岗位的就业前景

热门文章

  1. 计算机没考好的检讨书300百以上,考试反思检讨书300字(精选10篇)
  2. 2020年4月西安葡萄城挂经
  3. 前沿对话:聚焦元宇宙,数字营销都能玩什么丨温州元宇宙月
  4. 如果你已经这样了,那你必须要跳槽了。
  5. 一字一句教你聊天,快速把女生聊“嗨”起来
  6. 西安80投影坐标系转WGS84地理坐标系如何求七参数
  7. 为改善Siri功能Apple收购语音助理初创公司
  8. 炒股如何办理开户手续
  9. 牛客练习赛51c-勾股定理
  10. 虚拟机服务器关机命令,linux虚拟机怎么关机命令