zju3dv / pvnet

Code for "PVNet: Pixel-wise Voting Network for 6DoF Pose Estimation" CVPR 2019 oral
Apache License 2.0
814 stars 145 forks source link

新物体的训练 #103

Closed JokerShao closed 4 years ago

JokerShao commented 4 years ago

参考#89,新物体训练我遵循以下步骤

  1. 使用OpenCV+ArUco创建真实数据集,包括Rt,mask以及rgb图像
  2. 制作模型,并计算farthers.txt
  3. 使用pvnet-rendering进行两万张训练图像的生成(fuse+render)
  4. use_fuse=True, use_render=True,进行训练
  5. 收敛到了较不错的结果
train epoch 55 step 39665 seg 0.00299779  ver 0.00667633  precision 0.99216473  recall 0.99100238 
train epoch 55 step 39745 seg 0.00296804  ver 0.00605389  precision 0.99079704  recall 0.99103826 
epoch 55 training cost 353.5327022075653 s
val epoch 55 step 55 seg 0.00161693  ver 0.00426876  precision 0.97770327  recall 0.97633207 
epoch 55 val cost 28.301410913467407 s
val epoch 56 step 56 seg 0.00160351  ver 0.00399907  precision 0.97779989  recall 0.97627330  projection_error 0.00102354  add 0.00000000  cm 0.00255885 
epoch 56 val cost 368.35636043548584 s

但实际可视化结果如图 Screenshot from 2019-10-30 18-05-19

问题如下

  1. LINEMOD_ORIG 中的mesh.ply,oldmesh.ply,transform.dat 与 LINEMOD 中 cat.ply之间的关系?http://far.in.tum.de/Main/StefanHinterstoisser中有说,但是说的比较笼统,没有看太懂
  2. 这个transform.dat如何得到?
  3. 我自己的模型已经与cat.ply中的位姿相同,还需要做trasnform.dat的转换吗?
  4. 如何合理制定单位?不同文件中的测量单位似乎不同。

多谢解答!

pengsida commented 4 years ago
  1. 如果是你自己的数据集,你不用管LINEMOD数据集的各种变换。
  2. 如果图上的绿色框是你的gt,说明你的pose是对的。你可以看看关键点定位是不是准确的。
  3. 标准单位是m。
JokerShao commented 4 years ago

多谢回答!但我认为还是LINEMOD数据集变换出现的问题 我实际是仿照LINEMOD_ORIG的数据格式和坐标定义进行的数据生成,中间经过了fuse和render的几步转换,感觉像是这里出现了问题。

我这边搞了三个demo

  1. 小猫的,从LINEMOD/cat中读取除位姿外的所有数据,从LINEMOD_ORIG中读取rot,tra信息,并做转换

    # Transform pose from orig to blender
    pose_transformer = PoseTransformer(class_type=model_type)
    pose = pose_transformer.orig_pose_to_blender_pose(pose).astype(np.float32)

    Screenshot from 2019-10-31 10-37-22

  2. 我自己录制的数据集,从LINEMOD/rubikscube中读取除位姿外的所有数据,从LINEMOD_ORIG中读取rot,tra信息,不做转换 image

  3. 使用我录制的数据集+pvnet-rendering渲染融合结果(因为用2验证的效果并不好,所以想试试训练集里的图像会不会好些),从LINEMOD/fuse中读取rgb, mask,其他数据LINEMOD/rubikscube中读取,位姿信息从LINEMOD/fuse中的pkl文件获得,结果如下图,所以现在怀疑train_linemod.py做数据预处理时是否也进行了测试1中的转换,导致label直接就是错误的Screenshot from 2019-10-31 10-44-03

pengsida commented 4 years ago

你自己的数据不用经过linemod的坐标变换。linemod是因为3d object model和它给的gt 6d pose不一样,所以才需要变换。 用blender生成的6d pose和你用于渲染的3d model是一致的。

emojiLee commented 4 years ago

@JokerShao,您好,我想请教您制作自己数据集的问题,“OpenCV+ArUco创建真实数据集,包括Rt,mask以及rgb图像”,我查资料OpenCV+ArUco制作了标记ID,打印出来,摄像头可检测标记ID和三维轴。想问您: 1.您使用的摄像头是任意摄像头,还是kinect? 2.物体放在打印的有标记ID的标定板中,是怎么获取到物体的RT的? 3.作者说的“mask是用opengl渲染得来的”这是什么意思?觉得不是使用labelme分割标定的 期待您的回复,谢谢!

pengsida commented 4 years ago

因为有物体的RT,所以将物体3d模型渲染投影到2d图像上,就可以得到物体的mask,不需要再另外标定mask。

JokerShao commented 4 years ago

@emojiLee

  1. 用的普通相机;
  2. 自己在标定板上建了个坐标系,用尺子量了角点真实距离,加上ArUco的检测,pnp就算出来了真实Rt。有了标定板到相机的Rt,算出来物体和标定板的Rt,就能得到物体和相机的Rt了。物体有自己的坐标定义(我是按照ply里面来的),物体放在标定板上,乘一下偏移量和旋转矩阵就行了。自己训练的话有几个地方的相机参数得改成你自己的,不然训练出来关键点提取会有问题。
emojiLee commented 4 years ago

@pengsida @JokerShao 谢谢你们~

geshu commented 4 years ago

@JokerShao 你好,我在研究你的案例时有些疑问: 1.使用ArUco时我们可以获得标定板上二维码的R值(旋转向量)和T值(平移向量),我能够理解T值不相同,按照我的理解同一平面上的二维码的R值应该是相同,但是实际上并不相同(会有些细微的差别),这样让我无法直接确定标定的R值。我们是否可以将有效二维码的R值平均后作为标定板的R值?

2.物体与标定板的RT是如何确定的?是默认物体坐标系和标定板坐标系重合,如果我假定物体与标定板的自身坐标系是重合的那是否可以认为标定板的RT就是物体的的RT?同理我们可以假定物体坐标系的旋转与标定板的是相同的,那么标定板的R值则是物体的R值,再根据物体坐标中心与标定板坐标中心的位置关系确定物体的T值?

3.“物体放在标定板上,乘一下偏移量和旋转矩阵就行了",这句话中偏移量和旋转矩阵是指物体相对于标定板坐标系的坐标值和旋转矩阵吗?还是其他什么的偏移和旋转矩阵?

geshu commented 4 years ago

@pengsida 彭总求助啊 上面的问题

JokerShao commented 4 years ago
  1. 旋转向量不会完全相同的,有噪声和镜头畸变的存在,有误差很正常。事实上我只用标定板做了角点检测,实际位姿的解算使用solvepnp进行的,这样正好解决了ArUco没有尺度的问题
  2. 物体坐标系的定义要参看你的ply文件,因为后续还需要blender渲染图像,要保证真实图像和渲染图像的轴系定义相同
  3. 偏移量和旋转矩阵就是物体坐标系和标定板系的相对关系
pengsida commented 4 years ago
  1. 用ArUco和pnp可以解出当前camera相对于ArUco的pose,不知道你说的R和T是指物体pose还是camera pose。
  2. 物体和标定板的RT不用确定。你可以先手动标定第一帧的object pose,然后用标定板得到的两帧的relative pose来得到后面帧的object pose。
  3. 物体坐标系和标定板坐标系的relative pose我不知道怎么解,我不是这么做的。
geshu commented 4 years ago

@JokerShao @pengsida
感谢二位的回复,根据二位的回复我继续进行了研究有如下的疑问:

  1. ArUco是带有单位的,默认单位为米。且在我理解中ArUco获得的RT是每个Maker相对于相机的RT,这样我们就可以直接用ArUco来确定物体的RT,为什么还要用到pnp,或者能否说下pnp在这里的用处。 2.彭总,手动标定的object pose是怎么做的?我能理解你后续的处理,但是我不清楚怎么手动标定object pose,一个pose中应该包含T R 两个值,T可以用尺子测量,但R该如何标定? 3.是否可以使用其他的软件来渲染mask,比如u3d之类的?
pengsida commented 4 years ago
  1. Marker相对于相机的RT就是用pnp算的。我不知道ArUco怎么用来确定物体RT。
  2. 如果有rgb-d相机,可以把图片点云和物体点云做对齐。或者用2d-3d关键点匹配算RT。RT无法用尺子量。
  3. 可以。
geshu commented 4 years ago

@pengsida 感谢回复,我有如下疑问:

  1. ArUco中有个estimatePoseSingleMarkers方法可以获得Maker的rvecs和tvecs。这个是就是需要的RT吗? 2.在新的物体训练中ply文件不带color信息是否有关系? 3.使用cv.solvepnp(points_3d,points_2d,camera_matrix,dist_coeffs)来计算RT,那这里的points_3d,points_2d应该传入什么参数?points_3d是Maker相对于相机的pos?points_2d是Maker在图像中的像素pos?
pengsida commented 4 years ago
  1. 这个是标定板相对于相机的RT,不是想求的object pose。
  2. 对pnp算法不影响。
  3. 3d关键点是你自己定义的,2d关键点是你在图片上标的。points_2d是Maker在图像中的像素pos。points_3d是Maker坐标系下的3d坐标。
JokerShao commented 4 years ago

彭总你好,之前经过你的指导,已经训练出一套参数,在我的魔方识别问题上效果不错,这里先多谢了!但我这个应用场景还有如下几个问题: 我训练出来的魔方在普通光照下效果较为不错,但还是存在反光和暗光条件下识别不好的问题,于是我采用以下新的配置重新进行训练:

pengsida commented 4 years ago
  1. test.txt没有包含所有真实数据。test和train的数据不一样。
  2. jitter其实影响不大,除非你的物体和训练数据颜色差别很大。正常都可以用。网络对scale更敏感。
  3. vertex确实是限制网络accuracy的瓶颈,我们没有进一步改loss权重,你可以加大看看效果。
  4. cat上的vertex loss我们收敛到0.01左右。vertex loss的训练要调learning rate。
JokerShao commented 4 years ago
  1. test.txt确实没有包含所有真实数据,你说的是对的,scale之前测试的影响的确不小;
  2. 昨晚又跑了一宿,依旧收敛到0.027左右,下不去,实际效果也没有你给小猫戴帽子那个好。尝试修改vertex在loss中的权重,或者训练到中途停下来调节lr。但是出现了新问题,tensorboardX记录不能继续,会自动生成新文件记录,这样修改参数后tensorboard可视化数据就和之前连不起来了,不知道是不是我的使用方式不对?你们之前是如何解决这个问题的? 十分感谢!
pengsida commented 4 years ago
  1. vertex loss和物体大小有关,需要看你的物体在图片中的大小。我们给小猫戴帽子的demo,有先做detection,再把小猫resize到固定大小。
  2. 我们tensorboard没有出现过这个问题,这应该是使用有问题,比如tensorboard没有加载原来的记录文件。
JokerShao commented 4 years ago

好的,我试试看resize,多谢了。

learningforever-ctrl commented 3 years ago

@pengsida 彭总求助啊 上面的问题

@JokerShao 你好,我在研究你的案例时有些疑问: 1.使用ArUco时我们可以获得标定板上二维码的R值(旋转向量)和T值(平移向量),我能够理解T值不相同,按照我的理解同一平面上的二维码的R值应该是相同,但是实际上并不相同(会有些细微的差别),这样让我无法直接确定标定的R值。我们是否可以将有效二维码的R值平均后作为标定板的R值?

2.物体与标定板的RT是如何确定的?是默认物体坐标系和标定板坐标系重合,如果我假定物体与标定板的自身坐标系是重合的那是否可以认为标定板的RT就是物体的的RT?同理我们可以假定物体坐标系的旋转与标定板的是相同的,那么标定板的R值则是物体的R值,再根据物体坐标中心与标定板坐标中心的位置关系确定物体的T值?

3.“物体放在标定板上,乘一下偏移量和旋转矩阵就行了",这句话中偏移量和旋转矩阵是指物体相对于标定板坐标系的坐标值和旋转矩阵吗?还是其他什么的偏移和旋转矩阵?

这个 物体和ArUco标定板之间的R和T到底怎么确定的呀?有人讲解下嘛?

JokerShao commented 3 years ago

R、t的确定取决于你物体本体坐标系的选取吧。得先确定物体的坐标系,才能确定物体和标定板的相对位姿。

learningforever-ctrl commented 3 years ago

R、t的确定取决于你物体本体坐标系的选取吧。得先确定物体的坐标系,才能确定物体和标定板的相对位姿。

首先谢谢你的回答,物体坐标系的定义要参看你的ply文件,因为后续还需要blender渲染图像,要保证真实图像和渲染图像的轴系定义相同,这个步骤你就解答过,但是具体能告诉下我嘛,因为才开始做,我的目标就是确定ArUco标定板和物体的pose

JokerShao commented 3 years ago

emmm,这还怎么具体?

JokerShao commented 3 years ago

用blender打开ply模型,那里面有轴系和原点,你的实际物体定义要与blender里面相同啊。

learningforever-ctrl commented 3 years ago

好的谢谢了

------------------ 原始邮件 ------------------ 发件人: "zju3dv/pvnet" @.>; 发送时间: 2021年9月7日(星期二) 中午11:21 @.>; @.**@.>; 主题: Re: [zju3dv/pvnet] 新物体的训练 (#103)

用blender打开ply模型,那里面有轴系和原点,你的实际物体定义要与blender里面相同啊。

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe. Triage notifications on the go with GitHub Mobile for iOS or Android.

JokerShao commented 3 years ago

不客气。

PeiYS commented 3 years ago

大佬能不能出一期教程来说明如何制作数据集的?绝对火。