场景文字检测模型PixelLink详解与使用

详解PixelLink模型与使用!

觉得不错,请点【在看】支持!

OpenVINO是英特尔推出基于CPU/GPU新一代视觉加速框架,可以对常见的各种检测模型与分割模型在CPU端侧实现10倍以上加速。其自带预训练模型库支持多种常见视觉感知与识别应用场景,可以快速搭建原型演示程序与极简应用。相关****可以点击下面链接学习:

首发 | OpenVINO开发配套****发布了

PixelLink模型详解

OpenVINO支持的场景文字检测是基于PixelLink模型,该模型是浙大联合阿里提出,其核心思想是基于图像分割来实现场景文字检测

场景文字检测模型PixelLink详解与使用

比起之前的很多基于检测的场景文字检测模型来说在性能与准确率方面都有比较明显的提升。PixelLink网络模型架构如下:

场景文字检测模型PixelLink详解与使用

其中CNN部分采用了VGG16做为特征提取网络,对输出分为两个部分

  • 像素分割,判断每个像素是否为text/non-text
  • 链接预测,对每个像素点八领域进行链接预测,如果是positive则合并为text像素,如果不是则放弃。

通过上述两步之后得到叠加的TEXT图像mask,对mask图像进行连通组件发现或者基于OpenCV的轮廓发现即可得到最终检测框输出。检测框输出分为两种

  • 基于minAreaRect
  • 基于boundingRect

代码实现

代码实现基于OpenVINO Python版本 SDK与OpenCV实现,各步分解代码分别如下:

加载网络

# 加载IR

log.info( "Reading IR...")

net = IENetwork(model=model_xml, weights=model_bin)

获取输入层与输出层

# 获取输入输出层

input_blob = next(iter(net.inputs))

outputs = iter(net.outputs)

# 获取多个输出层名称

out_blob = next(outputs)

second_blob = next(outputs)

log.info( "Loading IR to the plugin...")

print( "pixel output: %s, link output: %s n"%(out_blob, second_blob))

输入图像,执行推断

in_frame = cv2.resize(image, (w, h))

in_frame = in_frame.transpose(( 2, 0, 1)) # Change data layout from HWC to CHW

in_frame = in_frame.reshape((n, c, h, w))

exec_net.infer(inputs={input_blob: in_frame})

获取输出

# 获取输出

res1 = exec_net.requests[ 0].outputs[out_blob]

res2 = exec_net.requests[ 0].outputs[second_blob]

解析输出生成mask

# 像素分割

forrow inrange(h):

forcol inrange(w):

pv1 = res1[row, col, 0]

pv2 = res1[row, col, 1]

ifpv2 > 0.95:

pixel_mask[row, col] = 255

# 领域链接

forrow inrange( 1, h -1, 1):

forcol inrange( 1, w -1, 1):

pv = pixel_mask[row, col]

ifpv == 0:

continue

link_mask[row, col] = 255

# left

pv1 = res2[row, col, 0]

pv2 = res2[row, col, 1]

# left-down

pv3 = res2[row, col, 2]

pv4 = res2[row, col, 3]

# left-up

pv5 = res2[row, col, 4]

pv6 = res2[row, col, 5]

# right

pv7 = res2[row, col, 6]

pv8 = res2[row, col, 7]

# right-down

pv9 = res2[row, col, 8]

pv10 = res2[row, col, 9]

# right-up

pv11 = res2[row, col, 10]

pv12 = res2[row, col, 11]

# up

pv13 = res2[row, col, 12]

pv14 = res2[row, col, 13]

# down

pv15 = res2[row, col, 14]

pv16 = res2[row, col, 15]

ifpv1 > 0.5:

link_mask[row, col -1] = 255

ifpv3 > 0.5:

link_mask[row+ 1, col - 1] = 255

ifpv5 > 0.5:

link_mask[row -1, col - 1] = 255

ifpv7 > 0.5:

link_mask[row, col + 1] = 255

ifpv9 > 0.5:

link_mask[row+ 1, col + 1] = 255

ifpv11 > 0.5:

link_mask[row+ 1, col - 1] = 255

ifpv13 > 0.5:

link_mask[row -1, col] = 255

ifpv15 > 0.5:

link_mask[row+ 1, col] = 255

轮廓扫描生成boxes

contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

forc inrange(len(contours)):

rect = cv2.minAreaRect(contours[c])

box = cv2.boxPoints(rect)

box = np.int0(box)

print(box)

cv2.drawContours(image, [box], 0, ( 0, 0, 255), 2)

运行效果

输入原图

场景文字检测模型PixelLink详解与使用

生成的mask区域

场景文字检测模型PixelLink详解与使用

场景文字检测模型PixelLink详解与使用

场景文字检测模型PixelLink详解与使用

场景文字检测模型PixelLink详解与使用

志合者不以山海为远

OpenCV研习社

系统化学习OpenCV4