作者针对LineMod算法不能解决多目标重叠物体复杂场景下的识别的问题,以及Patch-LineMod算法识别机制不够合理,特征分类形成模板的过程依据不够充分的问题,升级为CT-LineMod算法,一定程度上解决了复杂场景重叠物体的识别的问题并提升了识别率和准确度。模型的源代码以及文章如下,目前文章已被CC录用,应该不久就可以查到(COGN-D-19-00232R1)。
文献引用:Tielin Zhang, Yang Yang, Yi Zeng, Yuxuan Zhao. Cognitive Template-clustering Improved LineMod for Efficient Multi-object Pose Estimation. Cognitive Computation, 2020.

  1. LineMod算法:这个是LineMod的算法总结,也可以辅助来看Patch_lineMod的源代码,之前幸亏找到了这个代码说明让我重新理解了LineMod算法。应该反复看明白模板匹配的基本原理。
    https://blog.csdn.net/zmdsjtu/article/details/79933822
    https://blog.csdn.net/haithink/article/details/88396670
  2. Patch-LineMod算法:
    https://github.com/thomasaimondy/patchlinemod
    这个是我们fork的源代码,里面其实已经写了很多步骤了,之后的更细的细节有待补充。注意一定要装openGL Open3D 以及OpenCV要求3.4.1以上以及显卡有底线限制,不然会踩很多坑。之后细节会写每一个所需软件怎么安,这块坑真的多。
    https://zhuanlan.zhihu.com/6d-pose 这个是那个博士的成果,我所做的一切也是在这个基础上完成。之前和这位前辈交流过真的受益匪浅,以后还是要多多和他交流进步。
  3. CT-LineMod算法
    https://github.com/brain-cog/Brain inspired Batch
    文章链接:https://pan.baidu.com/s/1o-5KBBXB98sJ7bzvgpP7SQ
    论文地址: https://rdcu.be/b26sk
    题目:Cognitive Template-clustering Improved LineMod for Efficient Multi-object Pose Estimation (仅供学术交流研究)
    当然还有以此为基础的研究生论文: --------(之后发了再放链接)
    4.之前机器人控制程序的代码;
    链接:https://pan.baidu.com/s/1c-c087wvqdmnfyIizfd-AA
    提取码:js1q
    复制这段内容后打开百度网盘手机App,操作更方便哦
    原理可以看论文或者网上搜,也可以等毕业论文写完有中文版的介绍,下面只记录做的步骤一些一些坑。
    Müller-Lyer错觉效应是大脑在视觉信息处理过程中存在的一种特殊的视觉功能现象,大脑在处理三维空间中的不同点的认知距离的时候会受到与方向和幅度相关的附加特征的影响。Müller-Lyer错觉效应包括距离错觉效应、方向错觉效应和角度错觉效应三种基本类型。在人类视觉系统中所存在的这类错觉效应将有助于在6D姿态估计过程中进行特征检测和目标识别,特别是在三维空间中物体重度遮挡场景下显示出积极的意义。
    采用7D特征向量取代传统的只包含3D位置的坐标向量,并且在进一步的特征点空间位置判断过程中,不同位置处的特征点分类会受到Müller-Lyer错觉效应中与特征方向及幅度相关的额外4D向量特征信息的影响。
    在特征信息降维的过程中,采用梯度下降法将包含7D向量的特征信息降维为3D向量,之后采用K-means特征点均值聚类实现模板的总匹配,并且自动消除多余的聚类,使模板匹配过程既具备了特征信息的整体性又保持了特征点的局部特性。
    在这里插入图片描述

步骤

1.①点云原始数据特征点生成;②7D特征向量定义与设置;③模板聚类变量定义;④特征尺寸s设置。
2.①导入训练数据集样本,生成对应特征点7D特征向量;②处理模板信息,计算特征块;③利将7D特征向量映射到三维空间,计算新的3D特征向量;
3.④计算新的特征模板并计算图像与模板的匹配度;⑤利用④中的匹配度进行6D位姿估计,并利用ICP后处理完成图像位姿计算、校正及 验证过程
4.①由预定义的特征尺寸s利用滑窗匹配进行目标选取;②利用训练阶段的模板进行模板匹配与多目标位姿估计。
模型利用特征点的梯度的幅度、方向及表面法向量的幅度、方向,与三维空间坐标X、Y、Z值结合形成7D特征向量,利用数据降维算法与K-means相结合的方式,分析特征点的内在逻辑关联性作为特征分块依据而不限于固定阈值的影响,增加物体独特特征(物体边缘、角、圆弧等)对特征点分类影响的比重,完成复杂场景下的多目标重叠物体的识别,并进一步使本模型与生物视觉识别系统靠近变得更加智能化。

----------------------------------------实验结果图-------------------------------------------------------
实验结果:
1.流程图
在这里插入图片描述
2.原理
在这里插入图片描述
三维物体的原始点云数据输入后,本模型通过计算每个3D特征点的四个附加特征(梯度方向、梯度幅度、表面法向量方向、表面法向量幅度)形成图b的7D特征向量。之后通过集成特征点邻域s*s区域范围内的特征作为待匹配特征块(图c),通过K-means均值化降维为新的3D空间向量,依据Müller-Lyer错觉效应的原理对特征块分配成为更有相关性的特征模板(图d)。在测试阶段将输入图像的点云数据与来自图e中的该物体训练图像的特征模板进行匹配计算两者之间的相似性,相似度较高的待匹配模板将作为已匹配模板,并返回训练阶段包含的物体的6D位姿信息

3.实验结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在三种场景下将N-top值设为最大值时,LineMod、Patch-LineMod、CT-LineMod三种算法在不同场景下的召回率结果显示,LineMod算法基本不具备复杂场景下重叠物体的识别能力,平均召回率仅10.7%。对于场景1和场景2的Patch-LineMod算法和本文所设计的CT-LineMod算法均展现了出色的重度遮挡情况下多目标物体的识别能力。
N-top=1时,五种算法均可以准确识别到正确的最明显的目标。CT-LineMod算法在两个场景下最终达到了0.947和0.913分,证明模型的准确率大大提高,并且可以达到平均0.93分的水平。同时,在果汁盒场景的F1分数CT-LineMod算法有了显著的提高。这在一定程度上证明了本模型具备更高的准确度以及更出色的识别能力。
在这里插入图片描述

------------------------------------------基础模块---------------------------------------------------

复现Patch-LineMod:

首先是要复现出来Patch-LineMod,保证后面更新后的CT-LineMod算法也可以正常实现。

参考https://github.com/meiqua/patch_linemod
#proxychains git clone https://github.com/meiqua/patch_linemod.git
#wget -r -np -nH --cut-dirs=1 -R index.html http://ptak.felk.cvut.cz/6DB/public/
t_less_toolkit move to src

接着装一些依赖包
注意自己的python版本调整操作代码!

#python3
#pip3 install moudules
#sudo synaptic

#pip3 install --upgrade pip setuptools
#sudo pip3 install Cython
#sudo pip3 install -r requirements.txt
#sudo pip3 install pybind11
(#sudo pip3 install pybind)
#sudo pip3 install open3d-python
(#sudo pip3 install py3d)
(sudo apt-get install libglfw3)
 
 requirements.txt其实已经把所有依赖包装上了,原文作者也提到过,这里可以分别安装各模块保证都装上
	sudo pip3 install:
	scipy
	matplotlib
	opencv-python
	pypng
	ruamel.yaml
	Cython
	glumpy
	pyopengl
把编译好的source文件夹(包含lib include)拷贝到 usr/local/ lib 和 include

安装OpenCV3.4.1 (参考https://blog.csdn.net/echoamor/article/details/83022352)

#git clone -b 3.4 https://github.com/opencv/opencv.git
		(源目录https://github.com/opencv/opencv_contrib.git)
		老版本或者装错了可以参考:uninstall opencv:https://zhuanlan.zhihu.com/p/38738976	 进行卸载

进入build文件夹
	#sudo make install
	#sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
	#sudo ldconfig

3.4.6也可以:
install opencv3.4.6:
(https://blog.csdn.net/echoamor/article/details/83022352) -->python3 instead python when install the lib like python3-dev instead python-dev
then in build:

	#sudo make install
	#sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
	#sudo ldconfig

安装Open3D 这里一定要注意自己的显卡,不然根本装不上去,我最后用的IntelNUC的酷睿i7-8809G 独立显卡(NUC8i7HVK6)这款主机
在这里插入图片描述

参考文章:http://www.open3d.org/docs/compilation.html
		https://liuqiangblog.github.io/2018/07/23/Open3D开发环境搭建/
		http://www.open3d.org/docs/getting_started.html
#workon facecourse-py2  //enter virtual environment
#deactivate  //quit virtual environment

	install open3d
	(http://www.open3d.org/docs/compilation.html#ubuntu)
	#cd open3d
	#util/scripts/install-deps-ubuntu.sh
	
	#node -v
	#npm -v
	
	#mv build build.bk
	#mkdir build 
	#cd build
	
	#cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
	#sudo make -j4
	
	#sudo make python-package
	#sudo make pip-package
	#sudo make install-pip-package (to make sure there are files in /usr/local/include,if not step to sudo pip3 install open3d......)
	#cd Open3d/build/lib/python_package/pip_package
	#sudo pip3 install open3d-0.5.0.0-cp35m-linux_x86_64.whl (for python2 then can get lib in python3.5_dist-packages)
	
	#sudo make install
	测试是否安装成功:
	#python3 
	#import open3d

安装pybind11

	install pybind:
	#cd pybind11/
	(sudo apt install python-dev python3-dev )
	(sudo apt install cmake)
	#sudo pip3 install pytest
	#mv build build.bk
	#sudo mkdir build
	#cd build
	#sudo cmake ..
	//cmake --build . --config Release --target check
	#sudo make install

在build之后应该会得到一个 linemodLevelup_pybind文件

把linemodLevelup.cpp文件复制到src文件夹里面
#sudo python setup.py install
具体步骤如下:

	#cd patch_linemod  (if change levelup.cpp,should run these steps bleow)
	#mkdir build (if change ,delete build and remkdir 重新编译即可)
	#cd build/		(or sudo rm -rf * to delete the build)
	#cmake ..
	#make
	#cd patch_linemod/linemodlevelup
	#sudo python3 setup.py install (then get linemodlevelup_pybind)
	
	#sudo python3 patch_linemod_test.py
	(set bash:
	gedit run.sh in linemodlevelup)
	
	#sudo rm -rf /home/casia/patch_linemod/linemodLevelup/build/*
	#cd /home/casia/patch_linemod/linemodLevelup/build/
	#sudo cmake ..
	#sudo make
	#cd /home/casia/patch_linemod/linemodLevelup/
	#sudo python3 setup.py install
	#cd /home/casia/patch_linemod/
	#sudo python3 patch_linemod_test.py
	使用:
	这里我写了一个bash用来执行上述的编译等步骤,可以自行查看
	#sudo ./run.sh

算法测试在源代码其实已经有了,但是有一些步骤Patch-LineMod作者并没有给出具体怎么和已有的代码结合,所有我修改了其中的内容使算法评估代码可以直接用运行结果。

	evaluate:
	#cd tools/
	#sudo python3 eval_calc_errors.py   
	//Calculating error: vsd, patch-linemod, hinterstoisser,2(scenes total 15 or 3), 72, 9
	#sudo python3 eval_loc.py 
	//calculating matches scores recalls
	
	#cd doumanoglou/
	#sudo unzip test_gt_stats.zip
	
	results are saved to eval/
	
	#sudo g++ test.cpp -o test
	#./test

装t-SNE(这个无关紧要,因为CT-LineMod的数据降维过程就是依照于此。)

install t-SNE:
git clone https://github.com/lvdmaaten/bhtsne.git
cd bhtsne
g++ sptree.cpp tsne.cpp tsne_main.cpp -o bh_tsne -O2

OR just copy the files(changed) to linemodlevelup and the make

安装MATLAB

install Matlab2016:
copy src to home
参考文章https://blog.csdn.net/hitzijiyingcai/article/details/81989031
#sudo mount -t auto -o loop matlab/R2016b_glnxa64_dvd1.iso matlab/

when eject,need to remove the disk(before),then sudo mount...

#sudo gedit /usr/share/applications/Matlab2016b.desktop
(https://blog.csdn.net/qq_36982160/article/details/78397514)

使用: cd /usr/local/MATLAB/R2016b/bin  sudo ./matlab

CT-LineMod算法的基础准备工作就到这里,之后就可以fork我们的代码后就可以调试了。训练时间差不多需要4-5h,测试时间2-3h,评估结果的程序评估时间大概40min一个 按照n_top值不同大概需要测试ntop=0(全部的目标)~ntop=10就可以了。

无关紧要
-------------------------------------------------------------------------------------------------------
待实现:

如上所说,在做的过程中依然存在很多问题。比如说

1.速度极慢,在用t-SNE降维数据后时间极大的增加

2.应该考虑增加权重,毕竟人看物体,如果是明显的特征(比如一个尖儿)人就可以认定是该物体了。所以这一块是最重要应该考虑改进的地方。

3.混合物体场景识别结果很差。

4.考虑增加聚身点云融合,这样就可以和之前的机器人联用做成一个大系统。

5.目前只采用Doumanglou数据库

 (1)考虑加入其它数据库考察算法的更多物体的识别能力 ,而非只着重重叠物体的能力。

  (2)增加实际场景中的识别,这样也便于之后的进一步改进算法。

————————————————
版权声明:本文为CSDN博主「羊羊羊机器人」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40799950/article/details/96510087

有很多人通过邮箱联系到了我我也给出了我的解答。如有问题请发邮件到: 1701210376@pku.edu.cn 最近依然不会回复csdn。

如果有人感兴趣想加入的话,自动化所招实习生啦!!!

【自动化所类脑中心-类脑机器人实习生招聘】
类脑认知机器人算法及应用实习生:主要负责基于ROS的认知机器人开发,要求自动控制及相关专业(或个人十分感兴趣),具有机器人ROS开发经验/python编程基础者优先,最好能实习6个月以上。我们将提供Baxter机器人、Robotnik机器底盘、NAO机器人等作为硬件支撑实习生的研究。
有意者请联系tielin.zhang@ia.ac.cn
---------------------------2020.3.2更新-------------------------------------------------------------

最终的文章代码链接以及原文、实现步骤已经在系列终结篇给出。

另外本人画的场景设计画在站酷上,欢迎交流www.zcool.com.cn/u/20178144