前阵子接手了一个项目,客户是一个工厂,比较重视安全生产,整个厂区和车间安装了200多个摄像头,用的是海康的网络摄像头+硬盘存储服务器。目的是为了监控在生产车间生产人员是否正确配戴安全帽,是否有人吸烟,是否有烟火、烟雾,是否有人不走斑马线等。但海康的视频监控系统只能在事后调查取证用,不能实时报警。客户要求做一个对上述需求能够实时报警的视频监控系统,我就喜欢这种目标非常明确的项目,在Github上调研了一番,决定使用iSpy+yolo实现客户需求。
iSpy的确是一个非常牛X的开源视频监控软件,支持数量不限的(只受限于计算机的内存和带宽)多种多样的音视频源,包括网络摄像头、USB摄像头、游戏机摄像头、多种格式视频文件,甚至还能够控制摄像头云台,接受游戏机手柄控制等,还支持几种简单的运动检测和跟踪,还有报警策略(短信,Twitter和电子邮件报警)、记录策略(FTP上传、YouTube上传等),最后居然还支持多国语言!呃,基本上就是监控界的航空母舰。
但我还是要吐槽一下iSpy,那个代码写的真叫一个烂!咱就不要说什么面向对象编程这种高大上的要求,毕竟很多高手都不一定做的好,但是像代码书写规范这种基本要求也没达到,缩进从来不对齐,空行满天飞,一边拿着呕吐袋一边看代码!我从来没看过这么烂的开源代码,绝对没有之一!大量的大学生水平代码,处理手法非常稚嫩,如对windows消息的处理,windows消息参数都是无符号的uint,它非要转成有符号的int,真是画蛇添足,如果消息参数大于等于0X80000000,那就会产生overflow错误,这可是一个非常严重的系统错误。他们肯定也发现了这个不稳定问题,不但不耐心从根子上解决问题,反而使用try catch流氓大法蒙混过关。所以iSpy从来不会因为windows消息问题非法操作退出,貌似很稳定,但就是某些操作不起作用。像这种滥用try catch机制的行为,非常鄙视,哪怕在catch中写个调试控制台输出也好啊。最后怕客户将来找我麻烦,把iSpy的windows消息处理系统改了一遍,把我累个半死。
相比之下,yolo的代码水平还是非常高的,但毕竟是C语言写的,没有面向对象设计概念,代码生硬,不够优雅,但调用逻辑层次还是清晰可人的。它是目前非常火的一个基于深度学习的图像识别算法,速度非常快。我在GTX1080Ti上测试,例如安全帽检测只需要38-42毫秒,要知道对图像进行标注重绘也要8-12毫秒。后来找了一块最高端的Titan测试,启用yolo的CUDNN硬件哈夫曼编解码编译选项,检测时间比重绘时间都快!确实非常适合实时检测。
好了,前情提要交代完毕,现在开始进入正题。iSpy是使用C#编写的基于.net架构的托管型应用程序,而yolo最快的版本(那些大批基于Python的版本只能用于学习研究,不适合商业应用)是一个基于