Open fat-921 opened 1 year ago
输入的图片就是灰度图吗?
是的,单通道的灰度图
我认为训练的时候就得用灰度图,要在anomalib那里改训练,让模型用单通道训练然后保存模型,我这里改的部分不多,如果模型本身是单通道的输入,那样分配内存时应该默认分配好,只需要输入图片是灰度图就可以了 读取图片直接读取灰度图就可以了
cv::Mat img = cv::imread("img_path",cv::IMREAD_GRAYSCALE);
不过预处理是一个问题,因为在 pre_process
函数中做了通道标准化,单通道得改mean
和std
的长度,或者干脆不做标准化,不过这里要和训练时统一,训练用什么标准化,这里就用什么样子的
cv::Mat pre_process(cv::Mat& image, MetaData& meta, bool efficient_ad) {
vector<float> mean = { 0.485, 0.456, 0.406 };
vector<float> std = { 0.229, 0.224, 0.225 };
// 缩放 w h
cv::Mat resized_image = Resize(image, meta.infer_size[0], meta.infer_size[1], "bilinear");
// 归一化
// convertTo直接将所有值除以255,normalize的NORM_MINMAX是将原始数据范围变换到0~1之间,convertTo更符合深度学习的做法
resized_image.convertTo(resized_image, CV_32FC3, 1.0 / 255, 0);
//cv::normalize(resized_image, resized_image, 0, 1, cv::NormTypes::NORM_MINMAX, CV_32FC3);
if (!efficient_ad) {
// 标准化
resized_image = Normalize(resized_image, mean, std);
}
return resized_image;
}
还有在 dynamicBatchInfer
函数中的后处理部分有一些是不需要的,只是为了展示看,比如下面这些,还有 gen_images
函数生成了好几张图片,不需要的话直接删除就可以
// 将mask转化为3通道,不然没法拼接图片
cv::applyColorMap(images3[0], images3[0], cv::ColormapTypes::COLORMAP_JET);
// 拼接图片
cv::Mat res;
cv::hconcat(images3, res);
results.push_back(Result{ res , score });
看了几天也没看懂mmdeploy是怎么在同一个模型下同时兼容推理单通道和三通道的图
大佬,我想再问一下推理单通道的灰度图要怎么改?因为从单通道转成三通道的耗时大约3ms,想直接推理单通道的图像