Перейти к содержимому
Compvision.ru
Dreiko

Структура каскада классификаторов

Recommended Posts

Всем привет!

Интересует такой вопрос: есть ли где подробное описание структуры каскада классификаторов, который генерируется в xml файл? Т.е. где бы подробно расписывалось, за что отвечают такие поля, как <feature,<rects>, <tilted, <threshold>, <left_node>/<right_node>, <right_val>/<left_val> и по какому принципу они построены, а так же по какому принципу строятся деревья из features. Если такой статьи не существует, буду очень благодарен, если вкратце объясните.

*небольшой пример каскада для наглядности

<opencv_storage>

<k7000 type_id="opencv-haar-classifier">

  <size>20 20</size>

  <stages>

    <_>

      <!-- stage 0 -->

      <trees>

        <_>

          <!-- tree 0 -->

          <_>

            <!-- root node -->

            <feature>

              <rects>

                <_>

                  15 1 5 4 -1.</_>

                <_>

                  15 1 5 2 2.</_>

              </rects>

              <tilted>1</tilted>

            </feature>

            <threshold>3.4818891435861588e-02</threshold>

            <left_node>1</left_node>

            <right_val>8.3950102329254150e-01</right_val>

          </_>

          <_>

            <!-- node 1 -->

            <feature>

              <rects>

                <_>

                  1 0 4 1 -1.</_>

                <_>

                  1 0 2 1 2.</_>

              </rects>

              <tilted>1</tilted>

            </feature>

            <threshold>-2.5486640632152557e-02</threshold>

            <left_val>8.3647841215133667e-01</left_val>

            <right_val>-7.6984202861785889e-01</right_val>

          </_>

      </_>

    

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Прочитайте:

http://www.compvision.ru/forum/index.php?app=core&module=attach&section=attach&attach_id=369

и

http://www.compvision.ru/forum/index.php?app=core&module=attach&section=attach&attach_id=384

Думаю многое прояснится.

ЗЫ: Со структурой xml не разбирался. Но пороги слабых классификаторов явно видно (скорее всего CART дерево).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо,частично разобрался...Остальное буду сам докуривать=)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Dreiko , можешь вкратце сказать,что ты понял в структуре xml ?у меня такой же вопрос.как выглядит конкретный rects, почему их два или иногда три, что значит tilted (повернутый?куда ?)как считается значение,сравниваемое с порогом ,примерно ясно, хотел бы уточнить.и главное,где искать в файле узел -7.6984202861785889e-01, если это уникальное значение.и когда заканчивать путешествие по файлу,когда разница с порогом совсем мала ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Отвечу по порядку про все что сам понял, а потом в ответ тоже пару вопросов задам =)

1) rects(два или три) описывают одну из feature(хз как тут по русски это называют, я зову примитивами для простоты) каждая строчка строится по принципу

<координата верхней левой точки прямоугольника по х> <координата верхней левой точки прямоугольника по y> <длина по x> <длина по y> <множитель,на который умножается значение,полученное из данного квадрата>

на счет последнего пункта до конца не уверен, но крайне похоже,что так оно и есть. Сами же примитивы объявляются в cvhaartraining.cpp в icvCreateIntHaarFeatures.

2)количество rects в описании зависит от типа примитива:для описания "горизонтального" или "вертикального" (которые делят исследуемую область на 2 равные части) достаточно двух, а для описания "диагонального" примитива необходимо 3 rect'a. (если объяснил не совсем понятно, могу расписать чуть подробнее с рисунком,сейчас просто не совсем удобно это делать)

3)флаг tilted, как видно из его название, отвечает за "повернутость" примитива ;) Просто при обучении мы используем помимо обычных примитивов еще и повернутые на 45 градусов, и этот флаг как раз и отвечает за индикацию "повернутости" примитива в каскаде.

4)путешествие по файлу, по идее, заканчивает, когда мы пробегаем всеми уровнями каскада по всему изображению.

А теперь 2 вопроса от меня:

1)как по твоему происходит подсчет значения, сравниваемого с порогом?

2)что ты имел ввиду,когда спрашивал "где искать в файле узел -7.6984202861785889e-01, если это уникальное значение" и зачем его искать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

спасибо,много понял.отвечаю на твои вопросы

А теперь 2 вопроса от меня:

1)как по твоему происходит подсчет значения, сравниваемого с порогом?

из суммы яркостей пикселей под черными точками примитива вычитаем такую же сумму под белыми.судя по тому,что значение меньше 1,вероятно,оно потом делится

на общую сумму,то есть получается относительная разность

2)что ты имел ввиду,когда спрашивал "где искать в файле узел -7.6984202861785889e-01, если это уникальное значение" и зачем его искать?о

в xml есть тег left_val -путь куда идти,если значение ниже порога,и right_val если выше.а значение val это дробное число,например -7.6984202861785889e-01.и неясно,как это число связано с тегом,куда надо идти.

In the source code of OpenCV, you will find cvhaar.cpp that gives some insight into how Haar cascade works. Unfortunately, this is essentially no commentary, nor does the documentation help much. Here's my understanding of how it works.

In the function icvEvalHidHaarClassifier(), the sum is computed for the the features of a single CvHidHaarTreeNode.

If this sum is less than the threshold, the "left" node is followed, and the process is repeated. Otherwise, the "right" node is followed, again repeating. This is reflected by the following statement:

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

The loop is broken when the "left" or "right" node is a negative value. In this case, the sum is no longer computed for this feature, but the threshold value for that feature is returned as the result of the classifier.

I put "left" and "right" in quotes because, as you say, they have nothing to do with the feature position. Instead, they reflect which way the cascade "falls": below the threshold, the cascade falls left, above the threshold, it falls right.

Let us now step back to the representation of these nodes. In the XML, you will see the representation of the nodes not as indexes, but as values:

<left_val>0.0337941907346249</left_val>

<right_val>0.8378106951713562</right_val>

These numbers are in fact node names that are looked up using cvGetFileNodeByName(). I don't know exactly how this works inside OpenCV, but now I hope you at least have a better idea how the cascade works.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Dreiko ,ты форум читаешь ?я так и не понял,как перейти на другой узел по left_val и right_val.и сделать рисунок для примитивов можешь ?мне не ясно,какой примитив описывается тремя rects

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сори, выходные были напряженные, да и понедельник тоже тяжелый, только появилась свободная минута.

Как перейти по left_val и right_val я сам еще не разобрался.Остается надеяться, что кто-нибудь еще подскажет, ну или докуривать самому =)

Примитив, описывающийся тремя rects я постарался изобразить на картинке ниже (эх не вышел из меня Малевич =) )

image-2AA0_4E1B5CF9.jpg

Примера с ним в своих каскадах я не нашел, но описывается в коде он так:

haarFeature = cvHaarFeature( "haar_x2_y2",

                     x   , y,    dx*2, dy*2, -1,

                     x   , y   , dx  , dy,   +2,

                     x+dx, y+dy, dx  , dy,   +2 );

Т.е. в строчке x, y, dx*2, dy*2, -1 мы описываем большой белый квадрат размером с весь примитив прибавляем его сумму,умноженную на (-1) (то бишь вычитаем)

Во второй строчке x, y, dx, dy, +2 считаем верхний левый черный квадрат,и прибавляем его сумму, умноженную на 2(1 раз прибавляем за сам квадрат,а второй раз для того,чтобы компенсировать то,что было вычтено при вычитании суммы большого белого квадрата)

3 строка аналогична второй,только для нижнего правого черного квадрата.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×