OneOneLiu / ggcnn_cornell_dataset

cornell grasp dataset analyses and process
49 stars 12 forks source link

大佬,请问为什么制作标签的时候要取三分之一?为什么角度限制在-90到90? #10

Open hshgftt opened 2 years ago

hshgftt commented 2 years ago

角度范围-180到180不可以吗?为什么求正余弦要对角度的两倍求,直接原角度求正余弦再arctan2反求角度不行吗(前提角度限定范围在-180,180)? 还有刚试了试把标签当作网络输出去验证,不知道为什么都不匹配 ` import torch import torch.optim as optim import numpy as np import matplotlib.pyplot as plt import cv2 import time

导入自定义包

from ggcnn import GGCNN from cornell_pro import Cornell from functions import post_process,detect_grasps,max_iou from image_pro import Image from grasp_pro import Grasp_cpaw

val_data = Cornell('图片标签路径', random_rotate = True, random_zoom = True, output_size = 300) val_dataset = torch.utils.data.DataLoader(val_data,batch_size = 1,shuffle = True) for x,y,idx,rot,zoom in val_dataset: q_out,ang_out,width_out = post_process(y[0], y[1], y[2], y[3]) grasps_pre = detect_grasps(q_out,ang_out,width_out,no_grasp = 1) grasps_true = val_dataset.dataset.get_raw_grasps(idx,rot,zoom)

result = 0
for grasp_pre in grasps_pre:
    if max_iou(grasp_pre,grasps_true) > 0.25:
        result = 1
        break

if result==0:
    print(val_dataset.dataset.graspf[idx])
    #break

`

OneOneLiu commented 2 years ago

请问为什么制作标签的时候要取三分之一?

假设我们要抓某个宽度为W的简单矩形平板物体

数据集中的标注的矩形宽度是抓取时的夹爪张开宽度W_g, W_g肯定是要大于物体的宽度W的, 否则就会发生碰撞

训练时生成的标注是对物体上的较好的可抓取区域进行标注指示, 假设这个区域的宽度是W_q, 那么W_q一般要小于W, 因为较好的抓取肯定是落在该物体较为中心的位置的

基于这个思想, W_q < W < W_g, 但是这三者之间的准确数值关系我们并不知道, 在GGCNN原论文中作者取W_q=W_g/3, 这个是可以调节的,如果你觉得其他参数更合适,应当更大些或者更小些都可以自己改

为什么角度限制在-90到90? 这个问题原论文4.1节中解释了,是为了消除编码角度的可能存在的不连续问题,同时这样的分布使得网络更容易学习

最后一个问题: 你这种验证方法不太合理,后处理函数里面用到了一个计算局部极大值的函数,正常网络预测出的参数映射图数值是离散的,以quality map为例,其值介于(0,1)之间,而手动生成的标注映射图中只有0和1两个值,我不知道这样计算局部极值的话结果会如何,你的问题可能是这个原因导致的,具体可以自行设计实验验证

关于标注生成的正确性,自己用matplotlib可视化看一下,对照一下坐标检查一下就可以了,建议不要用你这种方法验证.

hshgftt commented 2 years ago

角度范围在-90到90倒也能理解,但-180,180的范围应该也不影响吧

最后一个问题知道了,在求quality map里的最大值时,因为标注的是整个矩形框区域都为1,而实际应该取矩形中心点的那个位置为基准,所以我这里验证方法不对。

关于验证这块,我的理解是对预测quality map值最大的那个像素点(原码no_grasp取1,若大于1就是最大的若干个)为抓取中心,解码出对应的抓取框,再和真实标签里的所有矩形抓取框逐一比较。

我现在碰到的问题是,假如真实标签坐标为: g=np.array([ [184,143], [195,142], [195,112], [184,113] ]) 预测标签为: g1=np.array([ [183.47587462, 141.99946795], [194.52123558, 142.00053191], [194.52412538, 112.00053205], [183.47876442, 111.99946809], ]) 求角度时利用: dx = g[1,1] - g[0,1] dy = g[1,0] - g[0,0] angle=(np.arctan2(-dy,dx) + np.pi/2) % np.pi - np.pi/2 前者求的角度为1.48,后者角度为-1.57,但是明显这两个矩形框坐标很相近,可是验证的时候因为角度相差超30而被错判,这里角度范围限制在-90,90 如果角度范围在-180,180,也会出现类似的问题,即180,-180附近的角度跟上面情况一样。

hshgftt commented 2 years ago

知道了。。。。在求两角之差时abs((angle_pred-angle_label+ np.pi/2) % np.pi - np.pi/2)转化一下就好了

hshgftt commented 2 years ago

请问这个抓取标签,会存在一个像素点对应不同的角度吧,原文的处理应该是后一个角度直接覆盖前一个角度,宽度也是一样。还有抓取概率是整个矩形框都为1,那预测的时候取概率最大的那个像素点怎么就是抓取中心呢?标签里矩形中心点和矩形内部其他点都一样,网络学习也没法区分出来吧

还有请问你换过用其他大一点的语义分割网络去跑吗?效果怎么样?

OneOneLiu commented 2 years ago

抓取质量监督图指示了某个地方可抓不可抓的概率, 那么预测出来的结果就应当是网络认为对于物体上各处可抓不可抓的概率,我们当然要选择概率最高的地方作为抓取中心,但这种标注方法只有0,1,因此对于不同区域是没有倾向性的,所以你后面看结果会发现大部分的抓取位置并没有落在物体的中心,

我没有试过用其他的网络跑

zhozhif commented 2 years ago

大佬能分享一下代码吗,孩子要哭了

zhozhif commented 2 years ago

请问为什么制作标签的时候要取三分之一?

假设我们要抓某个宽度为W的简单矩形平板物体

数据集中的标注的矩形宽度是抓取时的夹爪张开宽度W_g, W_g肯定是要大于物体的宽度W的, 否则就会发生碰撞

训练时生成的标注是对物体上的较好的可抓取区域进行标注指示, 假设这个区域的宽度是W_q, 那么W_q一般要小于W, 因为较好的抓取肯定是落在该物体较为中心的位置的

基于这个思想, W_q < W < W_g, 但是这三者之间的准确数值关系我们并不知道, 在GGCNN原论文中作者取W_q=W_g/3, 这个是可以调节的,如果你觉得其他参数更合适,应当更大些或者更小些都可以自己改

为什么角度限制在-90到90? 这个问题原论文4.1节中解释了,是为了消除编码角度的可能存在的不连续问题,同时这样的分布使得网络更容易学习

最后一个问题: 你这种验证方法不太合理,后处理函数里面用到了一个计算局部极大值的函数,正常网络预测出的参数映射图数值是离散的,以quality map为例,其值介于(0,1)之间,而手动生成的标注映射图中只有0和1两个值,我不知道这样计算局部极值的话结果会如何,你的问题可能是这个原因导致的,具体可以自行设计实验验证

关于标注生成的正确性,自己用matplotlib可视化看一下,对照一下坐标检查一下就可以了,建议不要用你这种方法验证.

请问一下回答中的原论文是指哪篇论文