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.

[参考译文] SK-AM62A-LP:将 edgeai-gst-apps-bode-reader 与 SDK 10.0 配合使用

Guru**** 2489685 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1549468/sk-am62a-lp-using-edgeai-gst-apps-barcode-reader-with-sdk-10-0

器件型号:SK-AM62A-LP


工具/软件:

TI 团队大家好、

我目前正在开发用于条形码检测的定制硬件平台、并遇到了您的存储库:
https://github.com/TexasInstruments-Sandbox/edgeai-gst-apps-barcode-reader/tree/main

从文档和提交中可以看出、存储库正式支持 SDK 8.6 和 9.0 版本。 我正在使用 10.0 SDK (Processor SDK Linux)、并想知道是否有支持或建议的方法可以让条形码读取器解决方案与 SDK 10.0 一起使用。

请告诉我如何继续

我们将高度感谢您的指导。

此致、
Atharva Shende

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

    您好、 Atharva、

    正确、该演示应用程序已针对较旧的 SDK 进行了验证、将其移植到较新的 SDK 需要付出一些增量努力。

    主要移植步骤将是重新编译 10.0 SDK 的训练模型。  这将类似于我在同时开发的另一个演示(自动零售结账[0])中所写的内容。

    • 您将需要为条形码检测训练的 ONNX 模型;请参见 /scripts/setup_model.sh [2]--这将下载一个包含.ONNX 模型的 tarball

    您可以下载版本的 edgeai-tidl-tools (rel_10_00)[1]、并按照说明在 Linux 计算机上进行设置。 模型架构是 YOLOX-nano。 如果将 edgeai-tidl-tools/examples/osrt_python/model_configs.py 中相应 yolox-nano 条目[3]的路径更改为经过条形码训练的模型、则可以在不更改其他设置的情况下进行编译。  

    • 为简洁起见,我省略了几个步骤 — edgeai-tidl-tools 文档中另有相关介绍、介绍了如何设置和编译模型

    获得编译的工件后、传输到 EVM 所在路径[2]处 (/opt/model_zoo/barcode-modelartifacts)

    应用程序的其余部分应按原样运行  

     [0] https://github.com/TexasInstruments-Sandbox/edgeai-gst-apps-retail-checkout/blob/main/retail-shopping/doc/REPRODUCE.md#recompiling-the-model 

    [1] https://github.com/TexasInstruments/edgeai-tidl-tools/tree/rel_10_00 

    [2] https://github.com/TexasInstruments-Sandbox/edgeai-gst-apps-barcode-reader/blob/main/scripts/setup_model.sh 

     [3] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/efae61031b31aa2ba5491c03bb808216d3baef14/examples/osrt_python/model_configs.py#L752 

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

    谢谢 Reese、

    您能告诉我针对 10.0 进行模型训练的适当步骤吗

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

    尊敬的 Atharva:

    我将进行(脚踏)修正、说明它不会 训练 模型。 这已经完成、并生成了一个.ONNX 模型文件--这仍然是完全有效的。 这里特定于 SDK 和 SOC 的部分是编译/导入模型。  

    请注意、这 不是 量产级版本。 它是在我们校园拍摄的一小套在线数据集和图像上进行培训的。  

    1. 克隆 rel_10_00 分支的 edgeai-tidl-tools
    2. 运行 setup.sh 脚本以安装组件和 TIDL 工具、用于导入/编译模型。 我建议使用 python 虚拟环境
      1. https://github.com/TexasInstruments/edgeai-tidl-tools/?tab=readme-ov-file#setup-on-x86_pc
      2. 您需要事先导出 SOC=am62a 以开发此处理器为目标
    3. 将 ONNX 模型文件复制到模型/公共模型中
    4. 编辑 输入 od-8200_onnxrt_coco_edgeai-mmdet_yolox_nano_lite_416x416_20220214_model_onnx 的 edgeai-tidl-tidl-tools/examples/osrt_python/model_configs.py  
      1. 更改 model_path 以使用条形码训练的.ONNX 模型  
      2. 你也可以用 python 复制整个词典,并给它一个单独的(较短的)名称;我将它通常称为条形码 onnx-tidl
    5. 将目录更改为“ort"并“并像这样编译模型
      1. python3 onnxrt_ep.py -c -m 条形码-onnx-tidl
    6. 您的模型工件将位于 edgeai-tidl-tools/model-artifacts/条 形码-onnx-tidl
    7. 将此 model-artifacts/barticle-onnx-tidl 目录复制到 EVM(网址为/opt/model_zoo/barcode-modelartifacts)上  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Reese:

    感谢您的指导。 我尝试了您提供的步骤,但在运行命令时遇到了一个错误,但当我检查模型工件文件夹我得到条形码 onnx-tidl 文件夹...


    python3 onnxrt_ep.py -c -m 条形码-onnx-tidl

    以下是日志

    root@c32097e8b443:/home/root/examples/osrt_python/ort # python3 onnxrt_ep.py -c -m 条形码-onnx-tidl
    可用的执行提供程序:['TIDLExecutionProvider '、'TIDLCompilationProvider '、'CPUExecutionProvider ']

    运行 1 个型号-['条形码 — onnx-tidl']


    Running_Model:条形码 — onnx-tidl


    在模型./../../models/public/barcode-model.onnx 上运行形状推理

    ========================= 【模型编译已启动】=======================

    模型编译将分期进行以下工作 a:
    1.解析
    2.图形优化
    3.量化与校准
    4、内存规划

    ============================= 【版本摘要】=============================

    ----------------------------------------------------------------------------------------
    | TIDL 工具版本| 10_00_08_00 |
    ----------------------------------------------------------------------------------------
    | C7x 固件版本| 10_00_02_00 |
    ----------------------------------------------------------------------------------------
    |运行时版本| 1.14.0+10000005|
    ----------------------------------------------------------------------------------------
    |型号选项版本|11|
    ----------------------------------------------------------------------------------------

    注意:此处的运行时版本指定了 ONNXRT_VERSION+TIDL_VERSION
    例如:1.14.0+1000XXXX -> ONNXRT 1.14.0 和 TIDL_VERSION 10.00.XX.XX

    ============================= 【解析已开始】=============================

    [TIDL Import]警告:不提供“eta_layers_names_list"-“-在 ARM 模式下运行 OD 后处理
    OD 主干节点数= 0
    obackboneNodeIds 的大小= 0

    ---------------------------- 子图表信息摘要--------------------------------
    ----------------------------------------------------------------------------------------
    |核心|节点数量|子图数量|
    ----------------------------------------------------------------------------------------
    | C7x | 244 | 13 |
    | CPU | 39 | x |
    ----------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------------------------------------------
    |节点|节点名称|原因|
    ---------------------------------------------------------------------------------------------------------------------------------------------
    |收集|收集_ 364 |仅支持线路收集|
    | ReduceMax | ReduceMax_369 |仅支持沿高度降低|
    |减| LESS_373 | TIDL 不支持的层类型|
    | NOT | NOT_374 | TIDL 不支持的层类型|
    |非零| nonzero_375 | TIDL 不支持的层类型|
    | EXP | EXP_327 | TIDL 不支持的层类型|
    |收集|收集_ 355 |仅支持线路收集|
    |收集|收集_353 |仅支持线路收集|
    |取消压缩| Unxging_361 | TIDL 不支持的层类型|
    |收集|收集_ 349 |仅支持线路收集|
    |收集|收集_347 |仅支持线路收集|
    |取消压缩| Unxging_360 | TIDL 不支持的层类型|
    | Sub | SUB_345 | SUB/Div |中不支持两个变量输入
    | Unxging | Unxging_359 | TIDL 不支持的层类型|
    | Sub | SUB_339 | SUB/Div |中不支持两个变量输入
    | Unxging | Unxging_358 | TIDL 不支持的层类型|
    |收集|收集_ 368 |仅支持线路收集|
    | GatherND | GatherND_377 | TIDL 不支持的层类型|
    | ReduceMax | ReduceMax_388 | TIDLP-RT |中不支持缩小所有尺寸
    | ArgMax | ArgMax_370 |仅支持 keepdims = 1(默认值)|
    | GatherND | GatherND_387 | TIDL 不支持的层类型|
    | Cast | Cast_389 |仅在网络|的终端节点(输入/输出)上受支持
    | MUL | Mul_392 | Add/Mul/Sub/Div/Max 层中的变量输入必须具有相同的尺寸或可广播|
    | Unxging | Unxging_393 | TIDL 不支持的层类型|
    | ADD | ADD_394 | Add/Mul/Sub/Div/Max 层中的变量输入必须具有相同的尺寸或可广播|
    | SHAPE | SHAPE_398 | TIDL 不支持的层类型|
    |收集|收集_ 400 |输入尺寸必须大于 1d |
    | GatherND | GatherND_383 | TIDL 不支持的层类型|
    | GatherND | GatherND_380 | TIDL 不支持的层类型|
    |取消压缩| Unxging_396 | TIDL 不支持的层类型|
    | Unxging | Unxging_397 | TIDL 不支持的层类型|
    | Unxging | Unxging_395 | TIDL 不支持的层类型|
    | NonMaxSuppression | NonMaxSuppression_403 | TIDL 不支持的层类型|
    |收集|收集_405 |仅支持线路收集|
    |挤压|挤压|挤压_406 |子图没有任何计算节点|
    |收集|收集_ 417 |输入尺寸必须大于 1D |
    |收集|收集_408 |输入尺寸必须大于 1D |
    |收集|收集_ 414 |仅支持线路收集|
    |取消压缩| Unxging_415 | TIDL 不支持的层类型|
    ---------------------------------------------------------------------------------------------------------------------------------------------
    ============================ 【解析已完成】============================

    处理过程 1:
    回溯(最近一次呼叫):
    在_sbootstrap 中输入/usr/lib/python3.10/multiprocessing/process.py 第 314 行
    self.run()
    文件“/usr/lib/python3.10/multiprocessing/process.py、第 108 行、运行中
    self._target (* self._args、** self._kwargs)
    文件“run_model 中的/home/root/examples/osrt_python/ort/onnxrt_ep.py 第 325 行
    SESS = RT.ConferenceSession(
    文件“/usr/local/lib/python3.10/dist-packages/onnxruntime/capi/onnxruntime_inference_collection.py、第 362 行、位于__init__
    self._create_immussion_session(提供程序,提供程序选项,禁用优化器)
    /usr/local/lib/python3.10/dist-packages/onnxruntime/capi/onnxruntime_inference_collection.py、第 410 行、位于_create_emption_session 中
    sess.initialize_session(providers、provider_options、disabled_optimizers)
    onnxruntime.capi.onnxruntime_pybind11_state.NotImplemented:[ONNXRuntimeError]: 9 : Not_Implemented :找不到 Split(11) 的内核(节点 Split)。 未找到内核

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

    您能否在 model_config.py 中为此模型提供条目?

    我看到的是、未找到或未提供物体检测元架构文件 (.PROTOTXT)。   

    [TIDL Import]警告:不提供“eta_layers_names_list"-“-在 ARM 模式下运行 OD 后处理
    [/报价]

    这与此处有关元架构的文档相关、该文档对对象检测后处理 (SSD) 报头进行编码[0]

     [0] https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/tidl_fsg_od_meta_arch.md 

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

    “条形码 — onnx-tidl“:create_model_config (
    #source=AttrDict (
    #model_url=“">software-dl.ti.com/.../yolox_nano_lite_416x416_20220214_model.onnx",“,</s>“ 、
    #meta_arch_url=“">software-dl.ti.com/.../yolox_nano_lite_416x416_20220214_model.prototxt",“,</s>“ 、
    # assembly_shape=True、
    #)、
    前进程=AttrDict(
    调整大小=416、
    作物=416、
    data_layout=“NCHW",“,</s>、
    PAD_COLOR=[114,114,114]、
    resize_with_pad=[True、“Cornor"],“,</s>、
    REVERSE_CHANNES=True、
    )、
    Session=AttrDict(
    session_name=“onnxrt",“,</s>、
    model_path=os.path.join (
    models_base_path、“bartodec-model.onnx"</s>“
    )、
    #meta_layers_names_list=os.path.join(
    # models_base_path、“yolox_nano_lite_416x416_20220214_model.prototxt"</s>“
    #)、
    META_ARCH_TYPE=6、
    INPUT_Mean =[0、0、0]、
    INPUT_SCALE=[1、1、1]、
    Input_optimization=True、
    )、
    postprocess=AttrDict(
    格式化板=“DetectionBoxSL2BoxLS",“,</s>、
    resize_with_pad=True、
    关键点=False、
    object6dpose=False、
    归一化检测=错误、
    shuffle_indices=None、
    挤压轴=无、
    rempe_list=[(–1、5)、(–1、1)]、
    IGNORE_INDEX=None、
    )、
    task_type=“detection",“,</s>、
    extra_info=AttrDict (
    OD_TYPE=“SSD",“,</s>、
    framework=“MMDetection",“,</s>、
    num_images=numImages、
    NUM_CLASS=91、
    label_offset_type=“80to90",“,</s>、
    LABEL_OFFSET=1、
    )、
    )、


    下面是我在 model_config.py 中为模型添加的条目 、barcode-model.onnx我只有我下载的文件。 我没有相应的.protottxt 文件。

    我是否应该重复使用 与之前的模型 (od-8200_onnxrt_coco_edgeai-mmdet_yolox_nano_lite_416x416_20220214_model_onnx) 关联的相同.prototxt 文件、或者 在这种情况下甚至需要.protottxt?

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

    此外,在提供. protottxt 文件后,我仍然得到了拆分错误(无法找到内核 Split(11)(节点拆分)。 未找到内核)


    root@c32097e8b443:/home/root/examples/osrt_python/ort # python3 onnxrt_ep.py -c -m 条形码-onnx-tidl
    可用的执行提供程序:['TIDLExecutionProvider '、'TIDLCompilationProvider '、'CPUExecutionProvider ']

    运行 1 个型号-['条形码 — onnx-tidl']


    Running_Model:条形码 — onnx-tidl


    在模型./../../models/public/barcode-model.onnx 上运行形状推理

    ========================= 【模型编译已启动】=======================

    模型编译将执行以下阶段:
    1.解析
    2.图形优化
    3.量化与校准
    4、内存规划

    ============================= 【版本摘要】=============================

    ----------------------------------------------------------------------------------------
    | TIDL 工具版本| 10_00_08_00 |
    ----------------------------------------------------------------------------------------
    | C7x 固件版本| 10_00_02_00 |
    ----------------------------------------------------------------------------------------
    |运行时版本| 1.14.0+10000005|
    ----------------------------------------------------------------------------------------
    |型号选项版本|11|
    ----------------------------------------------------------------------------------------

    注意:此处的运行时版本指定了 ONNXRT_VERSION+TIDL_VERSION
    例如:1.14.0+1000XXXX -> ONNXRT 1.14.0 和 TIDL_VERSION 10.00.XX.XX

    ============================= 【解析已开始】=============================

    yolox 是元架构名称
    yolox
    OD 主干节点数= 0
    obackboneNodeIds 的大小= 0

    ---------------------------- 子图表信息摘要--------------------------------
    ----------------------------------------------------------------------------------------
    |核心|节点数量|子图数量|
    ----------------------------------------------------------------------------------------
    | C7x | 244 | 13 |
    | CPU | 39 | x |
    ----------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------------------------------------------
    |节点|节点名称|原因|
    ---------------------------------------------------------------------------------------------------------------------------------------------
    |收集|收集_ 364 |仅支持线路收集|
    | ReduceMax | ReduceMax_369 |仅支持沿高度降低|
    |减| LESS_373 | TIDL 不支持的层类型|
    | NOT | NOT_374 | TIDL 不支持的层类型|
    |非零| nonzero_375 | TIDL 不支持的层类型|
    | EXP | EXP_327 | TIDL 不支持的层类型|
    |收集|收集_ 355 |仅支持线路收集|
    |收集|收集_353 |仅支持线路收集|
    |取消压缩| Unxging_361 | TIDL 不支持的层类型|
    |收集|收集_ 349 |仅支持线路收集|
    |收集|收集_347 |仅支持线路收集|
    |取消压缩| Unxging_360 | TIDL 不支持的层类型|
    | Sub | SUB_345 | SUB/Div |中不支持两个变量输入
    | Unxging | Unxging_359 | TIDL 不支持的层类型|
    | Sub | SUB_339 | SUB/Div |中不支持两个变量输入
    | Unxging | Unxging_358 | TIDL 不支持的层类型|
    |收集|收集_ 368 |仅支持线路收集|
    | GatherND | GatherND_377 | TIDL 不支持的层类型|
    | ReduceMax | ReduceMax_388 | TIDLP-RT |中不支持缩小所有尺寸
    | ArgMax | ArgMax_370 |仅支持 keepdims = 1(默认值)|
    | GatherND | GatherND_387 | TIDL 不支持的层类型|
    | Cast | Cast_389 |仅在网络|的终端节点(输入/输出)上受支持
    | MUL | Mul_392 | Add/Mul/Sub/Div/Max 层中的变量输入必须具有相同的尺寸或可广播|
    | Unxging | Unxging_393 | TIDL 不支持的层类型|
    | ADD | ADD_394 | Add/Mul/Sub/Div/Max 层中的变量输入必须具有相同的尺寸或可广播|
    | SHAPE | SHAPE_398 | TIDL 不支持的层类型|
    |收集|收集_ 400 |输入尺寸必须大于 1d |
    | GatherND | GatherND_383 | TIDL 不支持的层类型|
    | GatherND | GatherND_380 | TIDL 不支持的层类型|
    |取消压缩| Unxging_396 | TIDL 不支持的层类型|
    | Unxging | Unxging_397 | TIDL 不支持的层类型|
    | Unxging | Unxging_395 | TIDL 不支持的层类型|
    | NonMaxSuppression | NonMaxSuppression_403 | TIDL 不支持的层类型|
    |收集|收集_405 |仅支持线路收集|
    |挤压|挤压|挤压_406 |子图没有任何计算节点|
    |收集|收集_ 417 |输入尺寸必须大于 1D |
    |收集|收集_408 |输入尺寸必须大于 1D |
    |收集|收集_ 414 |仅支持线路收集|
    |取消压缩| Unxging_415 | TIDL 不支持的层类型|
    ---------------------------------------------------------------------------------------------------------------------------------------------
    ============================ 【解析已完成】============================

    处理过程 1:
    回溯(最近一次呼叫):
    在_sbootstrap 中输入/usr/lib/python3.10/multiprocessing/process.py 第 314 行
    self.run()
    文件“/usr/lib/python3.10/multiprocessing/process.py、第 108 行、运行中
    self._target (* self._args、** self._kwargs)
    文件“run_model 中的/home/root/examples/osrt_python/ort/onnxrt_ep.py 第 325 行
    SESS = RT.ConferenceSession(
    文件“/usr/local/lib/python3.10/dist-packages/onnxruntime/capi/onnxruntime_inference_collection.py、第 362 行、位于__init__
    self._create_immussion_session(提供程序,提供程序选项,禁用优化器)
    /usr/local/lib/python3.10/dist-packages/onnxruntime/capi/onnxruntime_inference_collection.py、第 410 行、位于_create_emption_session 中
    sess.initialize_session(providers、provider_options、disabled_optimizers)
    onnxruntime.capi.onnxruntime_pybind11_state.NotImplemented:[ONNXRuntimeError]: 9 : Not_Implemented :找不到 Split(11) 的内核(节点 Split)。 未找到内核

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

    尊敬的 Atharva:

    我真诚的道歉——我指示你使用一个与条形码 ONNX 模型不完全兼容的 PROTOTXT 文件。 请使用此处链接的证书

    我在我推荐的 prototxt 上遇到了同样的问题--它有几个不同的图层名称和不同的类数。  

    /cfs-file/__key/communityserver-discussions-components-files/791/barcode_2D00_yolox_2D00_nano_2D00_metaarch.prototxt

    使用以下 model_config 在 10.0 SDK 中成功编译:

        'barcode-yolox' :{ 
            'model_path' : os.path.join(models_base_path, 'barcode-yolox.onnx'),
            'source' : {'model_url': 'dummy', 'opt': True,  'infer_shape' : True, \
                        'meta_arch_url' : 'dummy'},
            'mean': [0, 0, 0],
            'scale' : [1, 1, 1],
            'num_images' : numImages,
            'num_classes': 91,
            'model_type': 'od',
            'od_type' : 'SSD',
            'framework' : 'MMDetection',
            'session_name' : 'onnxrt' ,
            'meta_layers_names_list' : os.path.join(models_base_path, 'barcode-yolox.prototxt'),
            'meta_arch_type' : 6
        },

    该模型正在检测基本测试图像上的条形码。 我将重申、这不是一个生产模式。 它用作演示用途的示例。  

    BR、
    Reese

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

    尊敬的 Reese:

    感谢您的支持。

    模型已成功编译。 您能否分享一个基本示例(类似于 onnxrt_ep.py)来运行模型? 我还想使用我自己的电路板上的摄像头 (/dev/video3) 测试条形码检测。

    谢谢。此致、
    Atharva Shende

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

    尊敬的 Atharva:

    如果您希望从 capture-preproce-TIDLad-postproc-display 运行完整的视觉流水线、那么我建议使用 edgeai-gst-apps(位于/opt 下)。

    您可以从 YAML 配置文件[1]中指定要使用的输入配置和模型。 条形码阅读器 git repo 也基于这些工具,并有一个预先存在的配置文件,你可以从开始。   

    请注意、模型会 找到 条形码、但不会对其进行解码--我们的演示应用程序使用了 zbar 库来实现这一点

    之前的某些 SDK 存在一个问题(我很难回忆一下是否是 10.0)、其中 param.yaml 中的模型 IO 描述使用的格式与 edgeai-gst-apps 预期的格式不同。 如果您的模型未使用该 edgeai-gst-apps 工具进行初始化、我对此主题有一个常见问题解答[2]

    [1] https://software-dl.ti.com/processor-sdk-linux/esd/AM62AX/latest/exports/docs/edgeai/configuration_file.html#inputs

    [2] 【常见问题解答】如何为 TIDL 深度学习模型获取有效的 param.yaml 文件? edgeai-gst-apps 中的演示会在我的模型上引发错误  

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

    谢谢 Reese、

    我能够使用您使用 YAML 配置文件解释的过程来检测条形码。 现在、您能告诉我如何使用 zbar 对它们进行解码、或者如何将 zbar 集成到管道中?

    谢谢。此致、
    Atharva Shende

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

    尊敬的 Atharva:

    您需要使用神经网络的边界框输出获取裁剪图像、并将其用作 ZBAR 的输入。 我将分享在演示应用程序中完成此操作的位置。  

    有关 所使用的 Python [1]和 CPP [2]版本、请参阅此处。 在尝试解码之前、我们使用 OpenCV 将图像转换为灰度。 有关 ZBAR 的更多详细信息、请参阅其公共文档。 请注意、1D/2D 解码还有其他实现、但我们选择了 ZBAR、因为它非常简单、开源且具有许可许可证。

    一些像 ZBAR 这样的库也可以检测多种代码类型,但这样做会增加处理时间——库必须运行一些处理来确定代码类型(例如 qr,数据矩阵)。 ZBAR 等开源库的特定用法超出了 TI 的支持规定范围 — 此演示应用使用 ZBAR 作为此过程的示例。  

    [1] https://github.com/TexasInstruments-Sandbox/edgeai-gst-apps-barcode-reader/blob/df8f8116b4cf05a997468bcf6e27945ea699b5f9/apps_python/post_process.py#L278

    [2] https://github.com/TexasInstruments-Sandbox/edgeai-gst-apps-barcode-reader/blob/df8f8116b4cf05a997468bcf6e27945ea699b5f9/apps_cpp/common/src cpp/post_proce_image_object_detect.cpp#L127

    BR、
    Reese

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

    您好 Reese、

    我 按照建议将 scan_codes () 函数集成到我的流水线中。 下面是我添加的函数:

    def scan_codes(self, img):
        h, w, c = img.shape
        if h <= 0 or w <= 0:
            return ""
        if c == 3:
            img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
        zbar_img = zbar.Image(w, h, 'Y800', img.tobytes())
        self.zbar_scanner.scan(zbar_img)
        found_text = []
        for sym in zbar_img:
            found_text.append(sym.data)
    
        return found_text
    

    这样、我的检测模型中的边界框会正确传递到 zbar、它确实会检测到存在条形码。 但是、当我尝试解码时、结果仍然显示为 “未定义“ 而不是实际条形码值。

    请您澄清一下:

    1. 是否需要特定的转换步骤(例如)sym.data.decode("utf-8")来正确提取条形码文本?

    2. 是否需要zbar.ImageScanner()以特定方式设置对象才能正确解码?

    3. AM62A (Python 3.12/Yocto SDK) 上的 zbar 是否有任何已知问题undefined、可能导致返回解码?

    感谢您的支持、
    Atharva Shende

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

    我建议将运行 ZBAR 的裁剪图像保存为图像文件、以便您可以自己查看它们。 条形码旋转很常见、图像的裁剪部分剪掉了部分代码、这会使读取变得很困难、如果不是不可能的话。 我预计演示应用中传递的“img"是“是从边界框坐标+一些缓冲区区域裁剪而来的、以便更好地捕获角。  

    我不知道此 SDK 有任何问题会导致您获得未定义的结果。 在这里的存储库中、我们从头开始构建目标本身的 ZBAR、没有遇到任何进一步的功能问题。 我建议在这里查看 ZBAR 文档以获取有关设置和使用的更多帮助 — 这超出了我的支持范围。  

    您也可以查看此演示库的其他部分以了解我们如何设置  

    BR、
    Reese

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

    尊敬的 Reese:

    感谢您的详细建议。 我尝试从边界框中保存裁剪图像、可以确认裁剪图像看起来正确并包含完整的 QR/条形码(带有一些缓冲区)。 检测工作正常、但问题是解码结果始终返回为“未定义“、而不是实际条形码值。

    这让我认为问题不在于裁剪裁剪、而在于流水线中如何使用 ZBAR(或 pyzbar)。 您能否澄清一下、在此演示中是否需要为 ZBAR 设置任何特定参数或解码模式?

    感谢您的指导—只是想强调问题不在于检测条形码、而是将其解码为可读文本(始终未定义)。

    此致、
    Atharva Shende

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

    尊敬的 Atharva:

    我们在这里使用了默认配置的 ZBAR ImageScanner。 postprocess.py python 文件[1]包含该库的最小参考值和用法。  

    实际上、我们只需要创建扫描仪对象并启用配置。 可以针对不同的代码类型更改该配置、但我们保留此配置为默认值。  

    我建议将其中一些输出图像(可能还有一些直接从网络中提取的图像)用作文件、并尝试使用带有这些 ZBAR 函数调用的简单 python 脚本来解码从这些图像文件读取的数据。 您也可以在 PC 上执行此操作、它主要是流式刷新库并使用它的一个步骤。  

    [1] github.com/.../post_process.py