我们已经开发Macroscop近十年了。 在这段时间里,智能模块的开发中已经开发出一种非常彻底和认真的方法来创建新功能。 一方面,这非常好。 认真的意图与高质量的产品息息相关。 但是同时,彻底性可能会限制流程的缓慢性和不可操作性。
就在几年前,当我们收到用户要求开发新产品(产品开发总体计划中未包括)的要求时,我们进行了长时间的预测,评估了该功能在众多用户中的普遍性和相关性。 而且他们经常拒绝或评估实施时间很长。 但是一旦我们收到一个重大项目的要求。 在成功并快速实现缺少的用户功能的情况下,Macroscop的实现前景和规模非常好。 我们开始尝试! 我们的时间紧迫,用户反应灵敏,乐于助人,行动自由自在。

而且...一切顺利!
我们在短时间内做了一个新功能。 此外,她准确而又快速。 每个人都很满意:用户收到了梦the以求的知识模块,开发人员获得了很棒的经验,公司–销售。
这种实践标志着Macroscop中开发智能功能的
新方法的开始:我们变得越来越容易满足我们的用户。 它给出了结果。
最重要的是确定用户的真正需求并与他明确地制定任务。 在快速开发定制功能(在下文中将其称为快速功能)时,必须指定要求:用户最终希望看到的内容,关注的重点。 因为有条件地需要一个人首先确定工作,而另一个则要使其看起来很酷。 当我们使用快速功能时,我们并不是在谈论最终它将在任何条件下以100%的精度工作的事实。 我们
承诺会测试该想法本身,并尝试从一开始就创建可以正常工作并且可以在一个特定对象上使用的东西。 只有这样,如果成功,我们便会不断完善并推出具有良好性能的通用产品。
当目标和优先事项明确后,我们就开始发展。 在很短的时间内,我们开发了用户可以评估的原型。 我们将其进行测试。 如果我们所做的事情与用户的需求相关联并且总体上他喜欢他,并且我们在开发中使用的方法还没有穷尽自己并且有改进功能的前景,那么我们可以走得更远。 如果发现完全错误和完全错误,我们将关闭该项目。 而且由于这是在早期发生的,因此我们几乎一无所获。
使用这种方法,开发人员和用户应该
尽可能地互相帮助。 还要求用户参与此过程:必须在不同的相机和不同的条件下仔细测试原型,尝试不同的设置并按不同的按钮,给出详尽的反馈:什么是方便,什么是不方便,什么是不正确的评估准确性的方式,服务器正在加载多少,等等。
最初,我们满足一个特定客户的需求,但是即使在开始工作之前,
我们仍会估计此功能在将来会变得
多么普遍 ,以及有多少人可以帮助解决他们的问题。 并且在将来,我们将调整快速功能,使其在尽可能多的视频系统中有用并适用。
您还记得这一切是如何开始的吗..(c)
对我们来说,第一个快速功能是
队列计数模块 。 总的来说,我们以前有过,但是适用条件是有限的:当摄像机从上到下严格看时,模块只能在一个投影中工作。 一旦有用户接触到我们,该用户需要在根本不同的条件下对队列中的人数进行计数-当摄像头对角地(直接且略高于上方)注视队列时。
从这个角度来看,Macroscop模块可以
在此-了解他都喜欢Macroscop,但缺乏珍贵的功能。 该项目非常有前景,只要出现了这样的模块,并且用户可以将软件安装在对象上,用户就可以与我们进行各种
合作 。 我们决定不错过机会,并开始发展。
在该模块的最后一个变体中,算人的任务是通过经典的计算机视觉方法解决的,该方法对使用条件施加了严格的限制。 但是在新任务的框架中,该模块必须学会在根本不同的困难条件下对人员进行计数。
智能功能开发小组分为三个子小组,每个小组都开始尝试自己的方法。 所有这些都是基于神经网络的使用。
我尝试将第一个转移到我们开发
的头盔检测器基础结构的队列中的人数统计模块(请参阅
有关如何尝试使用现代神经网络技术在人头上找到头盔的文章 )。 这种方法看起来非常合乎逻辑:头盔检测器在工作的某个阶段解决了类似的问题。
第二组尝试应用
回归神经网络 。 她计算图像中的人数,但没有选择特定的对象,因此很难控制。 在回归神经网络上进行训练时,将提交一张图片,并显示在场人数,然后神经网络给出一个数字-找到了多少人。 用新图像填充样本,我们试图训练它以正确计数。
不幸的是,我们拒绝了这两种方法,因为基于它们创建的计数器的准确性很低。
第三组测试了一个相当知名
的通用检测器 ,该检测
器可以实时检测各种对象。 他知道如何搜索上千种不同的对象,但是并不能解决所有问题。 我们完成了此检测器的定型,并在自己广泛的样本上对其进行了训练,并获得了相当不错的结果-准确度可接受的人数计数器。 他们通过新的选择对其进行了改进,并最终获得了原型,这已经不是给用户进行测试的耻辱。 他的评估是……积极! 他说,总体而言,该
解决方案已经具有竞争力 ,但准确性仍不高-仅60-70%。
队列计数器的第一个版本主要是使用该用户的剪辑创建的。 我们解决了这个问题-
与他专门合作 -但我们了解到,如果我们训练神经网络并为一个特定项目制作模块,就不可能进一步扩展。 因此,对一个更通用的样本进行了进一步的培训,即使没有整体内部改进,也导致准确性提高。 然后,我们开始研究模块包装-改进了界面,修改了各种设置,引起了对可用性和逻辑的关注。 同时,我们修复了原型中的多个错误(顺便说一句,其中一个错误出乎意料地将模块加速了7倍),弄清楚了如何减少CPU消耗,并连接了视频卡上的工作。 结果,我们得到了一个客观功能良好且易于管理的模块,该模块可以快速分析,产生准确的结果,知道如何在不加载处理器的情况下在视频卡上工作。
我们的用户很高兴! 他去了新版本的商店,并确认实际上一切正常。 我们设法达到85-90%的准确性(对于队列中的人们彼此之间不完全重叠且可以区分的情况)。
当然,在开发过程中,并不是一切都顺利进行,例如,在第一个原型与现在安装在站点上的解决方案之间,有一个失败的版本比以前的版本工作得差。 但是根据她的经验,我们意识到测试时要寻找的内容,了解了所使用框架的许多功能。 鉴于此,我们制作了一个很酷的最终模块,然后基于它-另一个快速功能。

幸福的结局
现在,用于对新版本队列中的人员进行计数的模块的应用程序正在扩展到该用户的其他商店。 最终版本-投入生产并进入了Macroscop版本,该版本正准备发布。 顺便说一句,用户对结果和整体工作方式非常满意,以至于提出了另一个要求-制造
一个空架子检测器 。 然后我们又接受了,然后又做了一次(但这是一个完全不同的故事)。
如果要进行总结,那么为了进行比较:用于计数队列的旧模块模块的开发和完善(4年前)花费了大约
8个月的时间 。 我们在
2个月内完成了新模块的制作(第一个工作原型在2-3周内移交给了用户)。
到目前为止,这仅是对笔的考验,并且仅在一个方向(即智力功能的发展)的框架内。 总的来说,我们坚持采用更加严格和彻底的产品开发方法-进行计划,进行大量想法验证,需求分析和深入测试。 与用户密切协作创建Macroscop的做法(无论是开发内核还是视频分析模块)都保持不变。
不能确定快速功能的方法应在整个部门中持续应用,但是现在我们已经获得了快速开发的真实经验,为此而做的用户可以从该产品中真正受益。
无论如何,对于我们自己,我们提出了一些规则,遵守这些规则是开发快速功能成功的一半:
- 尝试满足用户需求,但不要忘了自己的目标:承担可扩展的项目,投资长期有用的东西。
- 深入了解用户的实际任务和需求,确定优先级。
- 争取用户支持。 如果他准备好积极地进行交流,测试,提供反馈并提供必要的数据(例如,来自真实物体的视频),那么就有机会很好,快速地发展。
- 不要害怕失败,并将其视为可能的结果之一。
- 不要尝试从头开始开发一些独特的东西,而应尽可能利用现有经验:在我们的情况下,请尝试使用已经实现的模块中的部分算法。 即使最终的解决方案是可行的,也要花时间研究和定制。