Портирую скрипт, там одной строчкой 3 мерный массив (картинка с триплетами) умножается на скаляр, отнимается вектор-триплет и умножается на вектор-триплет — с помощью numpy.
Туплю, как эту операцию в одну строку заменить одной строкой numjs. Ладно JS, но в C++ кто-то ж портирует наверное. Как нужно матчить c Python numpy в C++ например?
scale = np.float32(1.0 / 255.0) # scalar
shape = (3, 1, 1)
mean = np.array([0.485, 0.456, 0.406]).reshape(shape).astype('float32') # vector (3dim array)
std = np.array([0.229, 0.224, 0.225]).reshape(shape).astype('float32') # vector (3dim array)assert isinstance(img,
np.ndarray), "invalid input 'img' in NormalizeImage"
img = img.astype('float32') * scale - mean) / std # <=== Как ЭТО портируют в C++ или JS?
совсем по простому ответ — НИКАК
когда мне предожии несколько лет назад перевести одну ML хрень с питона на С++
я изрыл весь интернет и ничего не нашел адекватнго
ответил заказчику что мне нужен ресерч + денег что бы я написал некий аналог numpy, заказчик отказался
буквально несколько месяцев назад наткнулся на одну статью кажеться на хабре
где чел начал это делать сам just for fun https://github.com/mgorshkov/
полистайте там несколько либ
есть и некий np типа замена numpy
и есть другие не помню у него проекты, внутри кторых есть функционал для замены numpy
Re: Чем заменить NumPy операции на массивах в C++ и JS
Здравствуйте, Артём, Вы писали:
Аё>но в C++ кто-то ж портирует наверное. Как нужно матчить c Python numpy в C++ например?
Я бы посоветовал ручками на Eigen (если тензоры есть) или на armadillo (если только матрицы). При правильной инсталляции и настройке эти либы могут юзать оптимизированные MKL, ATLAS и т.п.
Re[2]: Чем заменить NumPy операции на массивах в C++ и JS
Здравствуйте, Vzhyk2, Вы писали:
V>Я бы посоветовал ручками на Eigen (если тензоры есть) или на armadillo (если только матрицы). При правильной инсталляции и настройке эти либы могут юзать оптимизированные MKL, ATLAS и т.п.
Странный выбор, на первый взгляд. Чем они быстрее для картинок, чем OpenCV? Который, в свою очередь, может использовать и IPP, и OpenCL, и минимальными усилиями CUDA.
Re[2]: Чем заменить NumPy операции на массивах в C++ и JS
Спасибо за подсказку. Попытался это повторить на TS/JS — ничего не вышло . Конвертор из питона в ts и в js наконвертил тоже некомпилируемый код . Остался на медленном переборе пока что.
import * as nj from 'numjs';
declare var cv;
//...
const imageRGB = new cv.Mat();
cv.cvtColor(image, imageRGB, cv.COLOR_BGRA2RGB, 3);
const img = nj.array(imageRGB.data, 'float32').reshape(imageRGB.rows, imageRGB.cols, imageRGB.channels());
const [h, w, c] = img.shape;
// numpy: (img.astype('float32') * self.scale - self.mean) / self.std
for (let y = 0; y < h; ++y) {
for (let x = 0; x < w; ++x) {
for (let i = 0; i < c; ++i) {
const originalUint8 = img.get(y, x, i);
const normalisedFloat32 = (originalUint8 * this.scale - this.mean[i]) / this.std[i];
img.set(y, x, i, normalisedFloat32);
}
}
}
return img;
Оба OpenCV и NumJS бросают на попытке операции на 2 массивах с разной shape. Возможно, NumPy под капотом размножает 1 пиксел (вектор) на всю shape чтоб совпадали размеры- хз.
Попробовать тоже для исходной картинки сделать такого же размера 2 маски одна mean, вторая std и тогда скормить в OpenCV?
Здравствуйте, Артём, Вы писали:
Аё>Оба OpenCV и NumJS бросают на попытке операции на 2 массивах с разной shape. Возможно, NumPy под капотом размножает 1 пиксел (вектор) на всю shape чтоб совпадали размеры- хз.
Аё>Попробовать тоже для исходной картинки сделать такого же размера 2 маски одна mean, вторая std и тогда скормить в OpenCV?
\* всe Mat должны удаляться вручную после использования imageRGB.delete(). Мемоизация и авто-удаление за кадром.
PPS всё заработало, всё удалось- сначала как NodeJS, затем в браузере на планшетах и смартфонах в SPA приложении фича SOTA computer vision крутит модели PaddleOCR на движке ONNX Runtime на девайсе.
Здравствуйте, Nuzhny, Вы писали:
N>Странный выбор, на первый взгляд. Чем они быстрее для картинок, чем OpenCV? Который, в свою очередь, может использовать и IPP, и OpenCL, и минимальными усилиями CUDA.
Это был всего-лишь совет, а не жесткое требование. Нравится см::mat, юзай. Мне OpenCV не нравится, но в ней есть реализации некоторых алгоритмов, которых больше нигде нет, хотя часто реализации медленные и кривенькие.
Eigen вообще на тензоры задаточен и удобен и умеет юзать оптимизированные либы от того же интела, armadillo только на матрицы и для меня очень удобна в использовании и в общем нормально подхватывает оптимизированные либы.
А cv::mat — мне сильно не удобна и странная для меня, как программиста пользователя ее.