This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM69A:如何从现有模型的中间层提取特征?

Guru**** 2379800 points
Other Parts Discussed in Thread: AM69A
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1502352/am69a-how-i-extract-features-from-intermediate-layers-of-an-existing-models

器件型号:AM69A

工具/软件:

我将尝试实现高斯异常检测。 为此、我需要从现有模型的中间层提取输出、例如 ONR-CL-6480-mobv3-lite-small、用于特征提取。 该器件假定为 AM69A、想使用哪些工具来实现这一目标、敬请提供指导。 如果您有任何相关示例、这将非常有帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hi Mitani-san、

    如果您想查看 TIDL 中的中间层、以下指令适用于 TIDL 10.1。  确保正确设置 tidl_tool 目录(https://github.com/TexasInstruments/edgeai-tidl-tools/?tab=readme-ov-file#setup)。  

    转到 edgeai-tidl-tools/tidl_tools 目录。  若要编译模型、请将以下内容复制到名为"import_test"的文件中

    modelType = 2
    numParamBits = 8
    numFeatureBits = 8


    inputNetFile ="/resnet18_opset9.onnx"
    outputNetFile ="out/tidl_net.bin"
    outputParamsFile ="out/tidl_io_buff"


    addDataConvertToNet = 0
    FOLDPreBnConv2D = 0
    rawDataInElementType = 0
    inElementType = 0
    outElementType = 0


    tidlStatsTool ="/PC_DSP_TEST_dl_algo.out"
    perfSimTool ="/ti_cnperfsim.out"
    GraphVizTool ="/tidl_graphVisualizer.out"

    InWidth = 256
    InHeight = 256
    inNumChannels = 3
    numFrames = 1
    inFileFormat = 0
    inData ="./airshow.jpg"
    perfSimConfig ="device_config.cfg"
    debugTraceLevel = 4

    这假设标准模型  resnet18_opset9.onnx 和 airshow.jpg 存在于 tidl_tools/目录中。  然后运行(从 tidl_tools/):

    ./tidl_model_import.out import_test

    接下来、您将需要运行推理。  将以下内容复制到名为推理测试的文件中。

    rawDataInElementType = 0
    inDataFormat = 1
    numFrames = 1
    netBinFile ="out/tidl_net.bin"
    ioConfigFile ="out/tidl_io_buff1.bin"
    inData ="./airshow.jpg"
    outData ="out/tidl_out.bin"
    debugTraceLevel = 4
    writeTraceLevel = 3
    postProcType = 1
    flowCtrl = 1

    然后运行模型。

    ./PC_DSP_TEST_dl_algo.out s:推理测试。  这将在 tidl_tools/trace/目录中创建一组文件。  这些文件只是8位整数(*。y 文件)或 float32 (*。bin)的 bin 转储文件。  这是一个用于读取它们的简短 python 脚本。   

    导入 json

    将 NumPy 导入为 NP

    Layer ="推理 config_new_0144_00001_00001_00320x00320_float.bin"
    fileHandle = open (图层、'rb')
    float_data = np.fromfile(fileHandle、dtype=np.float32)
    将 open (layer+'.txt'、"w")设为 f:
    JSON.DUMP (float_data.tolist ()、f、indent=4)

    如果读取.y 文件、请将 dytpe 更改为 int8。

    此致、

    Chris

      

    "

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Chris。
    感谢您对我的问题的详细解释。 首先、我知道我需要做的第一件事是设置名为 edgeai-tidl-tools 的工具。 我仍然不完全了解您提供的脚本的内容、但是否可以通过应用此方法同时从多个中间层提取特征? 例如、ResNet18有18层、那么我可以同时提取多达18个特征吗? 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于 TIDL、是的、但您需要遵循我在上面给您的说明。  如果您只想转储 ONNX 输出(无 TIDL)、则首先需要更新模型、以便向每一层添加输出。  下面是一个可执行此操作的脚本(将 model_name.onnx 更改为您的模型)。   它将输出一个名为 model_name_Ref.onnx 的文件。

    导入 onnx

    model_name = f"model_name.onnx"
    modified_model_name = model_name.replace (".onnx"、"_Ref.onnx")

    DEF 转换(model_name、modified_model_name):
    ""
    此函数可修改 ONNX 模型以包括中间层输出
    作为图形输出。 这对于调试和比较非常有用。
    ""
    #加载原始 ONNX 模型
    onnx_model = onnx.load (model_name)
    intermediate_layer_value_info = onnx.helper.ValueInfoProto ()
    intermediate_layer_value_info.name =""

    对于 I IN 范围(len (onnx_model.graph.node)):)
    对于 j in 范围(len (onnx_model.graph.node[i].output)):)
    intermediate_layer_value_info.name = onnx_model.graph.node[i].output[j]
    onnx_model.graph.output.append(intermediate_layer_value_info)

    onnx.save (onnx_model、modified_model_name)

    转换(model_name、modified_model_name)

    这将采用如下所示的模型:

    并向每一层添加一个输出节点

    然后可以将每个输出层输出到一个文件或 STDOUT。  以下示例说明了如何加载_ref 模型、并为 onnx/子目录中的每个输出生成.bin 文件。   您必须提供一个输入数据数组(请参阅突出显示部分)。

    将 NumPy 导入为 NP
    将 matplotlib.pyplot 作为 plt 导入
    将 onnxruntime 作为 ort 导入
    将 tensorflow 导入为 tf
    导入操作系统

    会话= ort.ConferenceSession ("your_model_Ref.onnx")
    #获取模型输入详细信息
    input_name = session.get_inputs()[0].name
    output_details = session.get_outputs()
    输出=列表(session.run(None、{input_name:[input_data]})


    对于 I IN 范围(len (output_details)):
      output_dict[output_details[i]。name]= output[i]


    output_dict.items():中的 output_name 和 output_tentor


      output_name = output_name.replace ("/"、"_")
      model_path = model_path.split ('.')[0]
      out = np.array (output_tensor、dtype = np.float32)
      out.tofile ('onnx/'+ os.path.basename (model_path)+'_'+ output_name +'.bin')

    此致、

    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    要从多个中间层同时提取特征、这意味着创建一个基于现有模型具有多个输出的新模型。 我很理解。 非常感谢。

    最后、我可以再问一个问题吗? 是否需要任何特殊程序将原始模型的预训练参数应用于具有多个输出的新创建模型?

    提前感谢您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hi Mitani-san、

    我将关闭此主题、但请使用新问题创建新主题。  我将使用新的 E2E、但我们会搜索这些 E2E 以供将来参考、并需要让他们重点关注单一主题。  我关闭这个问题、期待您在新的 E2E 中收到新问题。

    此致、

    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白。 

    根据您提供的信息、我将努力完成我的任务。
    我感谢你给我一个明确的方向。 同时,我尊重你的广泛知识。
    非常感谢。