c++ - 具有 1 个通道分段张量的分段应用程序
问题描述
我正在尝试将 mediapipe 的分段示例与我自己的 tflite 模型一起使用进行分段。但我的输出是一个单通道分割张量。如何更改 TfLiteTensorsToSegmentationCalculator 以使其适用于我的模型?
解决方案
我知道这有点晚了,但如果你还没有弄清楚,可能会对你有所帮助。
由于 TfLiteTensorsToSegmentationCalculator 是为套件 2 通道输出而构建的,因此如果您想将其更改为 1 个通道,那么您需要更改LoadOptions
和processGpu
相应的计算着色器代码。注意:我假设您只使用 GPU 管道而不是 CPU。首先更改您需要在 LoadOptions 函数中允许 1 个通道,如下所示。
mediapipe::Status TfLiteTensorsToSegmentationCalculator::LoadOptions(
CalculatorContext* cc) {
....
RET_CHECK_EQ(tensor_channels_, 2)// Change it to 1
....
接下来,您需要更改计算着色器代码。在shader_src_template
input_data 中是一个只读缓冲区,它保存来自 tflite 模型的输出张量。此缓冲区是为 vec2 定义的,您需要将其更改为 vec1。
layout(std430, binding = 2) readonly buffer B0 {
vec2 elements[];
} input_data; // data tensor , Change it to vec1
现在在着色器代码的主要功能中,您可以看到它们正在使用 input_value.rg 在您的情况下您只需要使用 input_value.r。您将无法使用 softmax,因为它是一个通道,因此您可以对一个通道进行任何您想做的处理,并将结果存储到 R & A 通道中的 out_value 中。这样您就不需要对下一个计算器进行任何更改,重新着色计算器可以使用与在 2 通道情况下相同的方式使用掩码。
您还需要更改hair_segmentation_mobile_gpu.pbtxt
文件中的频道数TfLiteTensorsToSegmentationCalculatorOptions
node {
calculator: "TfLiteTensorsToSegmentationCalculator"
input_stream: "TENSORS_GPU:segmentation_tensor"
input_stream: "PREV_MASK_GPU:previous_hair_mask"
output_stream: "MASK_GPU:hair_mask"
node_options: {
[type.googleapis.com/mediapipe.TfLiteTensorsToSegmentationCalculatorOptions] {
tensor_width: 512
tensor_height: 512
tensor_channels: 2 # change it to 1
combine_with_previous_ratio: 0.9
output_layer_index: 1
}
}
}
如果您有任何问题,请告诉我。
推荐阅读
- javascript - 当想要有一个可以编辑的设定值时,受控组件与非受控组件 - React
- java - 将 NCDC 的气候数据在线 API 与 Java 结合使用
- amazon-web-services - 跟踪 AWS S3 存储桶创建?
- c++ - C ++中的相对地址与物理地址
- numpy - 将数组索引与数字相乘
- tensorflow - 使用 tensorflow.sess.run() 时如何传入正确的变量?
- node.js - 未找到模块:错误:无法解析“../aws-exports”(React-Native Expo Web)
- apache-kafka - 禁用有关 Kafka-Connect 中 org.glassfish.jersey.internal.inject.Providers 警告的日志消息
- javascript - jQuery淡出()不起作用
- excel - 将 .txt 中的数据附加到 Excel 工作表