Что означают значения «влево» и «вправо» в XML-файлах haar cascade? - PullRequest
6 голосов
/ 11 июня 2009

В файлах каскада haar OpenCV, каковы значения "left" и "right" и как это относится к значению "threshold"? Спасибо!

Просто для справки, вот структура файлов:

<haarcascade_frontalface_alt type_id="opencv-haar-classifier">
  <size>20 20</size>
  <stages>
    <_>
      <!-- stage 0 -->
      <trees>
        <_>
          <!-- tree 0 -->
          <_>
            <!-- root node -->
            <feature>
              <rects>
                <_>3 7 14 4 -1.</_>
                <_>3 9 14 2 2.</_></rects>
              <tilted>0</tilted></feature>
            <threshold>4.0141958743333817e-003</threshold>
            <left_val>0.0337941907346249</left_val>
            <right_val>0.8378106951713562</right_val></_></_>
        <_>

Ответы [ 4 ]

2 голосов
/ 13 ноября 2011

Пол, правда?

Я думаю, что left_val / right_val используется как:

sum_stage += (sum_feature < feature_threshold*stddev)?(left_val):(right_val)
2 голосов
/ 29 марта 2010

В исходном коде OpenCV вы найдете cvhaar.cpp, который дает некоторое представление о том, как работает каскад Хаара. К сожалению, это, по сути, не комментарий, и документация не сильно помогает. Вот мое понимание того, как это работает.

В функции icvEvalHidHaarClassifier() сумма вычисляется для функций одного CvHidHaarTreeNode.

Если эта сумма меньше порогового значения, за «левым» узлом следует, и процесс повторяется. В противном случае «правый» узел повторяется, снова повторяется. Это отражено в следующем утверждении:

idx = sum < t ? node->left : node->right;

Цикл прерывается, когда «левый» или «правый» узел имеет отрицательное значение. В этом случае сумма больше не вычисляется для этой функции, но пороговое значение для этой функции возвращается как результат классификатора.

Я ставлю «влево» и «вправо» в кавычках, потому что, как вы говорите, они не имеют ничего общего с положением объекта. Вместо этого они отражают, в каком направлении «падает» каскад: ниже порога каскад падает влево , выше порога падает вправо .

Давайте теперь вернемся к представлению этих узлов. В XML вы увидите представление узлов не в виде индексов, а в виде значений:

<left_val>0.0337941907346249</left_val>
<right_val>0.8378106951713562</right_val>

Эти числа на самом деле являются узлами имен , которые ищутся с помощью cvGetFileNodeByName(). Я не знаю точно, как это работает внутри OpenCV, но теперь я надеюсь, что у вас есть хотя бы лучшее представление о том, как работает каскад.

2 голосов
/ 23 июня 2009

«Влево» и «вправо» относятся к значениям градиента конкретной фигуры. Эти конкретные формы не являются конкретно левым и правым прямоугольниками. Вместо этого он просто ссылается на разделы определенной конфигурации (иногда более одного раздела, если их более 2). В статье Дэвида Хаара есть диаграмма, которая помогает объяснить это.

Вот представление ascii (= заполнено, - не заполнено):

====    ==--   =--=
====    ==--   =--=
----    ==--   =--=
----    ==--   =--=

В целом, именование - это плохое соглашение. Вместо этого его следует назвать «градиентный верх», «градиентный дно» (2), «градиентный левый», «градиентный правый» (2), «градиентный левый», «градиентный центр», «нижний градиент» (3), соответственно. Повернутые, ребра и другие фигуры должны быть названы так, чтобы однозначно идентифицировать сечения.

0 голосов
/ 28 сентября 2009

Насколько я понимаю, оригинальная статья Быстрое обнаружение объектов с использованием расширенного каскада простых функций Пола Виолы и Майкла Джонса Он основан на хаароподобных особенностях, отсюда и название. Я предлагаю взять его с веб-сайта IEEE . (Если у вас нет учетной записи, проверьте другие версии на Google Scholar .)

Классификаторы также описаны в Определение черт лица с помощью классификаторов Хаара (Уилсон, Фернандес). Вы можете найти его на веб-сайте ACM или на веб-сайте CSA .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...