过年这几天把SSD、YOLO、DSOD之类用Tensorflow实现了顺便训练了一遍(起因是ObjectDetect API想魔改不是很方便),有些想法吧。
具体是SSD-VGG16、YOLOv2、DSOD。训练上DSOD能收敛,但是我的电脑上训练太慢,增广和生成GroundTruth那块写了太多限制,迭代挺慢的,回学校再看看吧。
记录下自己写实现的时候的一些感觉把,SSD本身给我的感觉就像是多尺度匹配,最早的VGG16版本给我的感觉就是各个尺度做匹配,控制感受野去做,后面的Resnet、Inception Based版本则是特征的多尺度更好了一些。不过SSD我觉得相对而言参数量还好,深鉴科技那边把SSD300运算量压缩到11GOPs/Img。YOLOv2给我的感觉是用网络做了多尺度,然后Reorg引入低尺度特征改善小目标检测,这个GRP-DSOD也有用到,但是最后预测数量可能少一些。DSOD则更多的是为了显示不需要预训练和参数利用率高。相对而言,SSD应该是部署应该最容易的,YOLO也还行,DSOD的DenseNet层,目前问了深鉴无法做到很好的硬件加速,华为NPU估计也不好做(年前发了申请要HiAI的SDK一直没给回复)。目前感觉这些网络迁移用起来其实YOLO是最适合迁移别的任务的。
有空考虑在SNPE上测试。
DSOD的TF实现,没完成训练,有兴趣可以训练下。给我个反馈。
关于YOLOv3,大概结构是这样吧,看了下Upsample部分应该是最近邻插值的方法,使用了几个残差模块最后一个模块中前一个卷积层的输出,不要在意为什么这么丑,不要在意scope为什么这么乱。upsample因为tf没有这种层,so用卷积转置或者stn做代替,或者用卷积转置自己写个核就能实现最近邻插值的功能。
封面图拍自大唐芙蓉园。