项目遇错总结(个人总结用)

最近在做一个项目,比较简单,就是跟踪检测一个单目标,同时控制一个执行机构能够跟踪拍摄,要求落地成产品。

需求就是延时低,帧率高

我的思路是 用yolov5 + deepsort 实现检测跟踪,落地必须使用多进程

我的算法作为服务器端,运行以上算法;
客户端负责,发送摄像设备的图像和接受解算服务器端的结果;
两者通过网线相连。后期再将算法放到真正的服务器端运行。

显然需要多进程,共享内存


一阶段

服务器端两个进程:一个进程接收视频流并发送检测结果,一个进程检测跟踪;
客户端开始的时候没有进程:一个循环发送视频流,接受检测结果。

服务器端:
在这里插入图片描述
客户端:
在这里插入图片描述

客户端:刚开始,我想的是发送检测后的图片,但是试了试,延迟太高了:
服务器端:接收视频流进程:从接受原图开始计时,到发送(检测后的图片+检测结果, 6404803+18个数据),用时0.004~0.006s
客户端:从循环(开始)读取视频,到获取检测后的图片显示,用时0.053~0.056s

从延时来看,效果十分差。但是检测框和人物匹配的很好。

后面经分析,决定不传送检测后的图片,仅传输检测结果
在同样的计时条件下:
服务器端:用时0.000~0.001s
客户端:不发送处理后的图片且不显示,用时0.013~0.014
不发送处理后的图片但显示,用时0.015~0.018

现象
我遇到一个现象就是 服务器端,我是有一个帧戳,每次检测到目标就加一,并作为传回数据的一位;客户端,将检测结果画到原始图片上。我将保存后的视频,进行逐帧切片,发现图片上的帧戳并不是一个一个的,而是有重复,比如两个14戳。这就很奇怪。有时候还有跳帧卡顿。

在这里插入图片描述
从流程图可以看到,我虽然用了多进程,实际上,并没有用多进程,因为客户端是一个单循环,即读取一张图片,发送图片,在这个图片上绘制检测结果,因此客户端会等待,直到拿到服务器端的检测结果,画完检测框后,才会发送下一张图片,因此是“单进程的”(我和师兄偶然交流知道我错了)

当时之所以客户端弄一个循环,是因为要把检测结果画到原图片上。


二阶段

有了想法,那就马上实施,我把客户端也差分,一个进程读取视频流发送视频流;一个进程绘制检测结果和保存检测结果,如下图所示:
在这里插入图片描述
在这里插入图片描述

  • 现象

直接运行测试,发现检测框与人物不匹配,直接跑飞了,,,,

仔细分析后,觉得是服务器端的问题,发送检测结果和接收视频流放在一个进程,增大了延迟


三阶段

把服务器端进一步差分,两个进程,一个进程疯狂的读图;另一个进程疯狂的检测和发送结果
在这里插入图片描述
运行后,发现一阶段有多个重复帧戳的问题解决了,卡顿现象也没有了,延时暂时没有测

但多了两个新问题:
1是视频的色彩变了,颜色不对
2是在客户端无法画出检测框

经过一天的分析,最后解决了
问题一:
我的客户端发送图片前,会发送图片名和尺寸,服务器端接收,之前把尺寸信息删除了,因此code_len其实是减少了
receive = socket_conn.recv(code_len)
这在一个循环里没有问题,但是在多进程里,出现了问题。图片名是10个字符的字符串,因此code_len应为10,但是我仍然按照老的,写24,所以发生了错误。经过测试,改为其他值,有的值会出现卡死,有的值会出现图像色彩失真,只有10是合适的

问题二
由于之前检测结果的发送在另一个进程里,所以开辟了一个共享内存,声明了发送数据的类型为sharedctypes.RawArray(ctypes.c_int32, 1 * 18)
但是在二阶段直接发,就没有声明,发送的是一个列表,客户端接受的结果如下
在这里插入图片描述
在我重新声明发送的数据以后,问题解决~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值