Методы обнаружения и отслеживания рук

Итак, ребята, пожалуйста, помогите мне с обнаружением / отслеживанием руки пользователя, который сидит за компьютером перед фронтальной камерой компьютера (ноутбука). Я пробовал эти методы:

  • Обнаружение на основе цвета (я обнаружил человеческое лицо с помощью каскадного обнаружения лица opencv haar и извлек диапазоны HSV кожи. В следующем я нашел объекты с цветом кожи. Например, лицо Я могу удалить, зная распознавание лиц каскадом волос, но как насчет других частей человеческого тела и фоновых объектов с цветом кожи, если мне нужна только рука? Как сделать этот алгоритм более стабильным для освещения?)
  • Обучить собственный каскадный классификатор хаара (я обучил свой собственный каскад распознавать руку, используя 3,5 тыс. положительных и 4 тыс. отрицательных фотографий. На обучение потребовалось 3 дня. Набор данных довольно богат (различные конфигурации и ориентации рук , условия освещения, разные фоны). Работает неплохо, но очень медленно из-за того, что я установил scaleFactor=1.3 и minNeighbors=70. Если я уменьшу minNeighbors, количество ложных срабатываний будет значительно увеличиваться, а маленькие реакционные углы будут охватывать весь видеокадр. Параметры обучения: opencv_traincascade -data data -vec samples.vec -bg neg.txt -numStages 16 -minhitrate 0.999 -maxFalseAlarmRate 0.5 -numPos 3200 -numNeg 3900 -w 24 -h 24 -mode ALL -precalcValBufSize 1024`` -precalcIdxBufSize 1024
  • Обучение каскадного классификатора LBP (обучение было быстрее, чем каскад HARA, и обнаружение работает ближе к реальному времени, но этот метод обнаружения имеет много ошибок) Параметры обучения: opencv_traincascade -data lbp -vec samples.vec -bg neg.txt -numStages 25 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 3200 -numNeg 3900 -w 24 -h 24 -mode ALL -precalcValBufSize 4096 -precalcIdxBufSize 4096 -featureType LBP Я пробовал разные значения numStages от 16 до 25 .

  • Алгоритм Camshift для отслеживания рук. Исходный код находится здесь http://pastebin.com/q5zK8cZt. Как это работает? Просто нужно отметить 4 точки вокруг обнаруженного объекта, и этот алгоритм должен отслеживать его и рисовать прямоугольник. Проблема в том, что если я начал двигать рукой, этот прямоугольник начинает расти и покрывать весь видеокадр. Похоже, этот алгоритм работает только для небольших объектов (или объекты находятся на большом расстоянии от камеры)

Может мне нужно смешать эти методы или вы предложите другой? Может мне нужно обучить нейросеть например YOLO? У меня нет желания это делать, потому что это занимает слишком много времени и приходится арендовать серверы на базе GPU.


person timKa    schedule 17.03.2017    source источник
comment
Вы уже видели случайные леса? Вот несколько интересных ссылок: github.com/kjw0612/   -  person Ben    schedule 17.03.2017


Ответы (1)


Серверы GPU? Нет, нет: существует веб-серверная часть для распознавания объектов. Если вы хотите использовать Yolo, вам нужно будет отметить огромный набор изображений поездов (около 2000 на класс). Я могу посоветовать загрузить изображения с здесь, используя такой сценарий

(function(global) {
  const next = () => Array.from(document.querySelectorAll('.search-pagination__button-text'))[1].click();
  const uuid = () => Math.random().toString(36).substring(7);
  const sleep = (timeout = 5000) => new Promise((res) => setTimeout(() => res(), timeout));
  global.urls = [];
  global.next = () => next();
  global.start = async () => {
    for (let i = 0; i !== 81; i++) {
        window.scrollTo(0,document.body.scrollHeight);
        await sleep(5000);
        document.querySelectorAll('.search-content__gallery-results figure > img[src]').forEach(({src}) => global.urls.push(src));
        next();
        await sleep(5000);
    }
  };
})(window);

После этого нужно отметить на изображениях ограниченные прямоугольники объектов. Существует онлайн-инструмент, который работает прямо в вашем веб-браузере.

введите описание изображения здесь

Для обучения нейронной сети следуйте этой инструкции, двоичные файлы также можно взять здесь.

person Petr Tripolsky    schedule 14.06.2020