OpenCV HOGDescripter Python

Мне было интересно, знает ли кто-нибудь, почему нет документации для HOGDescriptors в связываниях Python OpenCV.

Возможно, я только что пропустил их, но единственным из них, который я нашел из них, является этот поток: Получить функции изображения HOG из OpenCV + Python?

Если вы прокрутите вниз в этом потоке, этот код находится там:

import cv2
hog = cv2.HOGDescriptor()
im = cv2.imread(sample)
h = hog.compute(im)

Я протестировал это, и он работает - так что Python Bindings существуют, просто документации нет. Мне было интересно, знает ли кто-нибудь, почему документация для привязок Python для HOG настолько трудно найти/не существует. Кто-нибудь знает, есть ли учебник, который я могу прочитать где-нибудь в HOG (особенно с помощью Python Bindings)? Я новичок в HOG и хотел бы увидеть несколько примеров того, как работает OpenCV, прежде чем я начну писать свои собственные материалы.

Ответ 1

1. Получить встроенную документацию: Следующая команда на вашей консоли python поможет вам узнать структуру класса HOGDescriptor:

import cv2 help(cv2.HOGDescriptor())

2. Пример кода: Вот фрагмент кода для инициализации cv2.HOGDescriptor с различными параметрами (термины, которые я использую здесь, являются стандартными терминами, которые хорошо определены в документации OpenCV здесь):

import cv2
image = cv2.imread("test.jpg",0)
winSize = (64,64)
blockSize = (16,16)
blockStride = (8,8)
cellSize = (8,8)
nbins = 9
derivAperture = 1
winSigma = 4.
histogramNormType = 0
L2HysThreshold = 2.0000000000000001e-01
gammaCorrection = 0
nlevels = 64
hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins,derivAperture,winSigma,
                        histogramNormType,L2HysThreshold,gammaCorrection,nlevels)
#compute(img[, winStride[, padding[, locations]]]) -> descriptors
winStride = (8,8)
padding = (8,8)
locations = ((10,20),)
hist = hog.compute(image,winStride,padding,locations)

3. Обоснование: Результирующий дескриптор hog будет иметь размерность как:  9 ориентаций X (4 угловых блока, которые получают 1 нормализацию + 6x4 блоков по краям, которые получают 2 нормализации + 6x6 блоков, которые получают 4 нормализации) = 1764. поскольку я дал только одно местоположение для hog.compute().

4. Другой способ инициализации HOGDescriptor:
Еще один способ инициализации - из файла xml, который содержит все значения параметров:

hog = cv2.HOGDescriptor("hog.xml")

Чтобы получить файл xml, выполните следующие действия:

hog = cv2.HOGDescriptor()
hog.save("hog.xml")

и отредактируйте соответствующие значения параметров в файле xml.

Ответ 2

Мне тоже было интересно. Для OpenCV HOGDescriptor почти не существует документации, отличной от исходного кода cpp.

Scikit-image имеет хорошую примерную страницу по извлечению и иллюстрации функции HOG. Это альтернатива исследованию HOG. Это документировано здесь.

Тем не менее, есть одна вещь, чтобы указать на реализацию scikit-image hog. Его код Python для функции hog не использует взвешенное голосование для бинонинга ориентации гистограммы, но только делает простое бининг, основанное на значении величины, попадающем в бит. Смотрите функцию hog_histogram. Это не точная бумага Далала и Триггса.

На самом деле, я обнаружил, что обнаружение объектов на основе реализации HOG с OpenCV более точно, чем с api из scikit-изображения. Это имеет смысл для меня, потому что взвешенное голосование важно. Путем приведения взвешенных голосов к ячейкам вариация гистограммы значительно уменьшается, когда градиентная величина падает на границу или вокруг нее. Крис Маккормик написал очень проницательный блог о свинге, в котором ориентация бининга четко описана как

Для каждого вектора градиента его вклад в гистограмму определяется величиной вектора (так что более сильные градиенты оказывают большее влияние на гистограмму). Мы разделили вклад между двумя ближайшими бункерами. Так, например, если вектор градиента имеет угол 85 градусов, то мы добавим 1/4 от его величины в бункер с центром в 70 градусов и 3/4-й от его величины до бункера, центрированного на 90.

Я считаю, что цель расщепления вклада состоит в том, чтобы свести к минимуму проблему градиентов, находящихся на границе между двумя ячейками. В противном случае, если бы сильный градиент находился прямо на краю бункера, небольшое изменение угла градиента (которое подталкивает градиент в следующий бит) могло бы оказать сильное влияние на гистограмму.

Итак, используйте OpenCV, чтобы, если возможно, вычислить свиньи (не выкопали в свой код и не хотели этого делать, но я полагаю, что реализация OpenCV для реализации hog более уместна). Не только я нашел улучшение точности обнаружения, но и ускорился. По сравнению с scikit-image hog code с замечательными комментариями, его документации почти нет. Тем не менее по-прежнему возможно, что можно получить версию OpenCV на практике - это вопрос передачи правильного параметра для размера окна, размера ячейки, размера блока, шага блока, количества ориентаций и т.д. Другие параметры, которые я только что пошел со значением по умолчанию.