Итак, ребята, пожалуйста, помогите мне с обнаружением / отслеживанием руки пользователя, который сидит за компьютером перед фронтальной камерой компьютера (ноутбука). Я пробовал эти методы:
- Обнаружение на основе цвета (я обнаружил человеческое лицо с помощью каскадного обнаружения лица 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.