前言
在参加 OpenMMLab AI 实战营中,有个作业要求使用 MMDetection (方针检测工具包)练习模型,然后使用这个模型对一段小视频进行处理 (保存 mask 部分的彩色, 布景部分取灰)。文章的资料当然也来自实战营啦。这儿主要讲一下处理视频的进程,练习模型的进程略过。
一、模型引进
from mmdet.apis import init_detector
model = init_detector(config="../work_dir/balloon.py", checkpoint="../work_dir/latest.pth")
这儿 config 为练习模型的配置文件,checkpoint 为练习完保存的模型文件
二、检查图片
要使用 MMDetection 处理视频,就要先知道如何检查模型处理完之后的图片
from mmdet.apis import inference_detector, show_result_pyplot
img_path = "../data/balloon/val/3825919971_93fb1ec581_b.jpg"
result = inference_detector(model, img_path)
show_result_pyplot(model, img_path, result, score_thr=0.85)
成果如下:
三、视频每帧
咱们处理视频,很简单能够想到讲视频点破一帧一帧处理,一帧便是一张图片,这儿使用 mmcv 对视频进行处理
import mmcv
v = mmcv.VideoReader("test_video.mp4")
v.cvt2frames("frame_dir/in")
在处理后咱们能够得到 150 张图片
四、处理每帧
0、了解 inference_detector
inference_detector 函数传入一个 model 既练习的模型,和一张或几张图片,要点在于 returns ,回来在这说的不是很清楚,单个回来的是 bbox, segm, 即边框和分割信息
result = inference_detector(model, img)
bbox, segm = result
bbox = np.array(bbox[0]) # bbox 为列表
print(bbox.shape) # (23, 5)
segm = np.array(segm[0])
print(segm.shape) # (23, 1024, 683)
这儿的 23 代表检测到 23 个方针 bbox 中含有的信息为 (x, y, w, h, n)即间隔左上角的宽度和长度、框的长度和宽度、概率 segm 中 (1024, 683)为图片宽度和高度,值为 Bool, true 则为 mask, false 则为布景 别的,能够看到这儿引进了 numpy,一方面是为了处理便利,一方面是为了加快速度
1、处理图片
score_thr = 0.85
balloon_cnt = bbox[bbox[:, -1] > score_thr].shape[0]
data = mmcv.imread(img_path) # -> ndarray
tmp = data.copy()
# Gray = (Red * 0.3 + Green * 0.59 + Blue * 0.11)
# 'bgr'
data[:, :, 0] = data[:, :, 2] * 0.3 + data[:, :, 1] * 0.59 + data[:, :, 0] * 0.11
data[:, :, 1] = data[:, :, 0]
data[:, :, 2] = data[:, :, 0]
for balloon in segm[:balloon_cnt]:
data[balloon] = tmp[balloon]
mmcv.imwrite(data, "out.jpg")
这儿首要判断了一下为方针(这儿是 balloon 气球)大于 0.85 概率的数量,接着对整张图片进行灰度核算 (这儿要注意 mmcv.imread() 回来的通道为 bgr ),最终将含有方针的部分用原来的数值代替,最终使用mmcv 保存图片 成果如下:
五、拼接图片
上面咱们将视频拆成图片,最终咱们当然要将图片拼接成视频啦
mmcv.frames2video(frame_dir="frame_dir/out", video_file="video_out.mp4")
使用 mmcv 一行代码搞定
最终
最终看看成果吧