python视频流处理库
videoflow的Python项目详细描述
视频流
videoflow是用于视频流处理的python框架。该库的设计是为了方便快捷地定义计算机视觉流处理管道。它使开发人员能够使用简单的几行代码构建具有自包含的深度学习和计算机视觉功能的应用程序和系统。它包含了现成的参考组件,用于目标检测、目标跟踪、人体姿态估计等,并且易于扩展。
项目的完整文档位于docs.videoflow.dev
安装框架
要求
在安装之前,请确保已经安装了cv2
和tensorflow >= 1.12
。python 2不支持。需要Python3.6+。也有一些known issues可以在windows上运行它
安装
通过执行pip3 install videoflow
或者,您可以通过以下方式安装:
- 克隆此存储库
- 在repository文件夹中,执行
pip3 install . --user
使用Docker
# clone repo docker build -t repo/videoflow:latest . # runs examples/object_detector.py by default docker run -u $(id -u):$(id -g) -v $(pwd):/usr/src/app repo/videoflow # or mount the volume from your code directory to /usr/src/app docker run -u $(id -u):$(id -g) -v $(pwd):/usr/src/app repo/videoflow python /usr/src/app/yourown.py
贡献:
一个关于我们前进方向的暂定的roadmap。
如果您可以创建新的处理器、生产者或消费者,请检查videoflow-contrib项目。我们想要 保持视频流简洁、干净和简单,并尽可能减少对第三方库的依赖。videoflow-contrib更适合添加需要新库的新组件 依赖关系。
视频流应用程序示例:
下面是一个检测十字路口汽车的视频流应用程序示例。有关更多示例,请参见examples文件夹。它使用由tensorflow/models
importvideoflowimportvideoflow.core.flowasflowfromvideoflow.core.constantsimportBATCHfromvideoflow.consumersimportVideofileWriterfromvideoflow.producersimportVideofileReaderfromvideoflow.processors.vision.detectorsimportTensorflowObjectDetectorfromvideoflow.processors.vision.annotatorsimportBoundingBoxAnnotatorfromvideoflow.utils.downloaderimportget_fileURL_VIDEO="https://github.com/videoflow/videoflow/releases/download/examples/intersection.mp4"classFrameIndexSplitter(videoflow.core.node.ProcessorNode):def__init__(self):super(FrameIndexSplitter,self).__init__()defprocess(self,data):index,frame=datareturnframeinput_file=get_file("intersection.mp4",URL_VIDEO)output_file="output.avi"reader=VideofileReader(input_file)frame=FrameIndexSplitter()(reader)detector=TensorflowObjectDetector()(frame)annotator=BoundingBoxAnnotator()(frame,detector)writer=VideofileWriter(output_file,fps=30)(annotator)fl=flow.Flow([reader],[writer],flow_type=BATCH)fl.run()fl.join()
应用程序的输出是带批注的视频:
流应用程序的结构
流应用程序通常由三部分组成:
在应用程序的第一部分中,定义计算节点的有向无环图。有三种不同的节点:生产者、加工商和消费者。生产者节点创建数据(通常它们将从流外部的源获取数据)。处理器接收数据作为输入,产生数据作为输出。消费者读取数据,不产生任何输出。当您想将结果写入日志文件时,或者当您想将结果推送到外部源(rest api、s3 bucket等)时,通常使用使用者。
要创建流对象,需要将生产者列表和消费者列表传递给它。一旦定义了流,就可以启动它。启动流意味着生产者开始将数据放入流中,处理器和消费者开始接收数据。启动流还意味着为生产者、加工商和消费者分配资源。为了简单起见,现在我们可以说,每个生产者、处理器和消费者都将在自己的进程空间上运行。
一旦开始流动,你也可以停止它。当你停止流动,它将发生有机的。生产商将停止生产数据。流中的其余节点将继续运行,直到管道干透。当每个节点停止生成/处理/消耗数据时,流中使用的资源将逐步释放。