前言
花了一个月不到的时间单枪匹马把Yolov4模型部署到ZYNQ Ultrascale+ MPSOC上,这次把一整个过程和关键的几个要点都按照系列文章的形式展开,确保可以通过系列文章的形式完美复现我的工作。
本节内容包括重新训练darknet框架下的Yolov4
一、为什么重新训练darknet?
用之前DOTA数据集上训练Yolov4(darknet框架)在量化、编译结束后,部署到开发板上出现下述error。解释一下就是Yolov4里面存在XIR(Xilinx中间表示形式)未定义的操作符,也就是激活函数softplus。
回到Yolov4的网络结构图,网上随便找的。其中有个CBM模块,M表示mish激活函数。
而mish激活函数可以表达成如下的形式:
所以为什么会出现softplus的提示信息也就可以解释了,那又产生一个新问题,为什么会出现没有定义的情况,或者说,我们凭什么确定softplus没有被定义。这个问题需要回到Vitis-AI手册,在手册中我们可以看到量化并不支持softplus激活函数,所以我们的解决方案就是将Yolov4内的mish激活函数替换为leakyrelu,之所以可以这么做,其实主要还是可以接受两个激活函数的波形相似,当然最有力的支持证据还是在于我替换为leakyrelu函数以后得到的模型在服务器端、开发板都显示好的检测效果。
二、改进Yolov4结构
1.其他如常
darknet的训练依旧参照我在“DOTA与Yolov4(-Tiny)”中darknet那一节,但是需要事先参照接下来的第2节和第3节修改部分内容。
2.修改cfg文件
修改所有mish
函数为leaky
函数。
3.加快运行
./darknet detector train cfg/voc.data cfg/yolov4-custom-nomish.cfg yolov4.conv.137 -map -gpus 0,1,2 -dont_show
配合修改cfg文件内的
learning_rate=0.00087
burn_in=4000
max_batches = 30000
policy=steps
steps=24000,27000
scales=.1,.1
三、改进Yolov4结构后的推测效果
推测前
推测后
总结
重新调整了Yolov4的网络结构!