Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
mzxxyg opened this issue Jun 13, 2024 · 4 comments
Open

Comments

@mzxxyg
Copy link

mzxxyg commented Jun 13, 2024

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

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
Copy link
Owner

HomiKetalys commented Jun 13, 2024

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

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
Copy link
Author

mzxxyg commented Jun 14, 2024

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

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
Copy link
Owner

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

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
Copy link
Author

mzxxyg commented Jun 14, 2024

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

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限制。

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants