几天前,我们announced是第一个无管道的版本,这是一个开源多媒体框架,专注于计算机视觉。
使用Pipeless开发人员可以在短短几分钟内构建和部署应用程序来分析和操纵音频和视频,而完全忘记了构建和维护多媒体管道。
今天,我们将讨论如何使用无管道和Docker轻松部署计算机视觉应用程序。
与Docker本地运行计算机视觉
让我们以previous post的榜样为例。为了刷新内存,我们正在创建一个应用程序,使您可以识别猫何时在花园里,我们希望在这种情况下收到警报。
要在上一个示例中执行示例,您需要安装无管道及其对系统的依赖项。尽管无管有很少的依赖关系,但我们了解这对开发人员来说是多么乏味,因此我们发布了一个最小的容器映像,该图像无管道地运行和部署应用程序所需的一切。
使用容器映像,您只需一个简单的命令就可以部署并运行application code,而无需在系统上安装任何内容(除了Docker)。查找here整个容器文档。
使用无管容器图像运行应用程序真的很简单。我们只需要为容器提供我们的应用程序代码即可。为此,只需将应用程序安装到容器的/app
目录中即可。它将自动加载并执行:
docker run --rm -v /my/app/path:/app miguelaeh/pipeless run all
应用特定软件包
在CATS应用程序示例中,您必须安装OpENCV来绘制猫脸周围的检测到的边界框,但是,默认情况下,OpenCV不会使用无管容器图像发货。由于它是特定应用程序的python依赖性,因此我们需要通过PIPELESS_USER_PYTHON_PACKAGES
环境变量提供它,并且容器将在运行时安装它。因此,扩展以前的命令:
docker run --rm -v /my/app/path:/app -e "PIPELESS_USER_PYTHON_PACKAGES=opencv-python" miguelaeh/pipeless run all
运行上述命令该应用程序将按预期运行,但是,整个无管道框架将在同一容器下运行,即在同一过程下,这是一种不良习惯,考虑到从几个组件组成的无管道。
将无用的部署到云中
为了运行彼此隔离的每个无管组件,我们创建了一个基本的docker-compose.yaml文件。此Docker-Compose文件的结构相同,在部署到云时将遵循,例如使用Kubernetes。
将基于本地码头组合构建以下解释,以便每个阅读此书的人都有仅使用一台计算机尝试的资源和访问。
由于猫将由花园摄像机拍摄,因此处理本地文件是没有意义的,因此,我们将配置无管道以从https
源读取视频(检查Docker-上的PIPELESS_INPUT_VIDEO_URI
的值撰写文件)。所提供的默认值指向示例的托管视频,但可以随意将其更改为RTSP
uri或任何其他协议。
在输出视频的情况下,理想的情况也是将其发送到外部来源,但是,这在这个特定示例中并不有趣,因为您不想查看输出视频。目前,让我们简单地将其本地存储在已安装的应用程序目录中(请参阅Docker-Compose文件上的PIPELESS_OUTPUT_VIDEO_URI
)。
注意:为了允许 non-root容器写入安装的应用程序目录,安装的目录必须由根组拥有任何特殊许可)。
现在,我们使用Docker组合部署了计算机视觉应用程序,从外部来源读取流,我们可以轻松更新而无需修改应用程序代码或基础架构,并且我们还可以更新输出URI,以远程存储我们的结果,例如到S3桶。
设置警报
您想在您的猫在花园里收到通知,因此用边界盒存储视频对这种情况并不是很有用。
从简化的角度来看,当型号标识输入视频上的一些边界框时,我们的猫就在花园里。因此,当检测到边界框时,只需向我们发送电子邮件就足够了。
如果您想避免误报,则只有在猫在花园里呆了几秒钟的情况下,才可以轻松地实现一种机制来发送该电子邮件。请记住,我们逐帧处理输入流,因此将一个边界框中的框架找到隔离的框架可能是假阳性。
借助无管的before
和post-process
钩子,以上很容易实现。在之前的挂钩上,您可以以零初始化计数器初始化。然后,如果您在框架上找到边界框,请增加计数器,如果在框架上找到边界框,请重置计数器。最后,如果计数器达到您指定的阈值,则在30 fps流的情况下为1秒钟,您只需发送电子邮件,甚至可以在其中包含猫图片。您应该能够使用任何库发送该电子邮件。
结论
您已经使用Docker部署了计算机视觉应用程序,将其连接到外部流源,并设置系统以在您的猫在花园时接收电子邮件通知。所有这些都没有建造复杂的基础架构,在15行代码和几个命令中。我们鼓励您继续使用该示例或从头开始实施另一个示例。
If you like Pipeless, help us by starring our GitHub repository and sharing feedback!