kouxichao / crnn

Word recognition using ncnn
28 stars 10 forks source link

pytorch转化后的ncnn模型使用 #3

Closed DuckJ closed 4 years ago

DuckJ commented 5 years ago

您好,我把pytorch模型转换后,需要手动调整param中的结构,类似于这个repo根目录下的crnn.param,是么?然后下载您的ncnn的repo,编译ncnn,同时确保dlib安装编译了,然后操作下是不是就可以运行demo了啊?如果用官方的ncnn编译是不是不行啊

kouxichao commented 5 years ago

是的,或者你直接使用我fork的ncnn编译crnn就可以,里面有这个项目的,中英文都有。

kouxichao commented 5 years ago

官方的也可以,你把相应的层添加到里面就行。

DuckJ commented 5 years ago

相应的层指的是您自定义的bilstm么?如果说我不改pytorch转化为ncnn的param,然后调用官方的ncnn库区使用,这样行么

kouxichao commented 5 years ago

嗯嗯。使用官方也是可以的,有两种方法: 1.不改param也是可以的,但是如果使用静态param,你的权重文件很大,后面lstm的权重会复制十几次。

  1. 把param一分为二,(1)lstm前面的部分。(2)lstm循环的部分写成单独的param,代码里反复调用这个param,这样可以不增加权重文件的大小。 看你的需求。
DuckJ commented 5 years ago

3559A好像还是不错的,crnn在上面inference耗时感觉还是挺久的。请问大神你有什么优化措施么

DuckJ commented 5 years ago

嗯嗯。使用官方也是可以的,有两种方法: 1.不改param也是可以的,但是如果使用静态param,你的权重文件很大,后面lstm的权重会复制十几次。

  1. 把param一分为二,(1)lstm前面的部分。(2)lstm循环的部分写成单独的param,代码里反复调用这个param,这样可以不增加权重文件的大小。 看你的需求。

大神针对权重文件太大,所以自定义了bilstm层是吧,佩服。ncnn repo中看到了crnn的例子

DuckJ commented 5 years ago

请问一下,ncnn官方的支持lstm和bilstm么

kouxichao commented 5 years ago

最好使用nnie。官方的lstm代码也是一样的,不知道能不能跑现在,之前是不能用的,bilstm是没有。

DuckJ commented 5 years ago

感谢。我看ncnn repo下面提供的模型有chinese_crnn和chinese_crnn_lstm.请问这两个有什么区别吗? 还有就是英文识别的这个模型请问您是根据原来repo提供的模型转化的,还是自己训练了一个pytorch模型转化的啊

kouxichao commented 5 years ago

chinese_crnn是直接使用官方的op操作,没有加额外的层实现的(bin文件会很大),另一个是bilstm层实现的。原来的repo, 没有自己训练。

DuckJ commented 5 years ago

赞。英文的模型权重就直接是bilstm实现的是吧?明白了。还有您试过转onnx再转ncnn么

kouxichao commented 5 years ago

嗯嗯,没有试过,我做这个的时候onnx还没有呢,至少ncnn还没有,接口还都不太完善,中间过程多未必是件好事。

DuckJ commented 5 years ago

谢谢耐心的回复。感谢感谢。

DuckJ commented 5 years ago

hi, 我还有一个疑问就是,生成param的同时bin就生成了,后续我们的操作只是对param改了下,bin文件大小并没有动,怎么模型权重就变小了呢

kouxichao commented 5 years ago

转换的时候把重复的权重只保存一次,转换的时候要处理的。

kouxichao commented 5 years ago

一般框架都支持lstm, 权重本来就只有一份,直接取出来保存成bin就行。ncnn没有相应层(转换lstm工具)只能重复执行基本op。

DuckJ commented 5 years ago

所以 楼主提供的源码生成从pytorch模型到ncnn,就已经只保存一次模型权重了是么,生成的bin也就是只保存一次的模型

kouxichao commented 5 years ago

ncnn的转换工具也是只会把相应的lstm的的基础操作进行展开,同时每一次基础的op都会复制一遍,mxnet2ncnn代码已经改了,权重生成不会重复。自己转的话就是可控的。

kouxichao commented 5 years ago

对的,代码不知道上传了没,改一下还是简单的,添加一个转换层就行

DuckJ commented 5 years ago

应该是改了吧,我看代码生成的模型大小是30多M的,这应该是正常的吧

DuckJ commented 5 years ago

我刚试了下转onnx 然后ncnn,转onnx会有一些警告,然后转ncnn,直接报错Squeeze和LSTM 还没有支持

kouxichao commented 5 years ago

我没有传,那个pytorch2ncnn只是图像描述模型用的,lstm应该是没有转,lstmcell可以转。

肯定很正常,还是要改的,onnx没有看过,能得到源码从onnx转ncnn的代码,改一下应该是可以的。

DuckJ commented 5 years ago

您好,您的意思是pytorch2ncnn这里面的代码并不能得到最终的crnn模型么?没太明白,不好意思,还希望您解释一下。pytorch2ncnn得到的param我们需要手动改一下,得到的bin不是最终的bin么

kouxichao commented 5 years ago

我项目下的那个https://github.com/kouxichao/pytorch2ncnn确实不行,不能转lstm,lstmcell是可以的,你用ncnn提供的那个https://github.com/starimeL/PytorchConverter,需要稍微改一下ConvertLayer_ncnn.py,就可以。

我的应该是没有整理上传。

kouxichao commented 5 years ago

记录一下写过的权重,不重复写入就行

DuckJ commented 5 years ago

好的,感谢大佬

DuckJ commented 5 years ago

hi,关于这里的模型参数和https://pan.baidu.com/s/1sx2U5SRz0gAl3GRW3i-IEQ;提取码:1ugk中提供的param除了bilstm给替换了之外,我还注意到其它层的参数不一样,比如pooling层。 百度云param: Pooling MaxPool2d_4 1 1 Threshold_6 MaxPool2d_4 0=0 1=2 2=2 3=0 4=0 此工程目录param: Pooling MaxPool2d_4 1 1 Threshold_6 MaxPool2d_4 0=0 1=2 2=1 3=1 4=0 12=2 13=0 请问此工程目录的param不是百度云的代码转换得到的么,还是是其先转换得到,然后手动修改成了此工程目录param这样。 请问下,百度云里面的这种pooling参数使用会出错么

kouxichao commented 5 years ago

这个时间久了,已经忘记了,不过,这里的param肯定是是对的,可以运行的,如果经过转换代码转换的param的pooling层不一样的话,就应该是改了的。具体可以看看原来的pooling层的参数。

使用上面那个肯定要出错的,这个百度云只是如何转换模型的,里面的param不一定对。这些层参考原始模型的graph改一下就好。 image 这里面的模型都是对的,跟本项目里面的param是一样的,都是测试过的。

DuckJ commented 5 years ago

明白了,我也是看pytorch的模型,发现本项目下的param参数设置的更准确,百度云提供的有点差异。也就是您当时或许就是修改了pooling层这些的参数的,是么

DuckJ commented 5 years ago

我最近看ncnn的源码,我可以这么理解么?百度云里面代码保存的模型bin是没问题,里面的param需要我根据ncnn layer param的定义,调整正确是么

kouxichao commented 5 years ago

嗯呢

DuckJ commented 4 years ago

请问你还记得https://github.com/kouxichao/ncnn master分支的ncnn是基于官方的哪一个分支改的么?知道的话 还请告知一下,谢谢,非常感谢

kouxichao commented 4 years ago

你说的我不太理解? 不是只有master 分支吗? 你的意思是哪一次commit? image

DuckJ commented 4 years ago

就是当时fork tencent的ncnn时候是哪个版本的,还知道当时的tag是么

DuckJ commented 4 years ago

看commits应该是20190320是吧

kouxichao commented 4 years ago

应该是吧,我是后来又merge了原repo, 跟最新的相差应该不大,,merge一下应该都可以的

DuckJ commented 4 years ago

好的。crnn使用我看其实就是新建了bilstm和fullyconnected层是吧

kouxichao commented 4 years ago

嗯,主要是这两个

melon0504 commented 4 years ago

你好,请问你用nnie跑了crnn吗?