Комментарии 14
Core i5 9400F — 59ms
Core i7 7500U — 108ms
Core i7 3770 — 110ms
GeForce GTX 1060 6Gb — 154ms
GeForce GTX 1050 2Gb — 199ms
Core i7 3770, ubuntu 18.04 with OpenCV from OpenVINO — 67ms
Intel Neural Compute Stick 2, ubuntu 18.04 with opencv from OpenVINO — 349
Короче решил на видеокартах остановиться, чтобы поцессор не нагружать. Intel Neural Compute stick ваш все-таки больше для всяких Raspberry Pi, насколько я понял.
Крайне удивило, что процессоры так хорошо работают по сравнению с видеокартами.
Еще не понял, почему старый Corei7 3770 работает горазо лучше через OpenVino. Вы там какое-то графическое ядро к вычислениям подключаете?
Рекомендую посмотреть в сторону асинхронного запуска сети на стике. Для face detection сети из OpenCV (SSD, 300x300), синхронное использование стика даёт около 26FPS, асинхронное — 53FPS (смотрите https://github.com/opencv/opencv/pull/14516).
Не рассматривали вариант с iGPU? С half precision floating point (DNN_TARGET_OPENCL_FP16 в терминах OpenCV) обычно быстрее чем CPU.
Еще не понял, почему старый Corei7 3770 работает горазо лучше через OpenVino. Вы там какое-то графическое ядро к вычислениям подключаете?
У OpenVINO внутри mkl-dnn для CPU. Все вычисления честно на CPU.
Видео для примера взято было из ютуба (самая проблема найти видео без всяких демонстраций распознавания). Распознавание пола и возраста тут да, крутятся на процессоре. Полностью на FPGA запустить не вышло, т.к. прямую обработку видео оно не умеет. Использовалось OpenVino 2018 R5. Одна из плат, которую мучал, разработана в РФ.
Так посмотрите, какие у меня GPU — очень слабенькие по сравнению с тем, что используется в тестах на сайте нвидии. У меня код вот на этом примере основан — https://github.com/hybridgroup/gocv/blob/master/cmd/ssd-facedetect/main.go
Только там размер картинки image.Pt(128, 96) — у меня 800x533 в приведенных тестах было. Но там от размера картинки соотношение скоростей не сильно зависит. Модель caffe взял ту же, из примера.
Инициализация, один раз делается
d.net = gocv.ReadNet(protoFile, modelFile)
if d.net.Empty() {
return nil, fmt.Errorf("Error loading model and proto files")
}
if err := d.net.SetPreferableBackend(gocv.NetBackendDefault); err != nil {
return nil, errors.Wrap(err, "Set GPU backend")
}
targetType := gocv.NetTargetCPU
if _, err := os.Stat("/proc/driver/nvidia/gpus"); err == nil {
targetType = gocv.NetTargetFP16
}
if err := d.net.SetPreferableTarget(targetType); err != nil {
return nil, errors.Wrap(err, "Set Target type")
}
И поиск:
W := float32(img.Cols())
H := float32(img.Rows())
blob := gocv.BlobFromImage(img, 1.0, image.Pt(300, 300), gocv.NewScalar(104.0, 177.0, 123.0, 0), false, false)
defer blob.Close()
d.net.SetInput(blob, "data")
detBlob := d.net.Forward("detection_out")
defer detBlob.Close()
detections := gocv.GetBlobChannel(detBlob, 0, 0)
defer detections.Close()
rects := []image.Rectangle{}
for r := 0; r < detections.Rows(); r++ {
confidence := detections.GetFloatAt(r, 2)
left := detections.GetFloatAt(r, 3) * W
top := detections.GetFloatAt(r, 4) * H
right := detections.GetFloatAt(r, 5) * W
bottom := detections.GetFloatAt(r, 6) * H
if confidence < 0.8 {
continue
}
r := image.Rectangle{
Min: image.Point{int(left), int(top)},
Max: image.Point{int(right), int(bottom)},
}.Canon()
if (r.Min.X < 0 && r.Max.X < 0) || (r.Min.Y < 0 && r.Max.Y < 0) || (float32(r.Min.X) > W && float32(r.Max.X) > W) || (float32(r.Min.Y) > H && float32(r.Max.X) > H) {
continue
}
rects = append(rects, r)
}
Расскажите, почему перестали развивать cuda модули? Ведь сейчас обработка изображений все больше переезжает на gpu.
Вопрос в поддержке. CUDA модули были перенесены в opencv_contrib, в котором требования к изменениям более гибкие, чем в главном репозитории. Тестирование проводится, а вот развитие — уже на стороне заинтересованных пользователей. С 4.0.0 тем не менее 12 коммитов есть (git rev-list -v --no-merges d511587..2c32791 modules/cud*
).
BTW, для dnn этим летом, вероятно, появится поддержка CUDA backend (в рамках Google Summer of Code): https://github.com/opencv/opencv/issues/14585.
OpenCV 4.0 и 4.1 — что нового?