Line Segment Detection Using Transformers without Edges -- 基于 transformer 的端到端线段检测

Paper name

Line Segment Detection Using Transformers without Edges

Paper Reading Note

URL: https://arxiv.org/pdf/2101.01909.pdf

TL;DR


Introduction

Background

  • 线段检测对于中层视觉任务十分有效,比如分割、三维重建、图片匹配与配准、深度估计、场景理解、目标检测、图像编辑和形状分析等任务。
  • 尽管密集像素级别的边缘检测以及实现了不错的效果,但是提取出具有语义和感知意义的线段仍然具有挑战,因为自然场景中的感兴趣的线段通常在杂乱的背景中具有局部模糊或遮挡的异质结构。基于形态学算子的方法的线段提取一般是次优解,其他如格式塔定律与语境信息等中层表示在感知聚类中重要性很强,但是难以集成到端到端的线段检测算法中。目前已有的深度学习方法也都包含了启发式引导模块,比如边缘、连接、区域检测等,线组合和后处理,限制了线检测性能提升及进一步发展。

Related Works

  • 传统方法:
    • 基于梯度的边缘检测,然后通过感知聚类(perceptual grouping)来自下而上地聚合低级别线索形成线段
    • 霍夫变换方法:统计参数空间中的投票结果来检测线段
  • NN based 方法:
    • junction-based pipelines:基于 junction proposal module 先检测得到 junction heatmap,然后将检测到的交叉节点转换到线proposals,然后再通过一个线段验证分类模型来移除 false-positive 线段。这些方法都依赖于一个很好的交叉点检测结果
    • dense prediction 加后处理:AFM 基于 NN 提出一个中间表示特征图,其中包含指向关联线的二维投影向量,然后再用一个 squeeze module 从上述特征图恢复出矢量化线段,但这些方法一般效果较差

Summary

  • 所以作者提出了一种基于 transformer 的端到端线段检测网络,主要算法流程就是在 DETR 基础加上部分改进,文章主要贡献如下:
    • 设计一种端到端的线段检测算法,无需边缘、连接、区域检测和启发式引导的视觉编组过程,在 Wireframe 和 YorkUrban 数据集上取得了 SOTA 效果
    • 使用 transformer 进行线段检测,实现了通过一个整体的 encoder-decoder、self attention、joint query inference 来实现tokenized entity 建模、感知聚类、联合检测。
    • 在 DETR 基础上提供了两个算法创新:
      • 一个多尺度的encoder/decoder 策略
      • 提出了直线端点的距离损失

在这里插入图片描述


Dataset/Algorithm/Model/Experiment Detail

在这里插入图片描述

数据集
  • ShanghaiTech Wireframe dataset
    • 5000 训练数据和 462 测试图片
    • 主要是室内场景
  • YorkUrban
    • 102 张测试图片,包括室内和室外场景
  • 数据增广主要有随机水平/垂直翻转、随机 resize、crop 和图片色彩抖动。
  • 训练阶段将图片随机 resize 到短边在 480-800 范围内,最大长边不超过 1333, 在测试阶段,将图片resize到短边至少有 1100
实现方式
  • 传统的目标检测用于线段检测可以采用将 bounding box 的对角线表示为线段,但对于几乎与坐标轴平行的线段会有与预设定 anchor 差异过大的问题。
    在这里插入图片描述

  • 作者设计的 LETR 分为4个检测步骤

    • 图像特征提取:图片经过 resnet50 或 resnet101 之类的网络后生成 x ∈ R H ∗ W ∗ C x \in \mathbb{R}^{H*W*C} xRHWC 的特征图,然后与位置编码 concat
    • 图像特征编码:flatten 后的 x ∈ R H W ∗ C x \in \mathbb{R}^{HW*C} xRHWC 的特征会被编码为 x ′ ∈ R H W ∗ C x^{'} \in \mathbb{R}^{HW*C} xRHWC,童工一个 multi-head self-attention module 和一个 fead forward network module 接着一个标准的 transformer encoder 结构
    • 线段检测:在 transformer 的解码网络中,N 个可学习的线段实体 l ∈ R N ∗ C l \in \mathbb{R}^{N*C} lRNC 通过 cross-attention module 的输出交互得到
    • 线段预测:线段实体(line entity) l l l 从 transformer 的 decoder 出来后会送入两个预测头: 线段坐标会经过一个 3 层的 multi-layer perceptron(MLP)预测加一个 Sigmoid 得到;线段预测置信度会经过一个线性层预测得到
  • 训练得到的 line entity 每个会关注不同的区域、长度和旋转角,如下图第一行的 line entity 关注的是图像中间的横线,第二行的 line entity 关注的是不同长度的垂直的线段
    在这里插入图片描述

  • Coarse-to-Fine Strategy

    • 和目标检测不一样的是线段定位对于端点位置准确性要求较高,这里设计了一种分两个 stage 训练的 coarse-to-fine 的网络结构
    • Coarse decoding: encoder-decoder 结构使用了 resnet 的 Conv5( 1 32 \frac{1}{32} 321下采样)特征作为 transformer 的输入
    • fine decoding: fine decoder 继承了 coarse decoder 的 line entities 输出和高分辨率的特征(resnet 的 Conv4( 1 16 \frac{1}{16} 161下采样))
  • 二分图匹配(匈牙利算法): 因为训练过程中设定的预测 line entities 数量一般大于线段的 gt 数量,所以需要利用二分图匹配将预测的线段分配到对应的 gt 线段上用于计算损失;匹配的损失通过预测线段与 gt 线段的 L1 距离和预测线段的置信度来衡量

  • 线段检测损失设计
    由分类损失与距离损失组成
    在这里插入图片描述

    • 分类损失:就是普通的交叉熵损失,考虑到难样本在训练后期随着学习率降低优化困难,引入了 focal loss
      在这里插入图片描述
    • 距离损失:直接是 L1 距离损失
      在这里插入图片描述
实验结果
  • 评价指标

    • 两个在 LSD 任务中常用的 heatmap-based 指标: A P H AP^{H} APH and F H F^{H} FH,预测和 gt 都先通过栅格化转换到 heatmaps,然后通过对比每个 pixel 的置信度生成 precision-recall 曲线,然后计算出以上指标
    • Structural Average Precision (sAP) :这是 L-CNN 提出的指标。对于预测的线段( L ′ L^{'} L)和 gt 线段( L L L),通过 L2 距离小于预设定阈值(10,15 pixel)来将预测线段匹配到 gt 线段上;对于匹配到 L L L 的线段,选择置信度最高的作为 TP,其他的作为 FP;如果 L L L 没有匹配到的预测线段,这个会被视为 FN;对于没有与任何 gt 线段( L L L)匹配的预测线段( L ′ L^{'} L)会被视为 FP。不同置信度阈值计算得到的 precision-recall 曲线能够用于计算 sAP,为了更平衡的指标,作者也是用了 sAP 的 F-score,标记为 sF
  • 效果上大部分指标超过了所有传统算法
    在这里插入图片描述
    在这里插入图片描述

  • 明显超过了 Faster RCNN 和 naive 的 DETR
    在这里插入图片描述

  • 多阶段训练的有效性
    在这里插入图片描述

  • 一些多 stage 和单 stage 的消融实验,看起来 transformer 的层数还能稍微降低一些
    在这里插入图片描述

  • 测试阶段上采样带来的精度提升,LETR 对于高分辨率的上采样能够获得更大的收益
    在这里插入图片描述

  • 预训练的重要性,可以看出来使用在 COCO 上预训练的 DETR 的权重还是十分重要的,因为wireframe数据量较少

  • coarse-to-fine 的解码过程的 attention heatmaps 可视化,可以看到 Fine 阶段的图像空间有更多的细节关联
    在这里插入图片描述

Thoughts

  • cvpr 的 oral 文章实验扎实程度还是毋庸置疑的,评价指标和实验的设定都值得参考
  • 对于 transformer 来说,多 stage 的训练方式十分耗时,如果能够优化成单 stage 训练有接近的精度也是一个研究方向
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import cv2 as cv import numpy as np #直线检测 #使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成 #标准霍夫线变换 def line_detection(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) edges = cv.Canny(gray, 50, 150) #apertureSize参数默认其实就是3 cv.imshow("edges", edges) #cv.HoughLines参数设置:参数1,灰度图像;参数二,以像素为单位的距离精度(一般都是1,进度高,但是速度会慢一点) #参数三,以弧度为单位的角度精度(一般是1rad);参数四,阈值,大于阈值threshold的线段才可以被检测通过并返回到结果中 #该函数返回值为rho与theta lines = cv.HoughLines(edges, 1, np.pi/180, 200) for line in lines: rho, theta = line[0] #line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的。 a = np.cos(theta) #theta是弧度 b = np.sin(theta) x0 = a * rho #代表x = r * cos(theta) y0 = b * rho #代表y = r * sin(theta) x1 = int(x0 + 1000 * (-b)) #计算直线起点横坐标 y1 = int(y0 + 1000 * a) #计算起始起点纵坐标 x2 = int(x0 - 1000 * (-b)) #计算直线终点横坐标 y2 = int(y0 - 1000 * a) #计算直线终点纵坐标 注:这里的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长 cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) #点的坐标必须是元组,不能是列表。 cv.imshow("image-lines", image) #统计概率霍夫线变换 def line_detect_possible_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) edges = cv.Canny(gray, 50, 150, apertureSize=3) # apertureSize参数默认其实就是3 lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5) for line in lines: x1, y1, x2, y2 = line[0] cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) cv.imshow("line_detect_possible_demo",image) src = cv.imread("E:/opencv/picture/track.jpg") print(src.shape) cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) cv.imshow('input_image', src) line_detection(src) src = cv.imread("E:/opencv/picture/track.jpg") #调用上一个函数后,会把传入的src数组改变,所以调用下一个函数时,要重新读取图片 line_detect_possible_demo(src) cv.waitKey(0) cv.destroyAllWindows() 霍夫检测直线原理: 关于hough变换,核心以及难点就是关于就是有原始空间到参数空间的变换上。以直线检测为例,假设有一条直线L,原点到该直线的垂直距离为p,垂线与x轴夹角为θθ,那么这条直线是唯一的,且直线的方程为 ρ=xcosθ+ysinθρ=xcosθ+ysinθ, 如下图所

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值