C ++ Как я могу оптимизировать свой класс импорта изображений и класс Matrix / Tensor? - PullRequest
0 голосов
/ 30 мая 2020

Я решил написать код для импорта изображений и сохранения значений пикселей в самодельном классе под названием Tensor (3D Matrix). Класс Image принимает путь и количество каналов в качестве параметров конструктора. При вызове img.importImg(); он должен пройти l oop через каждый пиксель в каждом канале и сохранить все значения внутри тензора.

Тензорный класс состоит из вектора матриц (матричный класс также самодельный).

Он работает до сих пор, но самая большая проблема, с которой я столкнулся, заключается в том, что на самом деле это занимает довольно много времени. бит для выполнения (80–90 мс в режиме выпуска для класса Image и 4–7 мс для тензор 100x100x100, предварительно инициализированный 2). Я планирую использовать класс Matrix & Tensor в CNN-библиотеке (сверточной нейронной сети), и эти классы немного замедлят работу NN.

Что на самом деле вызывает это и как я могу это решить?

Вот код: (все структуры прототипированы внутри соответствующего заголовочного файла)

main. cpp

int main() {
    {
        Benchmark b;
        Tensor t(100, 100, 100, 2);
    }


    system("pause>NUL");
    return 0;
}

Image. cpp

Image::Image(const char* path, int channels) : path(path), channels(channels) {
}

Image::Image(int width, int height, int channels) : width(width), height(height), channels(channels) {
}

Tensor* Image::importImg() {
    using namespace cimg_library;
    CImg<unsigned char> img(path);
    width = img.width();
    height = img.height();
    data.reserve(width, height, channels); // Tensor data;
    Matrix temp(width, height, 0);
    for (int c = 0; c < channels; c++) {
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                temp[y][x] = (double)img(x, y, 0, c);
            }
        }
        data.emplace_back(temp); // Tensor data;
    }
    return &data;
}

Тензор. cpp

Tensor::Tensor() {}

Tensor::Tensor(long width, long height, long depth) : width(width), height(height), depth(depth) {
    data.reserve(depth); //std::vector<Matrix> data;
}

Tensor::Tensor(long width, long height, long depth, double init) : width(width), height(height), depth(depth) {
    data.reserve(depth); // std::vector<Matrix> data;
    for (int i = 0; i < depth; i++) {
        data.emplace_back(width, height, init); // std::vector<Matrix> data;
    }
}

Matrix& Tensor::operator[](long i) {
    return data[i]; // std::vector<Matrix> data;
}

void Tensor::reserve(long width, long height, long depth) {
    this->depth = depth;
    this->width = width;
    this->height = height;
    data.reserve(depth); // std::vector<Matrix> data;
}

void Tensor::emplace_back(Matrix value) {
    data.emplace_back(value); // std::vector<Matrix> data;
}

Матрица. cpp

Matrix::Matrix() {}

Matrix::Matrix(long width, long height) : width(width), height(height) {
    data.reserve(height); // std::vector<std::vector<double>> data;
}

Matrix::Matrix(long width, long height, double init) : width(width), height(height) {
    data.reserve(height); // std::vector<std::vector<double>> data;
    for (int i = 0; i < height; i++) {
        data.emplace_back(width, init); // std::vector<std::vector<double>> data;
    }
}

std::vector<double>& Matrix::operator[](long i) {
    return data[i]; // std::vector<std::vector<double>> data;
}

void Matrix::reserve(long width, long height) {
    this->width = width;
    this->height = height;
    data.reserve(height); // std::vector<std::vector<double>> data;
}

void Matrix::emplace_back(std::vector<double> value) {
    data.push_back(value); // std::vector<std::vector<double>> data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...