我正在尝试在OpenCV中使用EAST模型来检测图像中的文本。通过网络运行映像后,我可以成功获取输出,但是我很难理解我使用的解码功能如何工作。我知道我从模型中得到了5个数字,我认为这是一个点到矩形的顶部,底部,左侧和右侧的距离,以及端部的旋转角度。我不确定解码功能如何获取文本区域的边界框。
我知道为什么偏移量会乘以4(在模型中运行时会缩小4)。我知道为什么h和w是它们。之后我什么都不知道。
得分是每个地区的置信度得分; geometry是每个区域的几何值(我提到的5个数字) scoreThresh只是非最大限制的阈值
def decode(scores, geometry, scoreThresh):
detections = []
confidences = []
############ CHECK DIMENSIONS AND SHAPES OF geometry AND scores ############
assert len(scores.shape) == 4, "Incorrect dimensions of scores"
assert len(geometry.shape) == 4, "Incorrect dimensions of geometry"
assert scores.shape[0] == 1, "Invalid dimensions of scores"
assert geometry.shape[0] == 1, "Invalid dimensions of geometry"
assert scores.shape[1] == 1, "Invalid dimensions of scores"
assert geometry.shape[1] == 5, "Invalid dimensions of geometry"
assert scores.shape[2] == geometry.shape[2], "Invalid dimensions of scores and geometry"
assert scores.shape[3] == geometry.shape[3], "Invalid dimensions of scores and geometry"
height = scores.shape[2]
width = scores.shape[3]
for y in range(0, height):
# Extract data from scores
scoresData = scores[0][0][y]
x0_data = geometry[0][0][y]
x1_data = geometry[0][1][y]
x2_data = geometry[0][2][y]
x3_data = geometry[0][3][y]
anglesData = geometry[0][4][y]
for x in range(0, width):
score = scoresData[x]
# If score is lower than threshold score, move to next x
if(score < scoreThresh):
continue
# Calculate offset
offsetX = x * 4.0
offsetY = y * 4.0
angle = anglesData[x]
# Calculate cos and sin of angle
cosA = math.cos(angle)
sinA = math.sin(angle)
h = x0_data[x] + x2_data[x]
w = x1_data[x] + x3_data[x]
# Calculate offset
offset = ([offsetX + cosA * x1_data[x] + sinA * x2_data[x], offsetY - sinA * x1_data[x] + cosA * x2_data[x]])
# Find points for rectangle
p1 = (-sinA * h + offset[0], -cosA * h + offset[1])
p3 = (-cosA * w + offset[0], sinA * w + offset[1])
center = (0.5*(p1[0]+p3[0]), 0.5*(p1[1]+p3[1]))
detections.append((center, (w,h), -1*angle * 180.0 / math.pi))
confidences.append(float(score))
# Return detections and confidences
return [detections, confidences]
答案 0 :(得分:1)
paper包含输出格式图。除了以角度A之外,量框还沿逆时针方向旋转,而不是以通常的方式指定该框,而是将其指定为距偏移量(x,y)的一组距离(上,右,下和左) 。
请注意,scores
和geometry
的索引是y, x
,与offset
计算之下的任何逻辑相反。因此,要获得得分最高的y, x
的几何分量:
high_scores_yx = np.where(scores[0][0] >= np.max(scores[0][0]))
y, x = high_scores_yx[0][0], high_scores_yx[1][0]
h_upper, w_right, h_lower, w_left, A = geometry[0,:,y,x]
代码使用offset
存储矩形右下角的偏移量。由于它位于右下角,因此只需要w_right
和h_lower
,它们在代码中分别为x1_data
和x2_data
。
相对于原始偏移offsetX, offsetY
,右下角的位置取决于旋转角度。下面的虚线显示了轴的方向。从原始偏移到下底偏移的组件用紫色(水平)和紫色(垂直)标记。请注意,sin(A) * w_right
分量已减去 ,因为在此坐标系中,y
随高度减小而变大。
所以可以解释
offset = ([offsetX + cosA * x1_data[x] + sinA * x2_data[x], offsetY - sinA * x1_data[x] + cosA * x2_data[x]])
下一步:p1
和p3
分别是矩形的左下角和右上角,并考虑了旋转。 center
只是这两点的平均值。
最后,-1*angle * 180.0 / math.pi
将原始的逆时针弧度角转换为基于顺时针的度角(因此,最终输出角对于逆时针旋转的对象应为负)。这是为了与CV2 boxPoints
方法兼容,该方法用于: