最基本的框架结构
生产者–消费者模式:在自动瞄准中,我们通常会将视频流的读取和处理分开,一个线程只读,一个线程处理。
- 问:为什么不先读取后处理呢?这样做会非常容易理解,也很好编写程序。
- 答:在RoboMaster机器人大赛中,速度是我们追求的一个非常重要的指标,如果我们的(帧率)非常低,那么在调试时很明显的发现机器人的枪口是卡顿式跟随目标。这样在赛场上会非常影响操作手体验,也非常影响对运动目标击打的命中率。因此,我们通常会将识别和处理分开进行(当然,我们第一次读取图像肯定是顺序的,但是当我们在处理第一张图像时候,完全可以把这些时间同时读取第二张图像,就好比你在做饭的时候,煮饭期间你可以拿出手机打一会儿王者荣耀)。这样我们就能将整体时间大大缩短(指处理一张图像的时间,对应的概念就是帧率)。
通常我们会这么操作,将读取图像相关操作成为生产者,将处理图像相关操作成为消费者。这样做会有什么问题嘛?我们可以假设一下,第一种情况:如果生产者速度高于消费者,也就是说我们读取很多张之后才能处理的了第一张,那么这时候我们必须让消费者处理最新生产出来的图像,保证数据的最新性。(赛场上我们要关注一分钟前目标的坐标嘛?)第二种情况:如果处理速度高于生产速度,那么会有一个问题,我们处理完了这一张图像,紧接着处理下一张图像,这时候发现图像是空的(也就是我们读取了空数组),会引发异常,这时候我们就必须等一等生产者。相关代码可以到自己学校开源或者别的学校开源,来实验室现场询问也可以。
处理过程之识别
上面写着数字:2 的就是装甲板,我们可以看见装甲板的两侧亮着灯条,这个灯条就是我们识别出灯条的利器。首先我们可以看到,灯条是有颜色的,灯条自身有比例,而且两个灯条之间的几何关系也是确定的,通过这些我们就可以把装甲板识别出来。
但是这样是不够的,首先我们知道,赛场上灯光干扰对我们识别造成了很大的影响,你永远不知道灯条会和谁在一起(bushi。所以我们需要利用那个数字,也就是我们要做数字识别。
数字识别步骤:
- 准备数据集, 不能是minisit,因为哨兵前哨战基地图案不是数字。
- 将数据集加载至CNN网络。
- 训练的到模型(pt或者pth),并转换为onnx
- 用dnn部署onnx(这是最简单的,也是很容易操作的,当然有点耗时,但其实没啥事,影响不大)
数据集怎么准备:
- 一个文件作为一个类名,比如文件名为1的,里面就全是1的装甲板。
获取数据集大概就是这么个操作,慢慢看吧,不太清楚来实验室询问一下就行。(这是属于操作最简单的数字识别了)