口罩、安全帽识别比赛踩坑记(一) 经验漫谈及随想

2022-08-31 09:19:09 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

前言

因为疫情迎来的史无前例大假期,从开始理直气壮的天天划手机,到中间百无聊赖的躺尸,再到之后实在憋得慌,就想找点什么事搞一搞。恰好这时,一直关注的极视角联合 Intel 公司举办了一个对口罩和安全帽进行识别的比赛,能免费用一个月的云服务器对于我这还在用跑个 Demo 都能卡死的老爷机来说还是相当具有吸引力的。于是乎,从3月3日到4月3日这一个月的时间,我几乎足不出户,每天的任务就是把前一天留下的坑想办法填平。

从熟悉云服务器在线运行代码的流程,熟悉 VSCode 编译环境的架构;到将不可见的数据进行预处理;再到前前后后搭建的 YOLOV3-Tensorflow 版、YOLOV3-Darknet 版和 SSD-Inception2 版算法模型;以及中间的权重转换、IR 转换,包括最后锁死的纯 C 的 ev_sdk 封装。

经历了一个又一个莫名其妙的 Bug,在坚持与放弃的边缘来回徘徊最终又坚定下来继续前行。这过程中熟悉掌握了一些以前没有用过的 Linux 操作和 shell 指令的应用,解决问题和 Bug 的能力又上了一个台阶,领悟了很多能形成比赛或者项目 pipelines 的方法,也认清了自己 C 语言上一无所知的不足。

感觉这次的比赛没有白参加,以前看论文、复现代码,跟着人家的指导囫囵吞枣地跑一遍数据,看两眼结果,就以为自己学会了,眼高于顶。这次终于是打回原形,让我脚踏实地跌跌撞撞一点点去实现一个要落地的项目,才发现哪哪都是问题。会发现真正去做的时候永远比之前看到和想到的要难,而且难很多。

最终,安全帽比赛第9名,口罩识别比赛第14名,召回率和精确度都低得羞于见人。成绩差强人意,但经过这段时间的打磨,也算是明白了结果其实没那么重要,只要过程中有收获,付出就显得有意义啊。就像人活这一遭就是在享受过程,大家的结果都是个三尺小盒,中间的经历却大相径庭。所以只要尽力而为,没有太遗憾,就是一种成功 ~

—————————————————————————————————————————————– 这里贴出排名照 ~ 以此劝退大神们的围观,这里只是一只小白在记录他成长的点滴… —————————————————————————————————————————————–

比赛步骤

这个比赛为期一个月,时间还是很充裕的,从这次比赛中我总结了一下做类似这种项目和比赛的流程,大致分为以下几个步骤:

  1. 赛前准备 1.1 搭建和熟悉编译环境 1.2 明确该项目的 pipeline,确定任务量和工期安排
  2. 比赛经过 2.1 训练部分 2.1.1 查看数据集并根据模型要求进行预处理(data_pro) 2.1.2 熟悉并掌握使用模型的主要代码(train/model/…) 2.1.3 完善周边代码,不限于requirements.txt / shell命令 / 镜像命令Dockerfile / 曲线输出save_plots / 权重转换export_models / … 2.2 测试部分 2.2.1 训练完成后进行初步测试,主要检查有无异常 2.2.2 根据得到权重文件封装SDK,并自测封装是否完成 2.2.3 进行外部测试,并根据结果和要求不断调参,改进代码
  3. 结论分析 提交结果,对存在问题进行分析总结,改进模型

更具体的步骤和模型的实现见 口罩、安全帽识别比赛踩坑记(二)

经验总结

在做项目中,遇到了许多问题,有技术层面的,有水平不足以支持实际实现的,有“莫名其妙”的,也有一些规划和经验不足的。这里记录一些需要保持的好习惯:

  1. 在做一个项目时最好全程都使用文档(.txt/.doc)做过程笔记,包括冒出来的思路想法,碰到的 Bug,实验的数据、可以改进的地方,重要地方采用不同颜色标记。如这般:
  1. 发现每一个模型所要求的输入数据的格式虽然有所区别,但区别不大,并且很多操作,譬如将给 labelimg 标注好的数据添加 voc 格式的 .txt 等等,都是通用的,所以借着这次比赛,将这部分的代码做一个整理和总结,后续将放在我的 github 里,以供参考。放一个这次比赛处理数据的 print。 这里先留一个小尾巴~~ 等整理好再来放github的链接 ~~
  1. 如果整个项目中需要有多个程序按照顺序运行,比如先运行处理数据集的程序,再运行按照聚类生成锚点的程序,再运行训练的程序,最后运行转换权重和生成曲线图的程序;或者是还需要在 terminal中写部分指令,比较繁琐的状况时,可以直接写一个shell命令,即踩坑记(二)中会详细说明的 start_train.sh 文件。这样在最后提交或者需要书写命令时,一个bash就全解决了。
  2. 在最后炼丹(调参)时,一定要按照对照实验法,即在其他一样的条件下仅仅变动一个部分去看效果,这样才能看出是哪个值的调整会使 loss 值更低,或者分数更高。当然,你硬要说魔改大法好,我也无话可说…嗯,这次比赛中我这部分基本没怎么做好,仅仅是用 K-means聚类修改了锚点值,会发现确实提高了一点分数,然后根据 loss 曲线修改了训练次数、衰减学习率、SSD的锚点框大小范围、长宽比和锚点个数,确实是有一些效果的,当然,这个过程最好用 Excel 记录一下,我这个记录的就很粗糙,部分如下…
  1. 同样是炼丹环节,一定要学会利用各种曲线图,包括但不限于 loss 值下降曲线图、PR曲线图等等,这个和上面的对照实验结合来用效果更佳。
  2. 及时总结!!这一点很重要,就比如我比赛完,想着终于能放松一下,然后三天过后再来看,原来比赛的网站封了,一些改的代码,还有相关的技术文档全都没了…心态有点点崩~~ 并且因为之前的过程笔记做的不到位,当时碰到的一些问题的解决方法现在好多也遗忘了,没有及时记录,哇,有些恶心的错误我花了一两天才解决的,比如我就记得 shell 命令里,你在 Windows 系统中的 .sh 文件里写完,复制到 Linux 下就不好使了,原因是两个系统中的换行符不一样。等等这些实操中才能遇见的狗血事情…
  3. 一些技术上的经验我都放在踩坑记(二)的实操中记录了,还有比如新学到的一些 Linux 中的操作指令,vim的操作等等我都放在相应的博客里了~

随想

这次的比赛进行完,也到了该准备毕设小论文、准备工作刷面经和力扣的时候了,回想自己这一年半来的研究生生活,前半年懵懵懂懂献给了那些课程,所幸成绩也挤进了前30%,后面一年里都献给了CV,打了3个检测相关的比赛,两个是主力,一个是辅助,虽然都没拿上很好的名次,但也算从中有些收获;做了两个项目,一个项目从头至尾跟了下来,对传统的目标检测和界面开发也有了些自己的拙见和了解,另一个因为甲方叫停,导致项目流产,有些可惜。 本想这学期去大厂或者研究所实习一下,长长见识,奈何学校偏远,需要去外地,又赶上疫情,再加上毕设中期安排在尴尬的五月底,文章也没得着落,就没了这股心劲儿。遂决定4月到8月还是沉潜一下,刷刷论文写写文章、刷刷程序员宝典做做题。 其实这次比赛暴露了我一个很大的问题,不是计算机专业的,没有学过数据结构,也没学过C ,导致了最后改的SDK根本和自己的模型匹配不上,还一点没有思路,直接死在了这里。也发现了光会一些python,其实是不够的,一个是也不精通,仅仅是会看、会改、能自己写点比较简单的;另一个也是发现在实际项目中,大多数都还是要求以C 为开发语言。所以这几个月里,我不仅要刷python,还要把重心转移到 C 上。 综上述,未来的这秋招之前的4个月里,巩固之前学的知识/刷论文写文章/刷语言的题和自学数据结构这三个事情应当是我的重点。 加油,未来 ~ ~

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144470.html原文链接:https://javaforall.cn

0 人点赞