Recognizer2D
就是2D行为识别模型的 architecture。mmdetection
中的 FastRCNN
。FastRCNN
:meta architecture,定义了整体模型流程以及组成部分。
backbone
和 roi_head
num_classes
的list,list中每个元素是一个 num_proposals, 5
的ndarray对象。5维分别是bbox + score。frame_interval
提取一帧,一共提取 clip_len
帧图像。img, proposals
两个key。
1, 1, 3, 32, 256, 256
,这个其实就是Recotnizer3D
模型的输入了。xmin, ymin, xmax, ymax
,浮点数,数值范围是像素值(而不是0 -1
之间)val_pipeline
中的 SampleAVAFrames
,获取 clip_len/frame_interval
信息,根据这两个信息以及命令行输入的 predict_stepsize
获取所有中间帧id。
xmin, ymin, xmax, ymax
,浮点数,数值范围是像素值(而不是0 -1
之间),可直接作为时空行为检测模型的输入。1, 3, clip_len, height, width
(不添加 batch size)+存入显存predict_stepsize
以及 output_stepsize
。predict_stepsize
帧预测一次行为标签。output_stepsize
帧展示一帧。比如原先fps是20,output_stepsize是4,那最终展示的视频就是5fpsframe_provider = ThreadVideoManager(cfg)
for task in tqdm.tqdm(run_demo(cfg, frame_provider)):
frame_provider.display(task)
frame_provider.join()
frame_provider.clean()
ThreadVideoManager
run_demo
功能:
首先,Demo中数据传输是通过 TaskInfo
TaskInfo
可以理解为一个clip的输入数据,主要内容包括 frames 以及其他一些元信息。TaskInfo
是有 id 的按创建顺序从小到大开始编号。其次,对于这个类,一共有3个线程
run_demo(cfg, frame_provider)
调用,调用的方法就是 __next__
。
run_demo
函数将读取的task作为model输入,获取预测结果、更新task,添加到 write queue 中。put_id
,向 read queue 或 write queue 添加 task。get_id
,并输出(本地视频或cv2.imshow)当前clip还没有显示过的若干帧。有一堆线程安全的操作:
put_id
get_id
frame_provider
ActionPredictor
,是单GPU版本。
AsyncDemo
,由于我不关注,所以相关代码取消了。model.put(task)
和 model.get()
来使用模型推理并获取结果。video_vis = VideoVisualizer(
num_classes=cfg.MODEL.NUM_CLASSES,
class_names_path=cfg.DEMO.LABEL_FILE_PATH,
top_k=cfg.TENSORBOARD.MODEL_VIS.TOPK_PREDS,
thres=cfg.DEMO.COMMON_CLASS_THRES,
lower_thres=cfg.DEMO.UNCOMMON_CLASS_THRES,
common_class_names=common_classes,
colormap=cfg.TENSORBOARD.MODEL_VIS.COLORMAP,
mode=cfg.DEMO.VIS_MODE,
)
async_vis = AsyncVis(video_vis, n_workers=cfg.DEMO.NUM_VIS_INSTANCES)
model = ActionPredictor(cfg=cfg, async_vis=async_vis)
seq_len = cfg.DATA.NUM_FRAMES * cfg.DATA.SAMPLING_RATE
num_task = 0
# Start reading frames.
frame_provider.start()
for able_to_read, task in frame_provider:
if not able_to_read:
break
if task is None:
time.sleep(0.02)
continue
num_task += 1
model.put(task)
try:
task = model.get()
num_task -= 1
yield task
except IndexError:
continue
while num_task != 0:
try:
task = model.get()
num_task -= 1
yield task
except IndexError:
continue
这个是同步版(单GPU)的模型推理与可视化工具。
AsyncDemo
。主要包括两个对象
Predictor
:包括构建模型、导入权重、数据预处理(resize/crop/norm等)、模型推理,其中还包括一个 detectron2 的目标检测模型。AsyncVis
:后面会单独介绍。主要函数就是:
put
:执行模型推理,并可视化数据get
:获取推理结果(保存在一个task对象中),返回task对象AsyncVis
AsynVis
对象的 put
方法,向进程安全的task_queue
队列中放入数据。同时,也会向 get_indices_ls
数组添加 task.idVideoVisualizer
对象作为输入,构建 num_workders
个进程。
task_queue
中读取数据,并将结果放入线程安全的 result_queue
中。result_queue
中的数据转换为线程不安全的 result_data
中。draw_predictions
函数,即对指定的task画图。task_queue
中添加数据,get 操作就是向 result_queue
中获取数据。draw_predictions
方法主要就是一些数据预处理,构建 VideoVisualizer.draw_clip_range
所需的输入数据,并调用该函数,不关心细节。