升级高版本镜像导致推理结果错误

Which Khadas SBC do you use?

VIM3

Which system do you use? Android, Ubuntu, OOWOW or others?

UBUNTU

Which version of system do you use? Khadas official images, self built images, or others?

vim3-ubuntu-20.04-server-linux-4.9-fenix-1.5-230425-emmc, official images

Please describe your issue below:

我们在之前的版本中VIM3_Ubuntu-server-focal_Linux-4.9_arm64_EMMC_V1.0.7-210625中模型都适配好了,一切正常。但是在升级到vim3-ubuntu-20.04-server-linux-4.9-fenix-1.5-230425-emmc,发现使用新版本的模型转换工具pegasus转出来的模型输出都是错误的,请问这会是什么导致。

Post a console log of your issue below:

旧版本转换脚本:

#!/bin/bash

NAME=source_vim3
ACUITY_PATH=../bin/

convert_caffe=${ACUITY_PATH}convertcaffe
convert_tf=${ACUITY_PATH}convertensorflow
convert_tflite=${ACUITY_PATH}convertflit
convert_darknet=${ACUITY_PATH}convertdarknet
convert_onnx=${ACUITY_PATH}convertonnx
convert_keras=${ACUITY_PATH}convertkeras
convert_pytorch=${ACUITY_PATH}convertpytorch

	
$convert_onnx \
    --onnx-model  source.onnx \
    --net-output ${NAME}.json \
    --data-output ${NAME}.data 


tensorzone=${ACUITY_PATH}tensorzonex

#dynamic_fixed_point-i8 asymmetric_affine-u8 dynamic_fixed_point-i16(s905d3 not support point-i16)
$tensorzone \
    --action quantization \
    --source text \
    --source-file dataset.txt \
    --channel-mean-value '0 0 0 255' \
    --reorder-channel '2 1 0' \
    --model-input ${NAME}.json \
    --model-data ${NAME}.data \
    --model-quantize ${NAME}.quantize \
    --quantized-dtype asymmetric_affine-u8 \
    --quantized-rebuild \
#    --batch-size 2 \
#    --epochs 5

#Note: default batch-size(100),epochs(1) ,the numbers of pictures in data/validation_tf.txt must equal to batch-size*epochs,if you set the epochs >1

export_ovxlib=${ACUITY_PATH}ovxgenerator

$export_ovxlib \
    --model-input ${NAME}.json \
    --data-input ${NAME}.data \
    --reorder-channel '2 1 0' \
    --channel-mean-value '0 0 0 255' \
    --export-dtype quantized \
    --model-quantize ${NAME}.quantize \
    --optimize VIPNANOQI_PID0X88  \
    --viv-sdk ${ACUITY_PATH}vcmdtools \
    --pack-nbg-unify  \

rm  *.h *.c .project .cproject *.vcxproj *.lib BUILD *.linux *.data *.quantize *.json

mv ../*_nbg_unify nbg_unify_${NAME}

cd nbg_unify_${NAME}

mv network_binary.nb ${NAME}.nb

新版本转换:
#!/bin/bash

NAME=source
ACUITY_PATH=../bin/

pegasus=${ACUITY_PATH}pegasus
if [ ! -e "$pegasus" ]; then
    pegasus=${ACUITY_PATH}pegasus.py
fi

$pegasus import onnx\
    --model  source.onnx \
    --output-model ${NAME}.json \
    --input-dtype-list 'uint8' \
    --inputs 'input_0' \
    --input-size-list '384,512,3' \
    --output-data ${NAME}.data 

$pegasus generate inputmeta \
	--model ${NAME}.json \
	--input-meta-output ${NAME}_inputmeta.yml \
	--channel-mean-value "0 0 0 255"  \
	--source-file dataset.txt

$pegasus  quantize \
    --quantizer asymmetric_affine \
    --qtype uint8 \
    --with-input-meta  ${NAME}_inputmeta.yml \
    --model ${NAME}.json \
    --model-data ${NAME}.data \
    --model-quantize ${NAME}.quantize \
    --rebuild
 
$pegasus export ovxlib\
    --model ${NAME}.json \
    --model-data ${NAME}.data \
    --model-quantize ${NAME}.quantize \
    --with-input-meta ${NAME}_inputmeta.yml \
    --optimize VIPNANOQI_PID0X88  \
    --viv-sdk ${ACUITY_PATH}vcmdtools \
    --pack-nbg-unify

rm  *.h *.c .project .cproject *.vcxproj *.lib BUILD *.linux *.data *.quantize *.json

mv ../*_nbg_unify nbg_unify_${NAME}

cd nbg_unify_${NAME}

mv network_binary.nb ${NAME}.nb

Hello @Liuyc ,

转换参数有两个地方有问题可能导致结果出错。

1、最新版本归一化参数最后一个值输入要求是 1/255 类型。

$pegasus generate inputmeta \
	--model ${NAME}.json \
	--input-meta-output ${NAME}_inputmeta.yml \
	--channel-mean-value "0 0 0 0.0039215"  \
	--source-file dataset.txt

2、最后导出模型缺少了一个参数 --dtype。

$pegasus export ovxlib \
	--model ${NAME}.json \
	--model-data ${NAME}.data \
	--model-quantize ${NAME}.quantize \
	--with-input-meta ${NAME}_inputmeta.yml \
	--dtype quantized \
	--optimize VIPNANOQI_PID0X88  \
	--viv-sdk ${ACUITY_PATH}vcmdtools \
	--pack-nbg-unify

修改好后重新转换一下模型再验证一下是否还有问题。

1 Like

这几个地方我修改了,老版本的地方是可以指定输入的BGR或者RGB,参数:–reorder-channel。新版本的没发现有这样的参数,如果我要指定是需要怎么操作呢?

Hello @Liuyc ,

新版本取消了指定输入BGR或RGB的参数。需要你先把读取的图片转成模型需要的格式再传入模型做推理。Opencv读取图片的格式默认为BGR。

谢谢@Louis-Cheng-Liu,理解了。