【问题标题】:Face Detection - Filter overlapping windows人脸检测 - 过滤重叠窗口
【发布时间】:2016-05-19 11:26:13
【问题描述】:

我正在编写人脸检测算法,现在我有很多窗口检测到重叠。
如果center(windowA) in windowB or center(windowB) in windowA,我认为窗口是重叠的。

我的算法是:

resultList <- empty list
for each windowA detected
    handled <- False
    for each windowB in resultList
        if windowA and windowB are overlapping
            keep the window with bigger value
            handled <- True
            brick inner loop
    if not handled
        append windowA to resultList

但仍有一些重叠的窗口。因此,我将其扩展为:

resultList <- empty list
for each windowA detected
    handled <- False
    for each windowB in resultList
        if windowA and windowB are overlapping
            keep the window with bigger value
            handled <- True
            break inner loop
    if not handled
        append windowA to resultList
    for each windowB in resultList, starting from after windowA
        if windowA and windowB are overlapping
            if windowA has bigger value
                remove windowB
            else
                remove windowA and break

好多了,但仍然有一些重叠的窗口。
有没有一种已知的算法可以快速而好地完成它? (平凡的 O(n^2) 解决方案有点慢)
或者还有其他方法可以改进我的算法以使其完美运行?

【问题讨论】:

    标签: algorithm pseudocode overlap face-detection


    【解决方案1】:

    你的算法还是不行。

    考虑您考虑的前三个矩形的位置如下图所示:

    注意矩形的三个中心在其他矩形之外,所以前三个不重叠。

    现在想象第四个非常大的矩形出现了。它的中心在蓝色矩形中,它的值非常大。那么正确的做法是删除所有最初的三个矩形,但你不会。

    至于解决问题的快速方法:

    • 首先根据所有矩形的值(降序)对所有矩形进行排序,这样如果矩形与已放置的矩形重叠,您将永远不想放置矩形(注意:这里我指的是所有值都是不同的,但如果这不是真的,那么您必须详细说明最佳解决方案是什么)。
    • 现在您的任务转换为:“您按顺序迭代所有矩形,并且对新中心是否恰好位于任何放置的矩形内或矩形本身是否覆盖任何中心感兴趣”
    • 这会转化为两个问题:
      • A.任何一组点是否在新给定的矩形内
      • 乙。新点是否在任何给定的非相交矩形集内。

    问题 A 如果您将已选择的中心保留在两个点列表中(每个中心都存储在两个列表中),则可以优化。其中一个列表根据 X 坐标排序,另一个根据 Y 排序。您可以使用二分搜索选择矩形 X 坐标之间的 X 坐标和矩形 Y 坐标之间的 Y 坐标的中心。如果这两个集合有重叠 - 那么矩形中包含一个中心(注意:我已经说过列表,实际上维护中心的树集对您来说更理想)。

    问题 B: 再次分别求解 X 和 Y 坐标:您想知道哪些矩形的新点的 X 坐标介于其最小和最大 X 之间(与 Y 坐标相同)。在重叠的情况下 - 有一个包含新点的矩形。这个任务可以通过二叉索引树的适配来优化解决。

    请注意,我的两种解决方案的算法复杂性都比您建议的直接方法更差,但我希望它们在所有实际测试用例中都会得到相当大的优化。

    【讨论】:

    • 在您的示例中,使用我的第二种算法,大矩形将替换第一个小矩形,然后删除其余部分。我弄错了吗?
    • @Dubon 是的,误解了我的例子。考虑这三个顺序。它们都可以放置,因为它们不重叠。现在,第四个(甚至没有绘制)即将到来,它的中心位于蓝色区域,它必须替换所有三个。但是,您的算法不支持一次性删除多个矩形。
    • 这是第二个for each的目的。
    • @Dubon mhm 你是对的,我误读了你的休息时间。你应该很高兴,虽然可能有点慢。您平均检测到多少个矩形?
    • 我想有几百个
    【解决方案2】:

    我不知道问题出在哪里,但是有了这个新代码,它也能正常工作:

    result_list = empty list
    for each windowA detected
        found_better = False
        for each windowB in result_list
            if windowA and windowB are overlap
                if windowA is better
                    remove windowB from result_list
                else (so, windowB is better)
                    found_better = True
                    break inner loop
        if not found_better
            append windowA to result_list
    

    【讨论】:

      猜你喜欢
      • 2013-08-22
      • 2013-08-18
      • 2021-11-10
      • 2014-06-27
      • 1970-01-01
      • 2019-11-18
      • 2013-09-24
      • 2017-12-20
      • 2012-03-05
      相关资源
      最近更新 更多