github上面发现有人实现了caffe版的centernet
大佬的github地址:https://github.com/yuqj1990/caffe_train
这篇博客记录下我在windows下编译支持centernet的caffe环境的编译过程以及尝试训练和测试。
首先看看作者实现的训练centernet所需的loss层:CenterObjectLoss
作者提供了:
CenternetLossLayer.cpp和CenternetLossLayer.hpp
此外在loss层里面对热力图分类使用了focalloss-sigmoid-loss,单独实现为:
focal_loss_layer_centernet.cpp和focal_loss_layer_centernet.cu,focal_loss_layer_centernet.hpp
这三个文件刚开始并没有注意,以为就一个CenternetLossLayer就完了,但是当我只把CenternetLossLayer层加进我的caffe中时,训练出错:
发现有一个focalSigmoidWithLoss相关的层没有注册,才发现这个层没放进去,回头去找,将cpp,cu,hpp文件添加进去。
修改caffe.proto文件,添加新层:
然后重新编译caffe,途中遇到错误:
boost 1.62:.\boost/type_traits/common_types.h(42) : fatal error C1001: 编译发生内部错误
根据博客:https://blog.csdn.net/10km/article/details/74190410
按照提示,在c++预处理器->预处理器定义中添加:BOOST_NO_CXX11_VARIADIC_TEMPLATES 宏定义就可以了。
编译结束,开始训练。
训练数据:自己的目标检测数据集(8个类别,包括人,小车,自行车,摩托车,公交车,卡车,火车,狗)
网络结构:主干:mobilenetv2,FPN,分类分支:conv+focal_sigmoid,检测分支:conv+smooth l1
训练参数:
开始训练:
报错,显示focal_loss_centernet.cpp中输入的两个维度不匹配,上层输出的特征图通道是8,但是标签通道是1。
检查这个focal_loss_centernet.cpp文件查看两个输入是什么:
这个层是用来计算分类loss的,将输入标签应该转成多通道的heatmap,而通道数就是类别数,上层特征图输出通道数是8,也就是8类,我这里总共也是8类,说明没错,但是标签却是1通道,这就说明标签通道数错误,检查下标签的处理:
在centernetlosslayer.cpp中,送入focal-sigmoid之前,上层预测值经过了一次reshape, conf_pred_.Reshape(conf_shape);而这个shape里面是包含num_classes的,但是标签值并没有经过这个reshape,因此维度会对不上,所以应该对标签也进行一次包含num_classes维度的reshape,如下图所示:
这样就可以正常训练了:
实际训练中,batch_size设置成4直接显存不足,所以设置成了2,总算是可以正常训练了,后续再考虑图像尺寸的问题,增大batch。
注:作者实现这个是用来做人脸检测的,而我是用来做多类别目标检测,所以有些通道相关的变量还是得修改修改。
模型还没正式训练,待更...