HomiKetalys / gd32ai-modelzoo

Provide deployable deep learning models on gd32
MIT License
25 stars 2 forks source link

推理时间&分离模型&量化后的AP&模型的输出结果格式 #6

Open mzxxyg opened 3 months ago

mzxxyg commented 3 months ago

 作者大大,您好,想请教几个问题,不好意思哈问题有点多。

Q1

复现过了您github里面训练好的模型,直接用的下图文件夹里面的Edge_AI文件夹里面的东西,下载到GD32H757的板子里推理时间却需要700+ms,原始图片也是320240,模型输入192192,我是哪里没注意到么?有什么关键点会影响到这个推理时间吗?ARMCC和GCC会带来那么大的区别吗?CK_AHB,CK_APB1,CK_APB2,CK_SYS这几个频率是跟您的一样的。

image

image

H7的芯片用CM4的会有什么影响吗?

a850f3d3493cfb7d76cf5d30531dd97

Q2

分离模型的两个参数separation和separation_scale的作用是什么呢?看您文章里说分离模型会降低精度,所以我们在训练的时候做了一点修改,train.py没有用到separation和separation_scale参数(如下图),.data文件里直接删除了separation、separation_scale、conf_thr=0.001,nms_thr=0.5,iou_thr=0.4。因为我们自身的模型本身精度不高,所以不想牺牲精度,不用分离模型,但是我们这么直接改是不是有问题呢? d8d1d2d3a9ed958927f1d3ba957de47 image

Q3

我们用自己的数据集跑出来之后,AP大概为0.6,但是运行deploy.py量化之后AP变成了0.1,小目标检测,(此时.data里面没有separation、separation_scale、conf_thr=0.001,nms_thr=0.5,iou_thr=0.4这些参数)降的有点太多了,您遇到过类似问题嘛?请问您知道改哪里可以让它不降那么多么?跟分离模型有关系吗? image

image

Q4

这个cubeAI最后给出的输出结果是什么格式的呢?跟什么有关呢?是CubeAi官方固定的输出格式还是跟模型训练的配置有关?.data文件不配置separation和separation_scale参数,生成的C代码就一个network1,您下面这个处理函数是不是只是针对带有分离模型的?所以想重新处理模型的输出,应该怎么解读最原始的输出呢?另外,图中您这个处理函数的逻辑是什么?经过您这个函数,处理后reg,reg+1,reg+2,reg+3里面是不是目标框的X,Y,W,H么?cls_index是通过什么逻辑得出来?恳请指教

红框的逻辑都没看太懂

84c87413d47af2a99acbecc8145088f

不好意思大佬,问的问题有点多,恳请指教,谢谢作者大大!

HomiKetalys commented 3 months ago

 作者大大,您好,想请教几个问题,不好意思哈问题有点多。

Q1

复现过了您github里面训练好的模型,直接用的下图文件夹里面的Edge_AI文件夹里面的东西,下载到GD32H757的板子里推理时间却需要700+ms,原始图片也是320_240,模型输入192_192,我是哪里没注意到么?有什么关键点会影响到这个推理时间吗?ARMCC和GCC会带来那么大的区别吗?CK_AHB,CK_APB1,CK_APB2,CK_SYS这几个频率是跟您的一样的。

image

image

H7的芯片用CM4的会有什么影响吗?

a850f3d3493cfb7d76cf5d30531dd97

Q2

分离模型的两个参数separation和separation_scale的作用是什么呢?看您文章里说分离模型会降低精度,所以我们在训练的时候做了一点修改,train.py没有用到separation和separation_scale参数(如下图),.data文件里直接删除了separation、separation_scale、conf_thr=0.001,nms_thr=0.5,iou_thr=0.4。因为我们自身的模型本身精度不高,所以不想牺牲精度,不用分离模型,但是我们这么直接改是不是有问题呢? d8d1d2d3a9ed958927f1d3ba957de47 image

Q3

我们用自己的数据集跑出来之后,AP大概为0.6,但是运行deploy.py量化之后AP变成了0.1,小目标检测,(此时.data里面没有separation、separation_scale、conf_thr=0.001,nms_thr=0.5,iou_thr=0.4这些参数)降的有点太多了,您遇到过类似问题嘛?请问您知道改哪里可以让它不降那么多么?跟分离模型有关系吗? image

image

Q4

这个cubeAI最后给出的输出结果是什么格式的呢?跟什么有关呢?是CubeAi官方固定的输出格式还是跟模型训练的配置有关?.data文件不配置separation和separation_scale参数,生成的C代码就一个network1,您下面这个处理函数是不是只是针对带有分离模型的?所以想重新处理模型的输出,应该怎么解读最原始的输出呢?另外,图中您这个处理函数的逻辑是什么?经过您这个函数,处理后reg,reg+1,reg+2,reg+3里面是不是目标框的X,Y,W,H么?cls_index是通过什么逻辑得出来?恳请指教

红框的逻辑都没看太懂

84c87413d47af2a99acbecc8145088f

不好意思大佬,问的问题有点多,恳请指教,谢谢作者大大!

@mzxxyg 对于第一点,ARMCC会比GCC多大约50%的时间,比如256x256在使用ARMCC编译器的情况下是360ms左右,使用GCC编译器的情况下是230ms左右。对于你的在192x192分辨率下推理一遍需要700+ms,你首先需要检查是否使用了外部内存SDRAM。如果使用了,并且允许ZI段编译在外部内存,则你需要确保ai_model.c文件中的全局变量在SRAM中初始化,而不是在SDRAM中初始化,这两种内存速度差异很大,外部内存会降低推理速度,同时也要保证栈是在SRAM中的。其次你需要检查是否开启了一级缓存,即Dcache和Icache,如果没有开启推理速度会慢很多。X-CUBE-AI提供的推理库会进行CRC校验,如果不是使用STM32的板子,除非CRC寄存器地址和用法一样,不然推理库会初始化失败。恰好GD32H7,GD32F4,STM32F4的CRC寄存器地址是一样的,所以使用的是CM4,而CM7是用不了的,但是至少目前看来用CM4是正常的。 对于第二点,分离式模型可以大幅降低模型推理时的内存占用峰值,但是不会降低太多模型的性能,当然如果你觉得内存足够,你可以直接设置separation=0来不使用它。你的修改是可以的,因为separation参数不设置的话默认值为0。 对于第三点,这种情况我没遇到过,不过如果是小目标检测,则预测的目标框相对大目标来说会有较大偏移,因为框的坐标也会被量化。当然具体为什么降低这么多我也不知道,你可以尝试对tflite和onnx文件中每层的计算进行输出,看看是哪层计算差异比较大。 对于第四点,在这个模型中,最终输出的格式为num_pred×(3num_reg+3num_anchor+num_class)。红框所圈的是对结果的解码过程,应该是YOLOv5的结果的处理过程,我是根据YoloFatestV2原项目中utils.py文件中的handel_preds函数使用C语言实现的。你可以参考YOLOv5的结果处理过程或YoloFatestV2原项目中utils.py文件中的handel_preds函数来理解红框所圈的代码逻辑

mzxxyg commented 3 months ago

 作者大大,您好,想请教几个问题,不好意思哈问题有点多。

Q1

复现过了您github里面训练好的模型,直接用的下图文件夹里面的Edge_AI文件夹里面的东西,下载到GD32H757的板子里推理时间却需要700+ms,原始图片也是320_240,模型输入192_192,我是哪里没注意到么?有什么关键点会影响到这个推理时间吗?ARMCC和GCC会带来那么大的区别吗?CK_AHB,CK_APB1,CK_APB2,CK_SYS这几个频率是跟您的一样的。 image image

H7的芯片用CM4的会有什么影响吗?

a850f3d3493cfb7d76cf5d30531dd97

Q2

分离模型的两个参数separation和separation_scale的作用是什么呢?看您文章里说分离模型会降低精度,所以我们在训练的时候做了一点修改,train.py没有用到separation和separation_scale参数(如下图),.data文件里直接删除了separation、separation_scale、conf_thr=0.001,nms_thr=0.5,iou_thr=0.4。因为我们自身的模型本身精度不高,所以不想牺牲精度,不用分离模型,但是我们这么直接改是不是有问题呢? d8d1d2d3a9ed958927f1d3ba957de47 image

Q3

我们用自己的数据集跑出来之后,AP大概为0.6,但是运行deploy.py量化之后AP变成了0.1,小目标检测,(此时.data里面没有separation、separation_scale、conf_thr=0.001,nms_thr=0.5,iou_thr=0.4这些参数)降的有点太多了,您遇到过类似问题嘛?请问您知道改哪里可以让它不降那么多么?跟分离模型有关系吗? image image

Q4

这个cubeAI最后给出的输出结果是什么格式的呢?跟什么有关呢?是CubeAi官方固定的输出格式还是跟模型训练的配置有关?.data文件不配置separation和separation_scale参数,生成的C代码就一个network1,您下面这个处理函数是不是只是针对带有分离模型的?所以想重新处理模型的输出,应该怎么解读最原始的输出呢?另外,图中您这个处理函数的逻辑是什么?经过您这个函数,处理后reg,reg+1,reg+2,reg+3里面是不是目标框的X,Y,W,H么?cls_index是通过什么逻辑得出来?恳请指教

红框的逻辑都没看太懂

84c87413d47af2a99acbecc8145088f

不好意思大佬,问的问题有点多,恳请指教,谢谢作者大大!

@mzxxyg 对于第一点,ARMCC会比GCC多大约50%的时间,比如256x256在使用ARMCC编译器的情况下是360ms左右,使用GCC编译器的情况下是230ms左右。对于你的在192x192分辨率下推理一遍需要700+ms,你首先需要检查是否使用了外部内存SDRAM。如果使用了,并且允许ZI段编译在外部内存,则你需要确保ai_model.c文件中的全局变量在SRAM中初始化,而不是在SDRAM中初始化,这两种内存速度差异很大,外部内存会降低推理速度,同时也要保证栈是在SRAM中的。其次你需要检查是否开启了一级缓存,即Dcache和Icache,如果没有开启推理速度会慢很多。X-CUBE-AI提供的推理库会进行CRC校验,如果不是使用STM32的板子,除非CRC寄存器地址和用法一样,不然推理库会初始化失败。恰好GD32H7,GD32F4,STM32F4的CRC寄存器地址是一样的,所以使用的是CM4,而CM7是用不了的,但是至少目前看来用CM4是正常的。 对于第二点,分离式模型可以大幅降低模型推理时的内存占用峰值,但是不会降低太多模型的性能,当然如果你觉得内存足够,你可以直接设置separation=0来不使用它。你的修改是可以的,因为separation参数不设置的话默认值为0。 对于第三点,这种情况我没遇到过,不过如果是小目标检测,则预测的目标框相对大目标来说会有较大偏移,因为框的坐标也会被量化。当然具体为什么降低这么多我也不知道,你可以尝试对tflite和onnx文件中每层的计算进行输出,看看是哪层计算差异比较大。 对于第四点,在这个模型中,最终输出的格式为num_pred×(3_num_reg+3_num_anchor+num_class)。红框所圈的是对结果的解码过程,应该是YOLOv5的结果的处理过程,我是根据YoloFatestV2原项目中utils.py文件中的handel_preds函数使用C语言实现的。你可以参考YOLOv5的结果处理过程或YoloFatestV2原项目中utils.py文件中的handel_preds函数来理解红框所圈的代码逻辑

好的 ,多谢大佬,等我考完试仔细研究下您说的关于内存的事。另外关于ARMCC切换为GCC的过程,我在海棠派的例程上和GD32H759I_EVAL的例程上直接切换编译器,keil会直接崩掉闪退,请问我这么操作是不是不太对? image

HomiKetalys commented 3 months ago

 作者大大,您好,想请教几个问题,不好意思哈问题有点多。

Q1

复现过了您github里面训练好的模型,直接用的下图文件夹里面的Edge_AI文件夹里面的东西,下载到GD32H757的板子里推理时间却需要700+ms,原始图片也是320_240,模型输入192_192,我是哪里没注意到么?有什么关键点会影响到这个推理时间吗?ARMCC和GCC会带来那么大的区别吗?CK_AHB,CK_APB1,CK_APB2,CK_SYS这几个频率是跟您的一样的。 image image

H7的芯片用CM4的会有什么影响吗?

a850f3d3493cfb7d76cf5d30531dd97

Q2

分离模型的两个参数separation和separation_scale的作用是什么呢?看您文章里说分离模型会降低精度,所以我们在训练的时候做了一点修改,train.py没有用到separation和separation_scale参数(如下图),.data文件里直接删除了separation、separation_scale、conf_thr=0.001,nms_thr=0.5,iou_thr=0.4。因为我们自身的模型本身精度不高,所以不想牺牲精度,不用分离模型,但是我们这么直接改是不是有问题呢? d8d1d2d3a9ed958927f1d3ba957de47 image

Q3

我们用自己的数据集跑出来之后,AP大概为0.6,但是运行deploy.py量化之后AP变成了0.1,小目标检测,(此时.data里面没有separation、separation_scale、conf_thr=0.001,nms_thr=0.5,iou_thr=0.4这些参数)降的有点太多了,您遇到过类似问题嘛?请问您知道改哪里可以让它不降那么多么?跟分离模型有关系吗? image image

Q4

这个cubeAI最后给出的输出结果是什么格式的呢?跟什么有关呢?是CubeAi官方固定的输出格式还是跟模型训练的配置有关?.data文件不配置separation和separation_scale参数,生成的C代码就一个network1,您下面这个处理函数是不是只是针对带有分离模型的?所以想重新处理模型的输出,应该怎么解读最原始的输出呢?另外,图中您这个处理函数的逻辑是什么?经过您这个函数,处理后reg,reg+1,reg+2,reg+3里面是不是目标框的X,Y,W,H么?cls_index是通过什么逻辑得出来?恳请指教

红框的逻辑都没看太懂

84c87413d47af2a99acbecc8145088f

不好意思大佬,问的问题有点多,恳请指教,谢谢作者大大!

@mzxxyg 对于第一点,ARMCC会比GCC多大约50%的时间,比如256x256在使用ARMCC编译器的情况下是360ms左右,使用GCC编译器的情况下是230ms左右。对于你的在192x192分辨率下推理一遍需要700+ms,你首先需要检查是否使用了外部内存SDRAM。如果使用了,并且允许ZI段编译在外部内存,则你需要确保ai_model.c文件中的全局变量在SRAM中初始化,而不是在SDRAM中初始化,这两种内存速度差异很大,外部内存会降低推理速度,同时也要保证栈是在SRAM中的。其次你需要检查是否开启了一级缓存,即Dcache和Icache,如果没有开启推理速度会慢很多。X-CUBE-AI提供的推理库会进行CRC校验,如果不是使用STM32的板子,除非CRC寄存器地址和用法一样,不然推理库会初始化失败。恰好GD32H7,GD32F4,STM32F4的CRC寄存器地址是一样的,所以使用的是CM4,而CM7是用不了的,但是至少目前看来用CM4是正常的。 对于第二点,分离式模型可以大幅降低模型推理时的内存占用峰值,但是不会降低太多模型的性能,当然如果你觉得内存足够,你可以直接设置separation=0来不使用它。你的修改是可以的,因为separation参数不设置的话默认值为0。 对于第三点,这种情况我没遇到过,不过如果是小目标检测,则预测的目标框相对大目标来说会有较大偏移,因为框的坐标也会被量化。当然具体为什么降低这么多我也不知道,你可以尝试对tflite和onnx文件中每层的计算进行输出,看看是哪层计算差异比较大。 对于第四点,在这个模型中,最终输出的格式为num_pred×(3_num_reg+3_num_anchor+num_class)。红框所圈的是对结果的解码过程,应该是YOLOv5的结果的处理过程,我是根据YoloFatestV2原项目中utils.py文件中的handel_preds函数使用C语言实现的。你可以参考YOLOv5的结果处理过程或YoloFatestV2原项目中utils.py文件中的handel_preds函数来理解红框所圈的代码逻辑

好的 ,多谢大佬,等我考完试仔细研究下您说的关于内存的事。另外关于ARMCC切换为GCC的过程,我在海棠派的例程上和GD32H759I_EVAL的例程上直接切换编译器,keil会直接崩掉闪退,请问我这么操作是不是不太对? image

你可能需要在 image 这个界面关闭警告。闪退可能是因为gcc输出的信息太多,超出了keil限制。

mzxxyg commented 3 months ago

 作者大大,您好,想请教几个问题,不好意思哈问题有点多。

Q1

复现过了您github里面训练好的模型,直接用的下图文件夹里面的Edge_AI文件夹里面的东西,下载到GD32H757的板子里推理时间却需要700+ms,原始图片也是320_240,模型输入192_192,我是哪里没注意到么?有什么关键点会影响到这个推理时间吗?ARMCC和GCC会带来那么大的区别吗?CK_AHB,CK_APB1,CK_APB2,CK_SYS这几个频率是跟您的一样的。 image image

H7的芯片用CM4的会有什么影响吗?

a850f3d3493cfb7d76cf5d30531dd97

Q2

分离模型的两个参数separation和separation_scale的作用是什么呢?看您文章里说分离模型会降低精度,所以我们在训练的时候做了一点修改,train.py没有用到separation和separation_scale参数(如下图),.data文件里直接删除了separation、separation_scale、conf_thr=0.001,nms_thr=0.5,iou_thr=0.4。因为我们自身的模型本身精度不高,所以不想牺牲精度,不用分离模型,但是我们这么直接改是不是有问题呢? d8d1d2d3a9ed958927f1d3ba957de47 image

Q3

我们用自己的数据集跑出来之后,AP大概为0.6,但是运行deploy.py量化之后AP变成了0.1,小目标检测,(此时.data里面没有separation、separation_scale、conf_thr=0.001,nms_thr=0.5,iou_thr=0.4这些参数)降的有点太多了,您遇到过类似问题嘛?请问您知道改哪里可以让它不降那么多么?跟分离模型有关系吗? image image

Q4

这个cubeAI最后给出的输出结果是什么格式的呢?跟什么有关呢?是CubeAi官方固定的输出格式还是跟模型训练的配置有关?.data文件不配置separation和separation_scale参数,生成的C代码就一个network1,您下面这个处理函数是不是只是针对带有分离模型的?所以想重新处理模型的输出,应该怎么解读最原始的输出呢?另外,图中您这个处理函数的逻辑是什么?经过您这个函数,处理后reg,reg+1,reg+2,reg+3里面是不是目标框的X,Y,W,H么?cls_index是通过什么逻辑得出来?恳请指教

红框的逻辑都没看太懂

84c87413d47af2a99acbecc8145088f

不好意思大佬,问的问题有点多,恳请指教,谢谢作者大大!

@mzxxyg 对于第一点,ARMCC会比GCC多大约50%的时间,比如256x256在使用ARMCC编译器的情况下是360ms左右,使用GCC编译器的情况下是230ms左右。对于你的在192x192分辨率下推理一遍需要700+ms,你首先需要检查是否使用了外部内存SDRAM。如果使用了,并且允许ZI段编译在外部内存,则你需要确保ai_model.c文件中的全局变量在SRAM中初始化,而不是在SDRAM中初始化,这两种内存速度差异很大,外部内存会降低推理速度,同时也要保证栈是在SRAM中的。其次你需要检查是否开启了一级缓存,即Dcache和Icache,如果没有开启推理速度会慢很多。X-CUBE-AI提供的推理库会进行CRC校验,如果不是使用STM32的板子,除非CRC寄存器地址和用法一样,不然推理库会初始化失败。恰好GD32H7,GD32F4,STM32F4的CRC寄存器地址是一样的,所以使用的是CM4,而CM7是用不了的,但是至少目前看来用CM4是正常的。 对于第二点,分离式模型可以大幅降低模型推理时的内存占用峰值,但是不会降低太多模型的性能,当然如果你觉得内存足够,你可以直接设置separation=0来不使用它。你的修改是可以的,因为separation参数不设置的话默认值为0。 对于第三点,这种情况我没遇到过,不过如果是小目标检测,则预测的目标框相对大目标来说会有较大偏移,因为框的坐标也会被量化。当然具体为什么降低这么多我也不知道,你可以尝试对tflite和onnx文件中每层的计算进行输出,看看是哪层计算差异比较大。 对于第四点,在这个模型中,最终输出的格式为num_pred×(3_num_reg+3_num_anchor+num_class)。红框所圈的是对结果的解码过程,应该是YOLOv5的结果的处理过程,我是根据YoloFatestV2原项目中utils.py文件中的handel_preds函数使用C语言实现的。你可以参考YOLOv5的结果处理过程或YoloFatestV2原项目中utils.py文件中的handel_preds函数来理解红框所圈的代码逻辑

好的 ,多谢大佬,等我考完试仔细研究下您说的关于内存的事。另外关于ARMCC切换为GCC的过程,我在海棠派的例程上和GD32H759I_EVAL的例程上直接切换编译器,keil会直接崩掉闪退,请问我这么操作是不是不太对? image

你可能需要在 image 这个界面关闭警告。闪退可能是因为gcc输出的信息太多,超出了keil限制。

试了一下 还是会闪退 我回来再仔细研究下怎么切换 看看我是不是有地方没有改 多谢大佬