Лучший подход: как обнаружить объекты, которые имеют мало функций, но объединяются в группы - PullRequest
3 голосов
/ 11 мая 2019

Моя проблема очень похожа на обнаружение птиц, летящих в стае .Объекты имеют мало функций, могут быть расположены под разными углами на изображениях.Объекты могут располагаться довольно редко в группе (не в виде регулярной сетки), но они никогда не пересекаются.Я попробовал YoloV3 : в начале, когда у меня было <30 тренировочных образов, это работало довольно хорошо (<strong> перегружено , но по крайней мере это работало для тренировочных образов).Поскольку я увеличил количество тренировочных образов, он перестал работать, сеть не запоминает данные ( недостаточно ).Я думаю, что главная проблема в том, что объектам не хватает возможностей для CNN , то есть отдельные объекты слишком просты.Я хотел как-то использовать тот факт, что они всегда приходят группами, то есть как-то считать соседей .Их может быть разное количество в группах, по крайней мере, 3, но в основном> 10. Они могут выглядеть по-разному (как птицы с разным расположением крыльев), но размер всех объектов в группе примерно одинаков.Я новичок в нейронных сетях, так что, возможно, кто-то с большим опытом может указать мне правильное направление.

Я пытался использовать сопоставление шаблонов из OpenCV : я должен использовать много шаблонов (> 20), потому что объекты могут выглядеть совершенно по-разному (разные позиции крыльев);а также требуется многомасштабное сопоставление, которое занимает много времени выполнения.Но более важно то, что при разных настройках сопоставление с шаблоном находит либо слишком мало объектов, либо слишком много ложных срабатываний.Поэтому я думаю, что нейронные сети лучше подходят для этой задачи.Пожалуйста, поправьте меня, если я ошибаюсь.Я подумал, что, может быть, имеет смысл замаскировать «полезные» области с помощью прохода через Mask-RCNN , а затем каким-то образом отделить объекты в этих областях (потому что я должен пометить их отдельно для пользователя).Может ли это сработать, или, может быть, есть другие способы, которыми я мог бы попробовать?Любые советы будут с благодарностью!

РЕДАКТИРОВАТЬ: У меня также есть много других объектов на изображениях (не только небо и птицы), например, как деревья.И листья или группы листьев дают ложные срабатывания.Они могут быть разного цвета (зеленый, оранжевый, темно-зеленый, черный), поэтому их фильтрация по цвету вряд ли возможна.

flock of birds trees

1 Ответ

4 голосов
/ 11 мая 2019

Цитата из YOLO вступительная статья :

2,4. Ограничения YOLO

YOLO накладывает строгие пространственные ограничения на предсказания ограничивающего прямоугольника, поскольку каждая ячейка сетки предсказывает только два прямоугольника и может иметь только один класс. Это пространственное ограничение ограничивает количество близлежащих объектов, которые может предсказать наша модель. Наша модель борется с небольшими объектами, которые появляются в группах, например стаями птиц.

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

Будет проблематично распознать очень маленькие объекты на больших изображениях с высоким разрешением, поскольку YOLOv3 уменьшит их до 416x416 (или 320x320, если вы используете разрешение YOLOv3 320 ). Вы можете подавать YOLOv3 области изображения, если оно слишком большое. Или вы можете найти некоторые существующие решения для таких случаев.

В этой статье парни объединили детектор на основе CNN с полностью сверточной сетью и семантической сегментацией на основе суперпикселей, используя машины опорных векторов для достижения высокой производительности при обнаружении небольших объектов на больших изображениях. Они утверждают, что достигли высокой точности обнаружения.


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

Вы можете попытаться обнаружить стадо по высокому цветовому контрасту между птицами и небом. Обычно птицы выглядят намного темнее на фоне неба. Для этого вам могут пригодиться этот и этот этот документ OpenCV о пороге изображения.

int main(){
    Mat src = imread("1.jpg");
    Mat gray;
    cvtColor(src, gray, CV_BGR2GRAY);
    Mat thresholded;
    threshold(gray, thresholded, 100, 255, CV_THRESH_BINARY_INV);
    imwrite("2.jpg", thresholded);
    return 0;
}

Я получил это:

My

Теперь вы можете извлекать капли белой птицы с помощью findContours() или SimpleBlobDetector (и сопоставлять их с шаблонами или делать дополнительное распознавание / классификацию, если это требуется).

...