Оптимизация программ на базе OpenCV на минимальных встроенных системах Linux

Я создаю свою собственную ОС Embedded Linux для Raspberry PI3, используя Buildroot. Эта ОС будет использоваться для обработки нескольких приложений, одно из которых выполняет обнаружение объектов на основе OpenCV (v3.3.0).

Я начал с Raspbian Jessy + Python, но оказалось, что выполнение простого примера занимает много времени, поэтому я решил создать собственную ОСРВ с использованием Optimized + C ++ вместо Python.

Я думал, что с этими оптимизациями 4 ядра RPI + 1 ГБ ОЗУ будут обрабатывать такие приложения. Проблема в том, что даже с этими вещами самые простые программы Computer Vision занимают много времени.

Сравнение ПК и Raspberry PI3

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

#include <stdio.h>
#include "opencv2/core.hpp"#include "opencv2/imgproc.hpp"#include "opencv2/highgui.hpp"
#include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC */

using namespace cv;
using namespace std;

int main()
{
setUseOptimized(true);
clock_t t_access, t_proc, t_save, t_total;

// Access time.
t_access = clock();
Mat img0 = imread("img0.jpg", IMREAD_COLOR);// takes ~90ms
t_access = clock() - t_access;

// Processing time
t_proc = clock();
cvtColor(img0, img0, CV_BGR2GRAY);
blur(img0, img0, Size(9,9));// takes ~18ms
t_proc = clock() - t_proc;

// Saving time
t_save = clock();
imwrite("img1.jpg", img0);
t_save = clock() - t_save;

t_total = t_access + t_proc + t_save;

//printf("CLOCKS_PER_SEC = %d\n\n", CLOCKS_PER_SEC);

printf("(TEST 0) Total execution time\t %d cycles \t= %f ms!\n", t_total,((float)t_total)*1000./CLOCKS_PER_SEC);
printf("---->> Accessing  in\t %d cycles \t= %f ms.\n", t_access,((float)t_access)*1000./CLOCKS_PER_SEC);
printf("---->> Processing in\t %d cycles \t= %f ms.\n", t_proc,((float)t_proc)*1000./CLOCKS_PER_SEC);
printf("---->> Saving     in\t %d cycles \t= %f ms.\n", t_save,((float)t_save)*1000./CLOCKS_PER_SEC);

return 0;
}

Результаты выполнения на ПК i7
введите описание изображения здесь

Результаты выполнения на Raspberry PI (сгенерированная ОС от Buildroot)
введите описание изображения здесь

Как видите, есть огромная разница. Что мне нужно, это оптимизировать каждую деталь, чтобы этот пример обработка шаг происходит в «ближнем» режиме реального времени в за максимальное время обработки 15 мс вместо 44 мс. Итак, это мои вопросы:

  • Как я могу оптимизировать свою ОС, чтобы она могла обрабатывать приложения для интенсивных вычислений и как контролировать приоритеты каждой части?
  • Как я могу полностью использовать 4 ядра RPI3 для выполнения требований?
  • Есть ли другие возможности вместо OpenCV?
  • Должен ли я использовать C вместо C ++?
  • Какие аппаратные улучшения вы рекомендуете?

0

Решение

Ну, как я понимаю, вы хотите получить около 30-40 кадров в секунду. В случае с вашим I7: он быстрый и с включенным по умолчанию методом тонов ускорения по умолчанию. В случае с Raspberry Pi: мы любим это, но это медленно, особенно для программы обработки изображений.

Как я могу оптимизировать свою ОС, чтобы она могла обрабатывать приложения для интенсивных вычислений и как контролировать приоритеты каждой части?

You should include some acceleration library for arm and re-compiled opencv again with those features enabled.

Как я могу полностью использовать 4 ядра RPI3 для выполнения требований?

Paralleling your code so it could run on 4 cores

Есть ли другие возможности вместо OpenCV?

Ask your self first, what features do you need from OpenCV.

Должен ли я использовать C вместо C ++?

Changing language will not help you at all, stay and love C++. It is a beautiful language and very fast

Какие аппаратные улучшения вы рекомендуете?

How about other board with mali GPU supported. So you could run opencv code directly on GPU, that will boost up your speed a lot.
2

Другие решения

Других решений пока нет …