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

is it faster and less calculation by the mobilenet on datknet ? #1

Open
vicwer opened this issue Jul 4, 2017 · 66 comments
Open

is it faster and less calculation by the mobilenet on datknet ? #1

vicwer opened this issue Jul 4, 2017 · 66 comments

Comments

@vicwer
Copy link

vicwer commented Jul 4, 2017

is it faster and less calculation by the mobilenet on datknet ?
and...
thank you very much. You got my star.

@vicwer
Copy link
Author

vicwer commented Jul 4, 2017

e...
it seems cant work: Unused field: 'group = 32' the param 'group' doesnt exist in darknet.

@vicwer
Copy link
Author

vicwer commented Jul 4, 2017

你好,我在darknet上试了一下,好像darknet的卷积层不支持group分组,没有类似caffe中分组卷积的功能。请问你有什么解决办法吗?如何可以让darknet支持卷积时分组?

@zunzhumu
Copy link
Owner

zunzhumu commented Jul 5, 2017

对的,darknet是没有group的操作的,你得自己改下,我是自己改的卷积训练的。 mobilenet的速度和计算是取决于这个结构本身的计算方式,参数量少了很多。我刚也上传了mobilenetYOLO的结果,速度是有提高的,大概提高一倍。

@Sunmyfong
Copy link

@zunzhumu 你是用im2col+gemm实现group conv吗,还是传统的conv。我在darknet中尝试用im2col+gemm实现depthwise conv,但没成功,训练时nan了。能否参考下你的group conv实现?

@vicwer
Copy link
Author

vicwer commented Jul 5, 2017

@zunzhumu 你好,我本来也想尝试在darknet上将yolo和mobilenet结合的,但是卷积层的修改失败了,不知道如何可以实现depthwise conv的功能。请问可不可以上传一下你group conv 的实现呢,希望可以参考一下,谢谢了!

@zunzhumu
Copy link
Owner

zunzhumu commented Jul 5, 2017

@Sunmyfong 是阿,loop group就可以实现了阿,我是按照caffe的实现的,你可以参考caffe的,因为我是在公司实习的,代码不适合上传,不好意思

@zunzhumu
Copy link
Owner

zunzhumu commented Jul 5, 2017

@vicwer 推荐按照caffe的操作实现,虽然效率不高但好理解,后面可以再继续优化。其实不难的, 细心点就好了,因为在公司实习,代码不能上传,望理解,加油!

@vicwer
Copy link
Author

vicwer commented Jul 5, 2017

@zunzhumu 恩恩,理解理解,谢谢!那我也跟着caffe上的实现试试吧,请问大神修改卷积层花了多长时间啊?修改的卷积层是否支持GPU运算?

@zunzhumu
Copy link
Owner

zunzhumu commented Jul 5, 2017

@vicwer 改很快,验证是否可行花了点时间,有GPU的,因为我要训练,CPU和GPU都支持,

@aguang1201
Copy link

@zunzhumu 感谢你的分享,我给了star。google公开了ssd+mobilenet,我就在想YOLO+mobilenet应该也快了。我刚用你提供的mobilenet_yolo_voc.cfg跑YOLO2,发现生成的model还是很大。pb文件有236M,这比tiny YOLO的模型还大。楼主的模型大多呢?是不是我做错了什么

@zunzhumu
Copy link
Owner

@aguang1201 谢谢的star, mobilenetYOLO的大小是130多兆。因为原来yolov2前面的预训练模型darknet19_448是80M,后面的OD部分有120M左右,Mobilenet的大小是18M左右,所以看出来相对于SSDmobilenet, YOLOmobiletnet的权重减少并没有那么明显,所以通常我们根据特定的应用场景把后面的层也替换了,或者压缩了,后面的太冗余了。当然mobilent本身还可以稀疏化进一步加速的。

@zunzhumu
Copy link
Owner

@aguang1201 光Mobilenet加到YOLO里面,weights还是要比tiny-yolo大的多,我们不用mobilenet纯剪枝的方法已经把weights降到比tiny-yolo还小得多了。所以加了mobilenet不代表完事大吉了,后面也要考虑压缩的

@aguang1201
Copy link

@zunzhumu 感谢你的解答,很详细。确实还需要压缩和剪枝。很好的做法,谢谢!

@zunzhumu
Copy link
Owner

@aguang1201 没事,不客气。现在有很多的新的小的网络出来,毕竟压缩加速是工业上的一个最重要的部分。你可以看看shufflenet。加油

@aguang1201
Copy link

@zunzhumu 你推荐的shufflenet太棒了。孙剑老师的新作。我现在在做深度学习在移动端的落地应用。shufflenet比MobileNet更适合移动端。我要开动学习了。加油!!!

@vicwer
Copy link
Author

vicwer commented Jul 10, 2017

@Sunmyfong @aguang1201 各位大神都在darknet上实现了group conv吗?可否指导我一二。。。

@Sunmyfong
Copy link

@vicwer@zunzhumu 说的,细心点就可以了,不是很难。tiny-yolo-voc模型改成depthwise conv后,模型大小从原来的64M变成8M多点这样子,recall下降了6%,刚好看到shufflenet的出现,想把shuffle idea往现在的模型里面带,看下能否把这6%挽救回来。

@vicwer
Copy link
Author

vicwer commented Jul 10, 2017

@Sunmyfong 我也正在自己尝试着改,现在遇到一点疑惑可不可以请教一下?在gemm的函数实现中需不需要有什么改动,我本来对比着caffe看gemm的实现,但是把我弄晕了,直接在conv 层加group进行for 循环还是gemm得实现中还需要改动呢?

@Sunmyfong
Copy link

@vicwer cpu模式可以不改gemm的,gpu的话也可以不改,但是效率感人。github上有不用im2col+gemm的gpu版实现可以参考下,也可以参考下tf里面的depthwise实现💪

@vicwer
Copy link
Author

vicwer commented Jul 10, 2017

@Sunmyfong 可不可以给一下github上不用im2col+gemm的gpu版实现的地址,我在网站上没有找到这个。。。谢谢了!

@Sunmyfong
Copy link

@zunzhumu
Copy link
Owner

@Sunmyfong 优化后的group卷积在darknet上的加速能达到多少?用的是tf的?我还没考虑优化,之前想了自己的实现方案,但还没有时间去实验测试,反正几个GPU堆起来感觉速度挺快的啊,后面网络设计完了就要开始优化cpu的group卷积了

@Sunmyfong
Copy link

给个具体的,cpu i5 -4460.
1313512 -> 13131024,conv 400ms, depth 50ms.
不同size的层加速比基本在8x左右。
GPU:由于测的是小网络,只有几ms的加速,毕竟本来的卷积层只需要1ms左右,等后面测full-yolo时再更新下数据😊

@zunzhumu
Copy link
Owner

@Sunmyfong ,这里的conv指的是正常的卷积层?depth是group conv 的?还是两个都是group conv的,然后depth表示的是优化后的group conv?

@Sunmyfong
Copy link

conv是指正常卷积, depthwise:在cpu模式下是按照group conv搬过来的,没做啥优化;GPU模式下是自己重写的。

@zunzhumu
Copy link
Owner

@Sunmyfong 好的,我知道了,比较看重CPU的优化,毕竟做产品,后面自己优化下吧。GPU的我改了几个GPU并行的,所以速度影响不大。

@TonyMou
Copy link

TonyMou commented Jul 17, 2017

@zunzhumu @Sunmyfong 您好,我改好mobilenet-tiny-yolo的的网络结构训练voc的数据集,loss一直在23左右震荡,下不去,请问你训练的时候有什么trick吗?谢谢

@Sunmyfong
Copy link

@TonyMou 我的实验结果如下:

  1. tiny-yolo,用DWConv替换全部标准卷积,不用pre-trained model,一直震荡也是下不去
  2. tiny-yolo,用DWConv替换前9层,不用pre-trained model,recall 55%,比原版低6%
  3. tiny-yolo,标准卷积,不用pre-trained model,recall 50%
  4. full-yolo,用DWConv替换全部标准卷积,不用pre-trained model,recall 76%,感觉很难提升了
    可见,我的实验1与你的实验结果是类似的,我认为这个小模型在没有pre-trained model的帮助下,
    很难训练起来,它的参数量少得恐怖,我生成的model才800KB,也许是我打开方式不对?
    为了省时间,你可以考虑用 @zunzhumu 训练的mobilenet weights来fine-tune。
    我的pre-trained model还在漫长的训练中,希望后面可以把mobilenet-tiny-yolo训练起来,毕竟800K的model对我的应用而言还是很有吸引力。

@zunzhumu
Copy link
Owner

@TonyMou @Sunmyfong Sunmyfong的实验很对,已经说明了问题了。mobilentet的结构并不好,至少在yolo上简单的换一下的效果很不好,mobilenet我也稍微做了下减枝,就是吧全是0的删掉了,减了2到3兆,精度下降1%,可能finetune的epoch少了。在我的实验情况下,我觉得mobilenet的特征提取的效果不佳,不准备在上面花时间了,准备训练新的结构。

@TonyMou
Copy link

TonyMou commented Jul 17, 2017

@Sunmyfong 您好,谢谢你的回复,你在这方面已经做了很多工作了。
我是用dwconv替换了所有标准卷积,生成的参数量却还有7.4M,跟你的800K相差很大。除了把标准卷积替换成dwconv,还有别的工作需要做吗?
另外,你提到用dwconv替换前9层,但是tiny-yolo的原始结构一共只有9层卷积层啊?
谢谢。

@Sunmyfong
Copy link

@zunzhumu http://blog.csdn.net/hrsstudy/article/details/65644517
@TonyMou 把后面2个卷积层的filters从1024砍到256,然后fine-tune就行。我试过压到9M,精度下降明显,你也可以试下进一步减少层数或者filters,或许有新的惊喜。以下是我之前的实验记录,供参考。
Model RPs/Img IOU Recall
tiny-yolo-voc 2.51 51.36% 61.59%
tcomp3_55000 2.78 52.67% 62.81%

@abbyjako
Copy link

@zunzhumu 我计算YOLOmobiletnet后面的OD部分大概188M左右,请问您所说的是后面三个conv3X3和一个conv1x1吗?这样看来SSDmobilenet的权重要比YOLOmobiletnet要小,请问SSDmobilenet您计算的权重大小是多少呢?谢谢!

@zunzhumu
Copy link
Owner

zunzhumu commented Jul 20, 2017

@abbyjako YOLOmobilenet后面的OD部分的大小是120多M,后面是三个3x3和一个1x1。这是由于yolo本身前面的预训练模型就很小,性能也好,所以把直接替换成Mobilenet的话,权重减得并不多。SSD本身的权重比较集中在前面,所以换掉后权重比较小,大概四五十M吧,具体我没做,有别人做过,你可以直接用caffe替换掉SSD的前面部分试试。

@vicwer
Copy link
Author

vicwer commented Jul 25, 2017

@zunzhumu @Sunmyfong 各位有yolo提高精度的方法吗?如果把yolo和resnet这个样的网络结合一下,会不会有什么提升效果吗?

@OPPOA113
Copy link

各位,你们训练或者fine-tune的时候是在darknet下进行的吗?有没有人想转移到caffe下训练呢??
如果在caffe下训练是不是省很多麻烦?

@abbyjako
Copy link

@yytzjgsu 您好,我也是用Im2col+gemm实现的dw_conv,用了预训练模型,但是训练的时候loss到12左右就不再下降了,方便加QQ交流吗?我的QQ:1040806514,谢谢!

@yytzjgsu
Copy link

@zunzhumu 你好。我用了你的mobilenet预训练模型去做imagenet分类,结果发现所有图片的输入都会产生同样的输出。请问您的预训练模型参数保存有什么特殊的修改么?加载dw_conv层参数时顺序是 bias->BN参数->weights的顺序么?

@zunzhumu
Copy link
Owner

@yytzjgsu 参数没有特殊保存,就是darknet的

@wuxiaomin0110
Copy link

@zunzhumu
你好,我自己添加了group操作,然后用你训练出的.cfg和.weights文件进行分类,分类结果都是nan%,请问这个可能是我们的group操作不一致造成的吗?
另外,mobilenet_yolo_coco/voc.cfg 和mobilenet_yolo_coco/voc.weights是用来目标检测的,对吗?我同样没有检测出任何结果,请指导一下问题所在,非常感谢!

@zunzhumu
Copy link
Owner

@vmaxxwuxiaomin 可能你实现的问题,或者有些处理不一样,不过NAN很奇怪,首先你得保证你的是可以训练成功的,自己搭建个网络在cifa上训练看看能不能收敛,结果还不错。如果可以的话,就用我的weights fine-tune几个epochs试试

@wuxiaomin0110
Copy link

搞定了,感谢!

@zunzhumu
Copy link
Owner

@vmaxxwuxiaomin 恭喜,weights可以用吧?你可以试试我压缩了一大半的权重的mobilenet训练yolo看看效果。

@csaimd
Copy link

csaimd commented Sep 19, 2017

你好,大神,我是一个研究生菜鸟,能给个联系方式吗,邮箱,微信,qq都行,研究方向是yolo的压缩,跟您请教些问题 @Sunmyfong

@csaimd
Copy link

csaimd commented Sep 21, 2017

你好,能分享下group_layer吗,或者可以加您好友吗,跟你请教下学习下,微信,qq都可以,不方便放微信,qq,邮箱也可以,谢谢啦 @vmaxxwuxiaomin

@wuxiaomin0110
Copy link

wuxiaomin0110 commented Sep 22, 2017

@csaimd
你可以参考这个:https://github.com/hjimce/darknet_mobilenet ,还有他的博客,讲的很详细。
然后zhuzhumu训练的weights就可以用啦。

@wuxiaomin0110
Copy link

wuxiaomin0110 commented Sep 22, 2017

@zunzhumu
按照我的理解和实验,你压缩了的权重是用来分类的吧?我主要做object detection,不知道做物体检测时训练的权重是否也可压缩?

@zunzhumu
Copy link
Owner

@vmaxxwuxiaomin我压缩mobilenet是做分类的,目标检测的也是可以压缩的

@ArtyZe
Copy link

ArtyZe commented Oct 24, 2017

@vmaxxwuxiaomin 您好,我的用于物体检测的网络训练之后同样遇到了不能检测出物体的问题,avg loss大概在20左右,请问您那边是怎么解决的?谢谢

@MengXinChengXuYuan
Copy link

求问.weights文件是怎么可视化的?
有那种hd5f类似的工具吗?
已贡献小星星!

@zunzhumu
Copy link
Owner

@MengXinChengXuYuan 自己写的一个函数,好像作者在darknet下实现了可视化,我改写了下,在convolutional.c文件中的最后一个函数好像有,你试着读读这段代码

@LamHoCN
Copy link

LamHoCN commented Nov 15, 2017

作者你好
看到你的结果很高兴,我们组前面一直在研究prune and Quantification
不过我们的结果是的确可以将模型缩小很多,但是并不能提升速度,prune之后是weights是稀疏的,而我们的feature map是稠密的,在嵌入式上cache会很低,还不如没压缩的计算的快,由于稀疏的没有特性,也没办法针对的去写BLAS。
所以觉得结构上的优化才是比较好的,由于采用group进行depthconv 相当于groups次的gemm,我也写了特定的kernel去加速,可以一起交流一下。

@zunzhumu
Copy link
Owner

@LamHoCN 你好,很高兴和你交流,最近忙着毕业很久没有做这块的工作了,的确传统的for处理group会比较慢,一般优化用tensorflow里面的实现的方式,你单独自己实现了一个的确很厉害,可以交流交流,你写的kernel的速度跟for group相比,速度大概提高了多少倍?

@zunzhumu
Copy link
Owner

@LamHoCN 另一方面我的是整个kernel的prune的,没有处理成稀疏矩阵的那种形式,因为只有稀疏矩阵稀疏要一定程度才会有加速效果。直接kernel级别的prune mobilenet相对于原mobilenet速度上会有将近一倍的提升,剩下的再将group conv优化后再嵌入式上应该会运行得很好的。我的QQ是1312042684,欢迎交流

@ArtyZe
Copy link

ArtyZe commented Dec 7, 2017

@Sunmyfong 您好,请问您的Recall值是如何计算的呀,我按照yolo本身的recall,修改完detector中的路径后,所有的recall都没有,然后您的Recall、值是计算的测试集的平均recall吗,谢谢

@ljh14
Copy link

ljh14 commented May 8, 2018

@TonyMou 您好!我训练的时候也出现了loss函数在23左右就下不去的情况,请问你是如何解决的呢?

@SimonPrPr
Copy link

@wuxiaomin0110 你好请问你是怎么解决的呢?我按照你给的那个git和博客去训练了。但是不知道怎么用上@zunzhumu提供的weights和cfg。网络一直是发散状态。

@yueyilia
Copy link

@Sunmyfong 你好,我替换了yolo-tiny的全部卷积之后大概5M,不用pre-trained model,loss一直在4、5之间震荡,测试的效果不太好(我只检测人),请问你用了pre-trained model之后效果如何,如果有用的话能否给一个pre-trained model?这个训练起来太耗资源了,我可能无法在imagenet上训练。

@DW1HH
Copy link

DW1HH commented Jul 23, 2018

@zunzhumu 您好,darknet是不是已经支持分组卷积了呀。

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