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

口罩、安全帽识别比赛踩坑记(一) 经验漫谈及随想前言       因为疫情迎来的史无前例大假期,从开始理直气壮的天天划手机,到中间百无聊赖的躺尸,再到之后实在憋得慌,就想找点什么事搞一搞。恰好这时,一直关注的极视角联合Intel公司举办了一个对口罩和安全帽进行识别的比赛,能免费用一个月的云服务器对于我这还在用跑个Demo都能卡死的老爷机来说还是相当具有吸引力的。于是…

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

前言

       因为疫情迎来的史无前例大假期,从开始理直气壮的天天划手机,到中间百无聊赖的躺尸,再到之后实在憋得慌,就想找点什么事搞一搞。恰好这时,一直关注的极视角联合 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个月里,巩固之前学的知识/刷论文写文章/刷语言的题和自学数据结构这三个事情应当是我的重点。
       加油,未来 ~ ~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 关于 sso 博客大巴的神仙的一点思路

    关于 sso 博客大巴的神仙的一点思路
    聊天中的一些片段。。。可以记录参考下
     
    1每个应用独立维护自己的session
     
    2用户中心是一个特殊的应用,负责用户登录验证某个需要登录的应用发现没有登录状态就跳到用户中心用户中心判断有没在自己这里登录过,登录过就返回用户信息,没登陆过就先登录,然后记自己的session别的应用收到以后根据用户信息记自己的session之后只要自己的session还在,就不关用户中心的事了

  • NTP协议介绍

    NTP协议介绍查看原作者:转载自:NTP协议介绍(2013-06-1914:50:50)转载▼SNTP协议原理SNTP是简单网络时间协议(SimpleNetworkTimeprotocol)的简称,它是目前Internet网上实现时间同步的一种重要工程化方法。本文对SNTP协议的工作原理、工作模式、时间戳格式、信息帧格式进行了研究,最后对SNTP协议的应用提出一些有益的建议。关键词:SNTP;时间同步;时间戳格式;报文格式TitleAnalysisforSNTPprotocolAbstrac

    2022年10月12日
  • HTML和CSS面试题及答案总结一

    HTML和CSS面试题及答案总结一对于html的语义化标签的理解,结构化标签的理解,同时写出简洁的html结构,如何进行SEO优化?答:对于html的语义化标签,用正确的标签做正确的事情。html语义化,让页面的内容结构化,便于对浏览器和搜索引擎的解析,在没有css样式的情况下,以文档的形式同样易于阅读,符合文档语义的标签。标签本身所代表的语义,每一个标签所带有的语义,根据语义去使用标签,依赖标记确定权重,同时也可以提高SE…

  • 开源协议解读

    开源在今天的软件业已经很普遍,但开源是否意味着使用者可以对开源后的代码为所欲为呢?答案是否定的。开源运动同样有自己的游戏规则和道德准则。不遵行这些规则不但损害开源运动的健康发展,也会对违规者造成名誉和

    2021年12月22日
  • 从零开始部署CloudSim4.0云计算仿真平台「建议收藏」

    从零开始部署CloudSim4.0云计算仿真平台「建议收藏」从零开始部署云计算仿真平台软件CloudSim4.0

  • 银行家算法程序c语言,银行家算法代码c语言编写.doc

    银行家算法程序c语言,银行家算法代码c语言编写.doc#defineM100#includeintmax[M][M],allocation[M][M],need[M][M],available[M];inti,j,n,m,r;voidtestout()//算法安全性的检测{intk,flag,v=0;intwork[M],a[M];charfinish[M];r=1;for(i…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号