Вложенные циклы обнаружения изображений могут длиться 100 миллионов раз - PullRequest
1 голос
/ 05 мая 2019

Я делаю некоторую работу для дипломной работы и должен попробовать некоторые фильтры на различных изображениях и посмотреть, обнаружен ли объект.Все работает само по себе, но я намеревался постепенно применять 100 различных степеней каждого из 4 фильтров (контрастность, размытость и т. Д.) К кадру и видеть, где он перестает правильно распознаваться.

Я бы скомбинировал их, например, сначала импортируется какое-то изображение в кадр, затем я пытаюсь определить его, добавив контраст «0%», «0%» размытие, «0%», изменение размера, «0%»."шум, следующий раунд 1% контраста, другие все 0%, затем 2% контраста, другие 0% и так далее до 100% контраста.Следующий цикл должен сделать то же самое, но с размытием 1%, изменением размера 0%, шумом 0%.Затем 2% размытия, 0%, 0% и т. Д. - все виды комбинаций.

Но это означает, что необходимо выполнить 100 ^ 4 итерации (100 миллионов, если я хочу 100 градусов и 4 фильтра).А моя текущая реализация YOLOv3-320 с OpenCV выполняет обнаружение со скоростью около 0,5 секунды.Это означает, что для завершения одного снимка потребуется около 580 дней.

def tester(depth, correct_answer):
container_a = []

for a in range(depth):
    print((a*(100/depth)))
    frame1 = apply_sepia(frame, int((a*(100/depth))))
    container_b = []

    for b in range(depth):
        frame2 = apply_blur(frame1, int((b*(100/depth))))
        container_c = []

        for c in range(depth):
            frame3 = sp_noise(frame2, int((c*(100/depth))))
            container_d = []

            for d in range(depth):
                frame4 = image_resize(frame3, int((d*(100/depth))))

                try:
                    net.setInput(cv.dnn.blobFromImage(frame4, 1/255, (vers, vers), [0,0,0], 1, crop=False))
                    result = postprocess(net.forward(getOutputsNames(net)))

                    if result == correct_answer:
                        container_d.append(1)
                    else:
                        container_d.append(0)

                except Exception as e:
                    container_d.append(0)

            container_c.append(container_d)

        container_b.append(container_c)

    container_a.append(container_b)

return container_a

Как я могу ускорить это?

1 Ответ

3 голосов
/ 05 мая 2019

Я поставлю это как ответ, чтобы иметь немного больше места, чтобы проиллюстрировать мою точку зрения.

Я использую термин «высокое разрешение параметра», чтобы описать итерацию по вашему параметру небольшими шагами.

Предположим, ваш алгоритм дает сбой при 18% -ном шуме, а шум - это единственное, чем вы являетесьменяющийся.

Затем, с шагом в 1%, ваш девятый объект не сможет обнаружить объект на 19-й итерации вашего прогона.

Скрининг с большими шагами, например 10%, вызовет ваш алгоритмпотерпеть неудачу в третьей итерации, когда вы тестируете 20% шума.Затем вы знаете, что ваш алгоритм дает сбой между 10% и 20% шума.Теперь вы можете использовать что-то вроде bisection и спросить, не работает ли алгоритм выше или ниже 15%, а после этого - выше или ниже 17,5%.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...