NagatoYuki0943 / anomalib-tensorrt-cpp

24 stars 6 forks source link

请问要是推理单通道的灰度图要怎么改? #4

Open fat-921 opened 1 year ago

fat-921 commented 1 year ago

大佬,我想再问一下推理单通道的灰度图要怎么改?因为从单通道转成三通道的耗时大约3ms,想直接推理单通道的图像

NagatoYuki0943 commented 1 year ago

输入的图片就是灰度图吗?

fat-921 commented 1 year ago

是的,单通道的灰度图

NagatoYuki0943 commented 1 year ago

我认为训练的时候就得用灰度图,要在anomalib那里改训练,让模型用单通道训练然后保存模型,我这里改的部分不多,如果模型本身是单通道的输入,那样分配内存时应该默认分配好,只需要输入图片是灰度图就可以了 读取图片直接读取灰度图就可以了

cv::Mat img = cv::imread("img_path",cv::IMREAD_GRAYSCALE);

不过预处理是一个问题,因为在 pre_process 函数中做了通道标准化,单通道得改meanstd的长度,或者干脆不做标准化,不过这里要和训练时统一,训练用什么标准化,这里就用什么样子的

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 });
fat-921 commented 1 year ago

看了几天也没看懂mmdeploy是怎么在同一个模型下同时兼容推理单通道和三通道的图 image