Apollo感知模块:(基於单目的摄像头物体检测)

apollo用的是yolo3d,这个模型在apollo的/apollo/modules/perception/model/yolo_camera_detector/yolo3d_1128这个文件夹下是找不到的,这个文件挂载在docker环境中,我们可以找到这个文件将其复制出来,以下命令可以帮助你解决这个问题:

docker ps
docker inspect apollo_dev
docker volume ls -qf dangling=true
docker volume inspect file
docker exec -it containerid /bin/sh

找到文件所在目录,里面存放了caffe的模型文件和权重文件,可以通过caffe可视化环境将其graph显示出来看一下yolo3d的网络结构。

apollo的yolo3d模型其实是基于yolov2的基本框架来的,这个网上有相关开源代码及论文,yolo3d物体检测输出为2D框(以像素为单位),3D真实物体尺寸(以米为单位),障碍物类别和障碍物相对偏转角(Alpha Angle,和KITTI数据集定义一致)。当然其中还加入了车道线检测Decoder的设计,有着和FPN(特征金字塔)类似的链接,其实yolov3也是基于特征金字塔模型搭建。关于预测物体真实大小及Alpha Angle可以通过如下命令下载相关代码,相关论文为《3D Bounding Box Estimation Using Deep Learning and Geometry》,可以参考相关loss的设计,yolo3d是yolov2 + 3DBOX + Decoder的组合设计,是一个multitask。

git clone https://github.com/smallcorgi/3D-Deepbox.git

那么我们知道2DBox,预测出物体的真实大小以及Alpha Angle,其实就可以用来单目测距了,任一物体,已知它的长宽高、朝向和距离,则它在图像上的具体形状大小等可唯一确定,反之亦然,具体参考论文《Single View Metrology》。

我们已知图像的2DBox、物体真实尺寸以及朝向,那么我们就可以还原图像中的3DBox了,以及测距,在opollo代码中这一部分是在/apollo/modules/perception/obstacle/camera/converter,想要对这部分代码进行测试,我用的IDE是KDEVELOP,单独将相关代码摘出,自己补全cmakelist文件,apollo使用的是bzael编译的,这个目前不熟,所以要靠自己写cmakelist文件,添加相关编译文件及库链接,测试数据直接用KITTI数据集上的就可以,由一个重要的前提就是相机标定文件一定要替换成KITTI数据的标定文件,具体位置在/apollo/modules/perception/data/params,将里面的相关文件进行替换即可。

当然这只是完成功能测试,由于apollo改写的底层caffe框架没有开源,只能借助tensorflow或者其他框架来处理这个模型,其实这部分代码也有相关python的代码,tensorflow是基于图的概念,我们利用python将整个网络的graph保存出来,然后利用tensorflow的c++模块进行读图就可以了,还有一点,apollo用了好多google的库,比如protobuf,apollo用到的是3.3.0版本,tensorflow高版本用的是3.6.0版本,很有可能这两者结合的时候版本冲突,所以要将apollo的protobuf版本提升值3.6.0,相关的根据proto文件生成的c++代码要进行相应替换。那么你就可以看到摄像头是如何做到由2D到3D的转换了。复现效果如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章