HomiKetalys / gd32ai-modelzoo

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

训练的问题 #2

Closed nyjshinibaba closed 3 months ago

nyjshinibaba commented 4 months ago

@HomiKetalys 想问大佬,如果是在8卡服务器上跑,带卡号的,需要修改哪些地方,我现在改batchsize貌似对显存占用没有什么影响,一直是百分之20多这是为什么

HomiKetalys commented 4 months ago

我的训练脚本是没有提供分布式训练的,这种超轻量级网络一般单卡就行了,我这单卡3060是吃不满的。如果训练速度慢,一般是数据预处理阶段速度慢,比如resize和augmentation,你可以考虑先将数据集预处理一遍保存

nyjshinibaba commented 4 months ago

@HomiKetalys 请问大佬单卡训练训300个epoch在coco上花了多长时间

HomiKetalys commented 4 months ago

5到6个小时

nyjshinibaba commented 4 months ago

@HomiKetalys 哥们想和你请教一些问题,这个检测模型好换么,怎么看他模型的参数量能否下载到板子里

HomiKetalys commented 4 months ago

@nyjshinibaba 检测模型不太好换,现有的多数轻量级网络还是要修改一下网络结构降低计算量和参数量。看一个模型能不能下载到板子里,首先看占用的内存峰值,一般来说,占用的内存峰值会比最大的特征图大小大一些,一般就是第一层卷积的特征图,比如320x320分辨率的特征图,假设通道数为24,则量化后的特征图大小为160x160x24Byte=600KB,占用内存峰值可能就是650KB。当然,如果你能理解我提供的分离式模型的思想,修改模型的推理过程,内存峰值至少可以降低70%左右。其次看模型的参数量,对于量化模型,假设其参数量为1M,则其占用的flash大小一般是1MB。

nyjshinibaba commented 4 months ago

@HomiKetalys 大佬,我现在复现完了,但是gcc版本的编译会报很多找不到文件的错误,但是armcc版本就没有这个问题,但是我发现您给的deploy.py只能生成gcc工程,这该如何解决呢,或者说如何生成armcc的工程呢 屏幕截图 2024-06-01 120312

nyjshinibaba commented 4 months ago

@HomiKetalys 大佬,这是我的gcc版本的配置 ![Uploading 屏幕截图 2024-06-01 120651.png…]()

nyjshinibaba commented 4 months ago

屏幕截图 2024-06-01 120735

nyjshinibaba commented 4 months ago

![Uploading 屏幕截图 2024-06-01 120651.png…]()

HomiKetalys commented 4 months ago

@HomiKetalys 大佬,我现在复现完了,但是gcc版本的编译会报很多找不到文件的错误,但是armcc版本就没有这个问题,但是我发现您给的deploy.py只能生成gcc工程,这该如何解决呢,或者说如何生成armcc的工程呢 屏幕截图 2024-06-01 120312

这应该是include的目录配置不太对,你可以检查一下include的目录是否如以下图片中的内容所示。 image 如果一样还是不行,可以试着删除这些目录重新添加一下。

nyjshinibaba commented 4 months ago

好的,我将去尝试一下大佬的意见

nyjshinibaba commented 4 months ago

@HomiKetalys 大佬,还有个问题,运行deploy会生成哪些东西呀,为什么我设置一个空路径运行,它没有生成任何东西 python deploy.py --data results/train/coco_sp_0001/coco_sp.data --model_path results/train/ --model_path results/train/coco_sp_0001/best.pth --convert_type 1 --tflite_val_pa th "D:\A_dataset\coco\images\val2017" --gd32_project_path deployment/gd32h759IMK6_ARMCC --series h7 --compiler 0 这里的deployment/gd32h759IMK6_ARMCC我将原工程里这部分删掉了,运行deploy并没有生成这个文件夹

HomiKetalys commented 4 months ago

@HomiKetalys 大佬,还有个问题,运行deploy会生成哪些东西呀,为什么我设置一个空路径运行,它没有生成任何东西 python deploy.py --data results/train/coco_sp_0001/coco_sp.data --model_path results/train/ --model_path results/train/coco_sp_0001/best.pth --convert_type 1 --tflite_val_pa th "D:\A_dataset\coco\images\val2017" --gd32_project_path deployment/gd32h759IMK6_ARMCC --series h7 --compiler 0 这里的deployment/gd32h759IMK6_ARMCC我将原工程里这部分删掉了,运行deploy并没有生成这个文件夹

目前这个参数--gd32_project_path在代码里忘记用了,默认会生成到results/deploy/{cfgname}{order_number}/Edge_AI中,比如results/deploy/coco_0001/Edge_AI,然后你复制Edge_AI文件夹到你的工程文件夹中。当然你也可以将deploy.py中的 lger.collect_prints(deploy_main, opt, lger.result_path, lger.result_path) 改成 lger.collect_prints(deploy_main, opt, lger.result_path, opt.gd32_project_path) 这样就会生成到你设置的工程文件夹中

nyjshinibaba commented 4 months ago

@HomiKetalys 也就说network.c不会生成,需要自己根据模型结构去写么

nyjshinibaba commented 4 months ago

@HomiKetalys 如果需要自己去写的话,那么有相关教程么,怎么去写edge_ai路径下的那些c文件和h文件

HomiKetalys commented 4 months ago

@nyjshinibaba 啊不是,会生成,现在是生成到results/deploy/{cfgname}{order_number}/Edge_AI中。然后手动复制到你的keil5工程文件夹中。指定参数--gd32_project_path的本意是自动复制生成的文件到指定的keil5工程文件中,就不用手动复制了。

nyjshinibaba commented 4 months ago

@HomiKetalys 屏幕截图 2024-06-01 162935 那为什么我运行生成之后Edge_AI下的model里并没有标准工程中的东西

nyjshinibaba commented 4 months ago

@HomiKetalys 屏幕截图 2024-06-01 163036 这是标准的edge——ai目录下的东西

HomiKetalys commented 4 months ago

@HomiKetalys 屏幕截图 2024-06-01 163036 这是标准的edge——ai目录下的东西

抱歉抱歉,我提供的执行deploy.py的命令有点问题,还需要指定参数--stm32cubeai_path,指定X-CUBE-AI推理框架生成对应的C代码,比如 --stm32cubeai_path "D:/STM32CubeIDE_1.12.1/STM32CubeIDE/STM32Cube/Repo/Packs/STMicroelectronics/X-CUBE-AI/8.0.1" 当然,你需要预先安装好STM32CubeIDE,并且在STM32CubeIDE中安装好X-CUBE-AI

nyjshinibaba commented 4 months ago

@HomiKetalys 屏幕截图 2024-06-01 163728 屏幕截图 2024-06-01 163816 屏幕截图 2024-06-01 164009

大佬,我指定了,但是还是没生成,这是因为我安装的问题么,因为我的cubeai包装在默认路径,而stm32cube装在我的指定路径了

HomiKetalys commented 4 months ago

@nyjshinibaba image 缺失Utilities文件夹。这个有个坑,目前看来,这个文件夹需要你在STM32CubeIDE中随便创建一个工程,按下图所示点击。 image image 正常来说STM32CubeIDE就会开始下载一个工具包,下载完之后就有Utilities文件夹了。应该就能正常使用了。

nyjshinibaba commented 4 months ago

@HomiKetalys 大佬,我新建一个工程,他下面并没有产生X-cube_ai这个文件夹怎么办

HomiKetalys commented 4 months ago

@HomiKetalys 大佬,我新建一个工程,他下面并没有产生X-cube_ai这个文件夹怎么办

或者你可以在这个网址https://www.st.com/en/embedded-software/x-cube-ai.html#get-software 中下载8.0.1版本的zip文件,并解压。然后将windows文件夹复制到Utilities文件夹中 image image

HomiKetalys commented 4 months ago

@HomiKetalys 大佬,我新建一个工程,他下面并没有产生X-cube_ai这个文件夹怎么办

我圈的不是很准确,应该双击那个.ioc文件。应该依次点击.ioc文件,Middleware and Software Packs,X-CUBE-AI。 image

image

nyjshinibaba commented 4 months ago

@HomiKetalys 前面那种方法失败了,我在试试这个直接移植文件夹的方法行不行

nyjshinibaba commented 4 months ago

@HomiKetalys 屏幕截图 2024-06-01 192746 试了第二种方法,卡在这里不动了,是本来就很慢么

HomiKetalys commented 4 months ago

@HomiKetalys 屏幕截图 2024-06-01 192746 试了第二种方法,卡在这里不动了,是本来就很慢么

主要是生成文件过程中途会对生成的量化tflite在测试集上计算量化模型的性能指标,这一步比较慢。你可以设置--eval 0关闭这一步。不过看图中已经结束这一步了,下一步是调用命令行生成代码,应该很快的。

HomiKetalys commented 4 months ago

@HomiKetalys 屏幕截图 2024-06-01 192746 试了第二种方法,卡在这里不动了,是本来就很慢么

主要是生成文件过程中途会对生成的量化tflite在测试集上计算量化模型的性能指标,这一步比较慢。你可以设置--eval 0关闭这一步。不过看图中已经结束这一步了,下一步是调用命令行生成代码,应该很快的。

我这边也用第二种方法试了,下载的zip文件是没有问题的。可能是控制台调用命令过程出现了问题。你试着在控制台执行以下命令

{stm32ai_exe_path} generate --name network_1 --m {model_path} --type tflite --compression none --verbosity 1 --workspace {work_space_path} --output {output_path} --allocate-inputs --series stm32h7 --allocate-outputs

其中{stm32ai_exe_path}可能如下

D:\STM32CubeIDE_1.12.1\STM32CubeIDE\STM32Cube\Repo\Packs\STMicroelectronics\X-CUBE-AI\8.0.1\Utilities\windows\stm32ai.exe

{model_path}为tflite文件的路径 {work_space_path}为保存临时文件文件夹路径 {output_path}为保存生成的c代码的文件夹路径 我的某次运行的命令示例如下

D:/STM32CubeIDE_1.12.1/STM32CubeIDE/STM32Cube/Repo/Packs/STMicroelectronics/X-CUBE-AI/8.0.1\Utilities\windows\stm32ai.exe generate --name network_1 -m results/deploy\coco_sp_0012\tflite\model_front.tflite --type tflite --compression none --verbosity 1 --workspace results/deploy\coco_sp_0012\temp --output results/deploy\coco_sp_0012\Edge_AI\model --allocate-inputs --series stm32h7 --allocate-outputs
nyjshinibaba commented 4 months ago

@HomiKetalys 现在有个很关键的问题是我的cubeai包安装并不在stm32cubemaxide的路径下,这个会影响么

HomiKetalys commented 4 months ago

@HomiKetalys 现在有个很关键的问题是我的cubeai包安装并不在stm32cubemaxide的路径下,这个会影响么

应该不会,IDE只是用来下载X-CUBE-AI的。

nyjshinibaba commented 4 months ago

@HomiKetalys 屏幕截图 2024-06-03 092437 大佬,这里我的tflite里的目录对么,还有如果要生成network2相关的东西,是同样的指令给1换成2么

nyjshinibaba commented 4 months ago

@HomiKetalys 我看armcc中使用的是有network1和2

nyjshinibaba commented 4 months ago

@而且这样操作虽然产生了models下面的文件,但是没有产生ai_model.c,ai_model.h两个文件和utils文件夹 屏幕截图 2024-06-03 093850 屏幕截图 2024-06-03 093935

nyjshinibaba commented 4 months ago

@HomiKetalys 屏幕截图 2024-06-03 100512 而且我去仔细看了下,我自己生成的network.h中的参数明显有错误,比如输出的宽高

nyjshinibaba commented 4 months ago

@HomiKetalys 不知道您是否有空加一个联系方式,需要进一步一些讨论和交流

HomiKetalys commented 4 months ago

@HomiKetalys 不知道您是否有空加一个联系方式,需要进一步一些讨论和交流

你给个联系方式,我加你吧

nyjshinibaba commented 4 months ago

@HomiKetalys 18055627152

HomiKetalys commented 4 months ago

@HomiKetalys 18055627152

这是微信嘛

mikemotto commented 4 months ago

大佬,我的遇到的和之前那位兄弟遇到的问题差不多, C:\Users\luomo\STM32Cube\Repository\Packs\STMicroelectronics\X-CUBE-AI\8.0.1\Utilities\windows\stm32ai.exe generate --name network_2 -m D:\gd32ai-modelzoo-main\object_detection\yolo_fastestv2\results/deploy\coco_sp_0009\tflite\model_post.tflite --type tflite --compression none --verbosi ty 1 --workspace D:\gd32ai-modelzoo-main\object_detection\yolo_fastestv2\results/deploy\coco_sp_0009\temp --output D:\gd32ai-modelzoo-main\object_detection\yolo_fastestv2\results/deploy\coco_sp_0009\Edge_AI\model --allocate-inputs --series stm32f4 --allocate-outputs ,我用这个想生成第2个 network_2 ,但是我是训练自己的数据只检测一个类,它报了Neural Network Tools for STM32AI v1.7.0 (STM.ai v8.0.1-19451),TOOL ERROR: Applying softmax on single element,不知道大佬能不能讨论讨论,微信:18773437317

HomiKetalys commented 4 months ago

大佬,我的遇到的和之前那位兄弟遇到的问题差不多, C:\Users\luomo\STM32Cube\Repository\Packs\STMicroelectronics\X-CUBE-AI\8.0.1\Utilities\windows\stm32ai.exe generate --name network_2 -m D:\gd32ai-modelzoo-main\object_detection\yolo_fastestv2\results/deploy\coco_sp_0009\tflite\model_post.tflite --type tflite --compression none --verbosi ty 1 --workspace D:\gd32ai-modelzoo-main\object_detection\yolo_fastestv2\results/deploy\coco_sp_0009\temp --output D:\gd32ai-modelzoo-main\object_detection\yolo_fastestv2\results/deploy\coco_sp_0009\Edge_AI\model --allocate-inputs --series stm32f4 --allocate-outputs ,我用这个想生成第2个 network_2 ,但是我是训练自己的数据只检测一个类,它报了Neural Network Tools for STM32AI v1.7.0 (STM.ai v8.0.1-19451),TOOL ERROR: Applying softmax on single element,不知道大佬能不能讨论讨论,微信:18773437317

@mikemotto 单类别确实会有这个bug,单类别下目标的置信度只取决于obj,所以cls分量就不用输出了。

修改文件detector.py 中的第213行到220行为

                if out_cls_2.shape[1]==1:
                    out_2 = torch.cat((out_reg_2, out_obj_2), dim=1)
                else:
                    out_2 = torch.cat((out_reg_2, out_obj_2, out_cls_2), dim=1)
                bs, ch, h, w = out_2.shape
                out_2 = torch.reshape(out_2, (bs, ch, h * w))

                if out_cls_3.shape[1]==1:
                    out_3 = torch.cat((out_reg_3, out_obj_3), dim=1)
                else:
                    out_3 = torch.cat((out_reg_3, out_obj_3, out_cls_3), dim=1)
                bs, ch, h, w = out_3.shape
                out_3 = torch.reshape(out_3, (bs, ch, h * w))
                out = torch.cat((out_2, out_3), dim=2)

并修改文件utils.c 的27到36行为:

        u32 cls_index=0;
        float cls=0;
        if(AI_NETWORK_OUT_1_CHANNEL==15)
            cls=1;
        else
        {
            for(j=15;j<AI_NETWORK_OUT_1_CHANNEL;j++)
            {
                if(*(preds+AI_NETWORK_OUT_1_CHANNEL*i+j)>cls)
                {
                    cls=*(preds+AI_NETWORK_OUT_1_CHANNEL*i+j);
                    cls_index=j-15;
                }
            }
        }

我会在下一次更新时修复这个bug。

mikemotto commented 4 months ago

非常感谢大佬的回复!!!

---原始邮件--- 发件人: "Homi @.> 发送时间: 2024年6月4日(周二) 凌晨0:14 收件人: @.>; 抄送: @.**@.>; 主题: Re: [HomiKetalys/gd32ai-modelzoo] 训练的问题 (Issue #2)

大佬,我的遇到的和之前那位兄弟遇到的问题差不多, C:\Users\luomo\STM32Cube\Repository\Packs\STMicroelectronics\X-CUBE-AI\8.0.1\Utilities\windows\stm32ai.exe generate --name network_2 -m D:\gd32ai-modelzoo-main\object_detection\yolo_fastestv2\results/deploy\coco_sp_0009\tflite\model_post.tflite --type tflite --compression none --verbosi ty 1 --workspace D:\gd32ai-modelzoo-main\object_detection\yolo_fastestv2\results/deploy\coco_sp_0009\temp --output D:\gd32ai-modelzoo-main\object_detection\yolo_fastestv2\results/deploy\coco_sp_0009\Edge_AI\model --allocate-inputs --series stm32f4 --allocate-outputs ,我用这个想生成第2个 network_2 ,但是我是训练自己的数据只检测一个类,它报了Neural Network Tools for STM32AI v1.7.0 (STM.ai v8.0.1-19451),TOOL ERROR: Applying softmax on single element,不知道大佬能不能讨论讨论,微信:18773437317

@mikemotto 单类别确实会有这个bug,单类别下目标的置信度只取决于obj,所以cls分量就不用输出了。

修改文件detector.py 中的第213行到220行为 if out_cls_2.shape[1]==1: out_2 = torch.cat((out_reg_2, out_obj_2), dim=1) else: out_2 = torch.cat((out_reg_2, out_obj_2, out_cls_2), dim=1) bs, ch, h, w = out_2.shape out_2 = torch.reshape(out_2, (bs, ch, h w)) if out_cls_3.shape[1]==1: out_3 = torch.cat((out_reg_3, out_obj_3), dim=1) else: out_3 = torch.cat((out_reg_3, out_obj_3, out_cls_3), dim=1) bs, ch, h, w = out_3.shape out_3 = torch.reshape(out_3, (bs, ch, h w)) out = torch.cat((out_2, out_3), dim=2)
并修改文件utils.c 的27到36行为: u32 cls_index=0; float cls=0; if(AI_NETWORK_OUT_1_CHANNEL==15): cls=1; else { for(j=15;j<AI_NETWORK_OUT_1_CHANNEL;j++) { if((preds+AI_NETWORK_OUT_1_CHANNELi+j)>cls) { cls=(preds+AI_NETWORK_OUT_1_CHANNELi+j); cls_index=j-15; } } }
我会在下一次更新时修复这个bug。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

mzxxyg commented 4 months ago

报错2 报错1

请问大佬在部署运行deploy.py的时候有没有遇到这种错误 还有大佬用的环境是哪个版本的呢?

HomiKetalys commented 4 months ago

报错2 报错1

请问大佬在部署运行deploy.py的时候有没有遇到这种错误 还有大佬用的环境是哪个版本的呢?

这应该是onnx转tflite文件时出现的问题,你能否提供一下onnx文件呢

mzxxyg commented 4 months ago

报错2 报错1 请问大佬在部署运行deploy.py的时候有没有遇到这种错误 还有大佬用的环境是哪个版本的呢?

这应该是onnx转tflite文件时出现的问题,你能否提供一下onnx文件呢

大佬您好,我是用的gd32ai-modelzoo\object_detection\yolo_fastestv2\modelzoo\coco_sp_0004\deploy_for_80\onnx/model_front.onnx,您项目原有的,还没有上自己的模型,想着先把流程跑通。我昨天晚上查的问题,好像跟我的环境有关,我重新建了环境,上述问题目前没有再复现,谢谢大佬的回复,如果后续还有什么问题再请教您。

Glq200 commented 3 months ago

model.zip 大佬您好,这是我的onnx模型,yolov2fast训练的模型,也是有这个问题,在onnx转tflite文件时出现问题

1718041212304
HomiKetalys commented 3 months ago

model.zip 大佬您好,这是我的onnx模型,yolov2fast训练的模型,也是有这个问题,在onnx转tflite文件时出现问题 1718041212304

@Glq200 onnx文件是没有问题的,从报错内容上看,是keras的问题,我这keras版本是2.11.0。我看最新版是3.0.5,你可能安装的是最新版,你可以尝试将keras的版本降低到2.11.0。

Glq200 commented 3 months ago
1718121596996

image

昨天的问题解决了,谢谢大佬,但是后面这个问题不知道怎么搞,模型什么都转成功了,但是生成的文件夹都是空的,晚上搞了一会没有头绪

Glq200 commented 3 months ago
1718121822231

相应的步骤也都看了,不知道哪里没跟对

HomiKetalys commented 3 months ago

1718121596996 image 昨天的问题解决了,谢谢大佬,但是后面这个问题不知道怎么搞,模型什么都转成功了,但是生成的文件夹都是空的,晚上搞了一会没有头绪

@Glq200 首先检查你所框的部分所示路径中是否存在对应文件,如果不存在,检查这个路径的文件夹是否存在 image 如果不存在,则应该是X-CUBE-AI没装,你可以在STM32IDE界面检查是否安装完成。 image image