2023复盘
2023复盘
总结
- 2023年很曲折,经历了很多挫折,有很多不愉快的事情,但是也有一些高光时刻
- 在竞赛和项目中认识了很多老师和行业大牛,我认为这将是非常重要的资源
- 竞赛中小有成就,拿到了四个国奖和若干个省奖
- 第一年搬出宿舍校外住宿,算了算一年的科创奖金差不多可以完全承担一年的房租,还有剩余
- 全国各地到处跑,见识到了大千世界
开发项目
“先有开发,后有安全”
和一起打了将近两年CTF的队友一起组队搞开发,彼此之间配合还算比较好,没有出现推诿扯皮之类的意外情况,这次项目经历也算进一步巩固了我们之间的关系
很荣幸能够认识刘老师,我们在开发过程中遇到的一些解决不了的问题经常会请教他,他总是能够给出一些超出我们知识范围的想法,不会直接教给我们,而是让我们自己想办法去实现,我感觉这很好,很锻炼发现问题、提出问题、分析问题、解决问题的能力
最后的结果还是比较满意的,这些开发项目拿到了中国大学生计算机设计大赛国家级二等奖一项、国家级三等奖一项、省奖若干,中国大学生服务外包创新创业大赛区域赛三等奖、中国机器人及人工智能大赛山东赛区三等奖,这个寒假打算去申请专利和软著
中国大学生服务外包创新创业大赛和中国机器人及人工智能大赛是命题赛,给出项目的所有需求,需要全部实现
中国大学生计算机设计大赛是非命题赛,我们实现了很多天马行空的想法(符合正常业务的天马行空的想法,嘿嘿…)
我们做的最好的项目是一个CV项目,拿到了中国大学生计算机设计大赛国二,具体实现功能如下
具体功能
- 支持边缘防护、明火烟雾检测、围栏翻越检测、挥手/抽烟/跌倒的行为检测、积水及渗漏水检测等校园安全相关场景:
针对不同的校园安全问题,算法端整理与搜寻相应的图片与视频资料,大部分图片与视频为多行为资料。针对这些资料,通过人工标注方法标注数据集,从而使得模型能够通过对不同状况的对比检测准确检测出指定目标。
对于数据集的训练,使用基于BoTNet神经网络的优化yolov5算法进行多轮训练,首先通过对通用数据集进行训练得到上游模型,再通过对监控录像数据集进行下游训练得到最终模型,该方法能够有效提高模型在学校场所的适用性。
- 对于围栏翻越检测、边缘防护等需要设定检测区域的场景支持良好的交互配置方式:
针对围栏翻越检测、边缘防护等需要设定检测区域的检测任务,项目允许用户针对围栏区域与边缘防护区域在对应摄像头的交互界面进行针对性标记,并选择对应的检测模块进行检测,同时支持用户自定义检测置信度。
这样的交互配置方式能够让用户更加方便地对特定区域进行针对性标记,并且根据实际需求选择对应的检测模块,从而提高检测的准确率。此外,支持用户自定义检测置信度也能够让用户更加灵活地控制检测结果的输出,进一步提高检测的可靠性和可用性。
- 在系统中对于所识别的事件在列表中进行展示,需要包含告警事件所产生的区域、时间、内容及所记录的摄像头;点击查看按钮可以查看事件的详细内容,包括视频及图片数据;支持按不同属性筛选事件:
前端的控制台页面通过对视频流进行实时播放,实现了管理人员可以实时检测当前任意摄像头的实时状况,同时在控制台页面也可以实时显示报警的信息,包括报警的图片,报警的位置,报警的类型,写有专门的接口实时的推送公众号进行处理。
- 支持对所识别到的违规事件进行告警,单次告警以事件为单位;支持推送信息至指定人员或公众号;支持优化报警频率:
后端使用gin-web框架通过处理HTTP请求,实现了推送信息至公众号。首先,To_weixin函数接收前端处理的POST请求,调用微信API向微信公众号发送消息。然后,调用Get_token和Get_openid函数通过发送Get请求,请求API来获得访问令牌和关注公众号的用户ID列表。最后,解析前端传来的JSON,并将其解析为Weixin_Results结构,构造消息发送到WeChat组,使用WeChat官方API将消息发送给所有关注公众号的用户。使用此方法,降低了服务器压力,充分地提高了资源利用率,实现了低时延报警推送公众号。
对于项目的报警频率优化,算法端将每次告警以事件为单位,只有当同一事件被多次检测到时才会触发告警。这种方式能够避免由于随机噪声等因素导致的虚警,同时也能够减少同一事件被重复告警的情况。
同时,项目支持根据用户的需要自定义告警频率,用户可以根据实际情况设置告警的时间间隔和告警次数。例如,在某些场景下用户需要及时获得每一个违规事件的告警,可以设置短时间间隔和高频告警;而在一些较为宽松的场景下则可以设置较长的时间间隔和低频告警。
- 支持处置报警事件,未处置的报警高亮提示,已处置的报警可记录处置情况:
控制台页面提供专门的日志菜单栏,可以显示所有已处理的报警的详细信息,报警菜单栏可以对未处理的事件进行显示,提醒管理员处理。
- 系统可接入模拟现场的测试视频流,可以完成测试操作并直观显示业务结果:
后端使用Go语言的Gin框架和GStreamer,通过gst-launch-1.0工具,实现了从接入模拟现场的测试RTSP视频流中提取H.264编码的视频数据,将其解码后,使用flvmux元素封装为FLV格式的视频文件,并将其保存在磁盘内,并将生成的FLV文件作为HTTP响应的内容类型,设置HTTP响应头为“video/x-flv”,将其传输给客户端。通过使用FFmpeg和GStreamer这两个多媒体框架,低资源占用率的条件下实现了视频的解码、编码、转换等操作;在同一个函数中并发地实现了客户选中的8个重点地区的rtsp视频流到flv格式文件的转换,实现了业务的灵活组合配置,可以适应不同项目的需求。
- 支持模型服务的二进制封装和灵活组合,可配置为高并发低时延、高资源利用率等多种模型服务方式适应不同项目需求:
后端接收前端不同类型任务的灵活组合,并将任务需求添加到数据库中。使用goroutine和sync包中的WaitGroup来实现轻量级高并发,实现了模型服务的低时延,充分地提高了资源的利用率。遍历从数据库中检索到的所有摄像头记录,并为每个摄像头创建一个goroutine线程来调用编写的Judge函数进行处理。实现了并发处理多个摄像头的数据,提高了运行的效率。
使用了sync.WaitGroup的Add方法来增加计数器,表示要等待的goroutine数量。每个goroutine在处理完毕后都会调用WaitGroup的Done方法来减少计数器的值,表示已完成一个goroutine的处理。使用WaitGroup的Wait方法可以阻塞程序,直到计数器的值为0,即所有goroutine都已完成处理。
在每个goroutine线程内部,使用了defer语句来确保在函数执行结束后调用WaitGroup的Done方法,以便适当地更新计数器的值。
对于多个线程之间存在的共享内存竞争,使用了读写锁、互斥锁等来对多线程的共享数据来进行限制,实现了数据的一致性。
- 支持模型服务的二进制封装和灵活组合配置,适应不同项目需求,方便模型更新及功能扩展需求:
使用Docker这一支持二进制封装和灵活配置的框架,可以将封装好的模型镜像文件部署在不同的环境中,通过将模型封装为镜像文件并进行灵活组合配置,实现了可以方便地进行模型更新和功能拓展需求,具有更好的可移植性和拓展性。
使用Kubernetes进行模型服务的管理和部署,其提供的可拓展容器编排平台,实现了自动化部署、拓展和管理容器应用,实现了均衡负载的功能。
- 支持训练过程自动化、规范化,实现对不同模型的数据处理、模型训练、评测、量化等不同功能进行灵活组合和保存,支持快速且仅进行必要计算的重复训练,以支撑更多部署场景(如增加新的学校需补充新数据进行训练等):
对于训练过程的自动化、规范化,项目的模型训练算法已经与数据预处理功能进行结合,并使用 BoTNet网络架构优化 YOLOv5 算法。BoTNet网络架构基于 MobileNetv3 和 efficientNet 的结构设计,可以在保持优异性能的同时,大幅减少模型的计算量和内存占用,使得模型训练的精度与速度相较于原本单一的yolov5算法进一步提升。同时,得益于yolov5算法的便捷性,用户只需传入标记好的数据集,并指定阈值进行训练,而无需进行多余操作,实现了训练过程的自动化、规范化,同时也使得项目支持用户进行快速且进行必要计算的重复训练,使得项目能够支撑更多的部署场景,允许用户补充数据进行统一训练。
其次,对于不同模型的数据处理、训练、评测、量化等功能,go语言后端采取并行执行策略,允许多路模型同时运行,实现了针对不同模型进行单独的数据处理、训练、评测与量化。对于每路模型的评测与量化方面,项目对每路模型都采用了统一的评测与量化标准,通过使用交叉验证方法以及计算模型的精度、召回率与F1-score,进行综合性的评测与分析,从而保证模型的效果。
- 支持完善的监控和日志,便于观测系统的性能和资源使用:
后端保存了每一条算法端实时返回的检测数据,低延时地添加到数据库中,作为返回给前端的日志内容。将检测数据添加到数据库使用原生SQL语句,使项目具有更高的灵活性、更好的可控性和更好的可移植性,可以更方便地移植到其它的数据库系统中,更简单地控制查询的执行计划和优化,确保了SQL语句的执行效率和性能,实现了检测数据实时地插入日志。
后端使用了Go语言的Gin框架和runtime包,实现了快速、高性能的CPU监测功能与获取当前程序的内存使用情况功能,将其以JSON格式返回给客户端。通过runtime包中的函数获取当前的CPU核心数与对内存使用情况的监测,并使用time包中的函数计算CPU使用情况。然后代码将结果封装成CPUUsage与MemUsage结构体,将其转换为JSON格式返回给前端。这对于检测系统的性能和资源使用非常重要,充分地体现了使用Go语言原生的内存管理机制的优势,可以帮助开发人员有效地避免常见的内存错误,便于观测系统的性能和资源使用情况。
- 系统具有良好的性能、功耗表现和可扩展性和成本优势,可支撑区县级数量规模的学校的接入:
首先,系统具备完整的性能测试方案和监控策略,能够针对系统的性能指标进行分析判断,用Golang编写性能测试程序,通过模拟大量并发调用算法端脚本,测试并对系统进行调优。其次,系统资源占用率低,在同样的硬件条件下功耗低的优点,降低了系统搭建成本,具有成本优势。最后,系统具有可拓展性的后端架构,支持垂直拓展和水平拓展,能够支持县级数量规模的业务。
- 通过人工智能支持对人员探出围栏的状态进行识别:
围栏防护区域定义为,有围栏且围栏区域超过人员腰部区域;
以人员身体腹部为准,腹部超出围栏内侧视为探出,并进行告警;
计算探出以围栏外侧边为准线,超出围栏内侧边即视为探出
针对人员探出围栏的状态,项目通过对应数据集的训练,使得算法端能够大致检测到人员探出围栏这一行为,同时也能够获取围栏大致范围与人员状态信息,从而进行对比,进而辅助判断。
具体而言,当算法端检测到有人员出现在围栏内部时,可以通过对围栏的边界进行检测并确定围栏的位置和大小,进而给出该人员距离围栏的距离和方向信息。在算法判断人员是否探出围栏时,可以通过将围栏范围与人员位置信息进行对比,进一步确定人员是否已经探出围栏。同时,还可以通过对人员状态信息的分析和比对,判断人员是否有异常行为或异常状态,进一步加强围栏安全管理。
通过人工智能提供对于人员待在危险区域时间过长进行识别
边缘防护区域指定为无围栏或围栏高度不超过成年人腰部的区域
对于边缘防护区域以人员出现在该区域时间进行告警
人员停留x秒后产生告警,x的具体值可配置。
对于危险区域或其它限制区域,算法端提供了对于该区域的人员检测功能,用户可以在该区域摄像头对应的交互项中选择对应的模型并设置指定阈值,当该区域出现人时,,该功能将会自动检测并统计该人员在该区域内的停留时间长度,进一步提供对于人员待在危险区域时间过长进行识别和预警的服务。
该功能的实现需要使用人工智能技术中的目标检测和计时统计等算法。通过对该区域中的摄像头拍摄到的画面进行分析,可以识别出人员在该区域的位置和活动。同时,通过对检测到的人员在该区域内的停留时间进行计时,可以判断人员待在该区域的时间是否超过了规定的阈值。
在实际应用中,用户可以根据自己的需求选择不同的模型和阈值进行设置,并且可以通过系统提供的管理界面直观地查看该区域内人员的活动情况以及超时预警信息。这样,用户可以及时采取相应的措施,保证区域内人员的安全。
- 通过人工智能提供对挥手、抽烟、跌倒行为进行识别:
对人员挥手、抽烟、跌倒等行为进行识别;
可以应用于人员密集区域,在人员密集区域保持识别效率。
对于挥手、抽烟、跌倒行为,项目通过多种渠道获取不同场景、环境、角度、状态以及部分特殊状态的挥手、抽烟、跌倒行为图片,并采取人工标注方式标注数据集。在标注过程中,针对某一指定行为图片,进行多行为标记,从而保证目标对象的准确性。
除此以外,在模型训练中,项目使用了多轮训练技术,这也是提高模型准确率的一个重要步骤。通过标注后的一般图片进行训练获取上游模型,再针对于学校中监控视角图片进行下游训练,从而提高模型的适用性。这样可以进一步提高模型的准确性,并使其更好地适应不同的场景和环境。
- 通过人工智能提供对路面积水、墙面房顶渗漏水进行识别:
可识别雨天路面积水情况,对于严重积水进行告警;
可识别机房等房屋墙壁上的渗水情况并进行告警。
对于路面积水、墙面房顶渗漏水的识别,项目以yolov5算法为基础,对拍摄到的路面、墙面等部位的图像进行分析和处理。通过对图片中的色彩、纹理、形状等特征进行提取和分析,从而能够准确判断积水与房顶渗漏水存在情况。
同时,为了提高识别的准确性,算法端预留了与传感器结合的方法。允许用户接入传感器,获取对应区域的温度、湿度等信息,从而辅助目标检测算法进行对应状况的检测。
- 基于K8s和微服务架构,提供良好的容器封装和高性能的接口调用,支持在K8s集群完成部署:
本系统采用微服务的架构分别将前端,后端,视频流转换,数据库部署到k8s集群,其中前端提供了友好的人机交互界面,通过算法优化减轻了对后端的数据访问频率,前端封装完善,只需要提供数据库后端ip与视频流转换ip即可实现部署,后端采用GO语言可以实现高并发的调用模型进行检测与处理,后端同样封装完善,只需要提供数据库的ip与端口即可,视频流转换,采用node.js通过异步编程,实现对rtsp流转换的高并发处理,与实时响应。数据库采用mysql数据库,通过将数据库单独部署的方式保证了数据库的稳定性,同时也提供容器卷挂载到本地的方式,通过nfs实现数据的互联互通。
项目分工
- 王子负责算法端,毕师傅负责前端,我负责后端(当然还有安全,SQL注入、反序列化之类的漏洞我都考虑到了,毕竟做了很长时间的Web安全)
我的工作
用Golang开发后端,Gin框架,管理员和普通用户的增删改查、权限分配都做得比较完善,对接算法端和前端
SQL原生语句和Gorm同时使用操作数据库
使用MySQL搭建数据库,同时需要对存取不是很频繁但是需要频繁分析的数据,我存到了hive中,数据库中存了管理员和普通用户的信息、视频流相关信息、分析结果等等,可以提供很完善的日志
搭建基于MQTT的EMQX服务器,实现了前后端之间的实时数据传输(项目的第一版,毕师傅发现前端请求后端分析出的数据延迟很高,肉眼可见的那种高,我们就讨论了很多种方案,最后刘老师提议搭MQTT服务器,只是提出来了想法,我就硬着头皮做,真实现了,嘻嘻…)
分布式计算:Hadoop建了很多slave节点同时分析视频流,实现了完全分布式(我们三个一个人手里都有一两台轻量级云服务器)
视频流服务器:用Darwin搭了个推流和接收视频流的服务器,可以直接对接实体摄像头
转码服务器:因为算法端需要flv流,我就搭了个ffmpeg转码服务器,把实体摄像头的rtsp流转成了flv流
部分补充
- 为什么使用Golang作为后端语言:首先,我考虑到了项目需要多路视频同时分析的多线程高并发的需求,Go语言通过并发编程和轻量级的协程(goroutine)机制,提供了高效的并发处理能力。它内置了并发原语(如通道和互斥锁),简化了并发编程的复杂性,使该项目支持高性能的轻量级并发
- 为什么没用Java或者python,第一,该项目后端只有我一个人,Java的开发代码冗余量太大,不方便实现多线程高并发,但是我是Java转Go,Spring全家桶我也学得比较通,如果项目组人多,Java也未尝不可;第二,python真的很慢,很慢很慢,不能实现项目的实时性
获奖证书
安全——CTF
闲聊
大一进CTF实验室,到2023年才开始拿奖,沉淀了很长时间,ctfshow、bugku、攻防世界都有我刷题的记录
很荣幸能进CTF实验室,能够认识队友毕师傅和王子,能够认识佳琪哥等等大佬,有大佬带着打比赛
打线下赛认识很多朋友,有电子科大的两位网安学院的师哥,有曲阜校区的兄弟们,还有很多校外的大佬等等
打线下赛到处旅游,这一年先后去了合肥、哈尔滨、济南、北京
-
全国大学生信息安全与对抗技术竞赛
- 国家一等奖,学校科创奖励15个科创分,大概7000块钱,很nice,小半年房租
ciscn
- ciscn是第一次能够接触的线下赛,大一下止步线上初赛,大二终于可以去线下打(旅游)了
- 第一次打AWDP赛制,整个队只有我一个人做出来题了。。。
- 在合肥工业大学举办,去合肥转了转,看到了江苏卫视的大楼和国防科大的电子对抗学院(往前推两年是在这举办的)
- 前一天晚上熬夜打了场awd——bugku,之前准备的通防fix都会被查,mmp
- 能见到保研到中海洋的超哥,DebuGGer战队的创始人之一,我记得之前在实验室坐在我右边的右边,可以算是同窗一年,嘻嘻…
蓝帽杯
- 最开始打蓝帽杯是2022年,当时线上初赛就止步了,比较遗憾,当时真的是处处碰壁,不只是蓝帽杯,强网杯、网鼎杯之类的都没有晋级
- 今年是一路杀到总决赛,拿到国家三等奖
- 好像所有的CTF比赛都没区分本科生和研究生,遇到了曲阜校区CTF实验室创始人王师哥,目前已经是电子科大博士,能够同台竞技很荣幸,压力也很大
半决赛——成功晋级
赛场看起来比较豪华
半决赛是在哈工大举行的,有幸逛了逛有核弹发射能力的高校
坐灰机去的,美丽的日落
作为一个山东人,来一次哈尔滨真的很不容易,就去和平大街之类的景点逛了逛
-
总决赛——三等奖
- 所有人的合照
- 队伍介绍
- 赛场大屏很帅,刘老师很happy,站C位
- 我们拿到了三等奖
- 佳琪哥他们拿到了二等奖
- 发了个壳子又收上去了,因为需要部里盖章,时间比较长,到现在还没发下来证书
- 组委会还给发了伴手礼,开出来奇安信的小老虎,后来去奇安信总部参观要88块钱一个
- 鄙人帅照
- 比完赛能去组委会奇安信总部逛逛,组委会大静姐给大家照了张合影
- 顺便去看了场升旗,真的是一夜没睡啊,半夜去排队,还排错了,预约的西直门,去的东直门,不过好像预约就能进,不区分通道
- 去了趟天坛,走的时候和队友说有一种似曾相识的感觉,因为德州和北京离得很近,来过很多次了
山东省省赛——科来杯
- 拿到了团队三等奖和队伍里唯一一个个人奖——个人三等奖
- 实战题分数比很多个人二等奖都高,但是理论题没答好,比赛前准备的题库不行,否则也是二等奖,奖金直接从2k缩水到500
- 不过第一次线下赛个人收获三血,感觉自己起飞了
- 因为比赛是在山警举办,来找张sir(不能再叫der哥了),张sir演出闭幕式,穿警服的样子很帅捏
- 比赛场地
- 组委会有钱,水和饭票之类的都是定制的
山东省科技节——网安赛道
- 省级二等奖,这应该是我CTF生涯中的第一个奖
- 比赛中的golang语言的iris框架的ssrf漏洞现在还记忆清晰,很新颖,但是还是做出来了
省政府奖学金
- 学院里把我推上去竞争省政府奖学金
- 一共推了三个人,20级佳琪哥(20级,DebuGGer战队大哥)、许师哥(21级,ACM大哥),还有菜菜的我
- 最后答辩的时候太紧张了,三分钟的答辩中间好像楞了得半分钟,什么都没说出来,答辩分数很低,遗憾错失省政府奖学金,6k,还浪费了学院3个名额中的一个
- 人生中第一次穿西服,还是借的
- 导员最后找我谈话,也因为错失省政府奖学金、浪费学院一个名额不太高兴,让我明年竞争国家奖学金别再出这种岔子
表彰大会
- 学院里开了个表彰大会,又借了一次西服,感觉穿起来很帅
攻防演练
- 第一次打攻防演练的红队,最开始真的很坐牢,不过有大佬带,最后的结果还是很好的
- 队友比我小一岁,19岁,高中毕业直接全职某中厂,技术很好,全场最高分,比很多机关单位派出的代表队都高