Я решил написать код для импорта изображений и сохранения значений пикселей в самодельном классе под названием 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;
}