目录
深度相机
驱动安装
pyrealsense2安装
学校端口问题用以下方法安装
其它相关环境安装
Vscode配置anaconda环境
数据集制作和加载
调用深度相机进行数据集制作
代码部分
运行效果
展示的代码文件
数据集标注
相关环境配置
代码理解
标签代码
可视化标签代码
数据增强
康奈尔数据集下载(没有深度相机可以直接用这个数据集学习)
链接:https://pan.baidu.com/s/1lgPBUT4NPKYXNbzKgBIzCQ
提取码:1n7s
数据集如图所示
day01--数据集制作(一)_m0_46154334的博客-CSDN博客_cornell数据集1.Cornell数据集下载链接:https://pan.baidu.com/s/1sVH5cgWWzyISv5v1XaPllg?pwd=udc6提取码:udc6图一 cornell grasp data文件图二 cornell文件两者内容解压后内容差不多(图一为linux下压缩包)1.1Windows下解压tar.gz文件1、进入解压包所在的文件夹,按住shift点击鼠标右键,打开Powershell窗口。2、输入命令tar -zxvf 文件名3、解压完成后,应该有4种文件,一https://blog.csdn.net/m0_46154334/article/details/124119048 此处注意需要进行相关转换
先说明一下:没有深度相机也可以学习,直接用的康奈尔数据集里的进行标注
相关资料:
链接:https://pan.baidu.com/s/1Q6UXKxAqkjerpSZkRBW4pA
提取码:02eo
--来自百度网盘超级会员V4的分享
注意要用USB3.0连接
如果是这种情况确定插入的是usb3.0的插口的情况下,那就是线不对(不能用type-c的手机数据线)
要用
这种
用手机数据线的话只能通过代码开摄像机
驱动要关闭
测量的实际深度越多误差越大
左边第一个和右边第二个是红外主动测距立体相机
左边第二个大的是红外投影(投射红外点阵,然后用红外主动测距相机捕捉反射测量距离)
最右边是RGB彩色相机
工作原理:
通过红外主动测距立体相机可以拍摄到场景包含红外信息的图像
(通过三角测距法来获得每一点的深度)
Window10 intel realsense D435安装并实现opencv显示realsense读取的彩色和深度数据(QT+openCV+rsD35)_Pabebe的博客-CSDN博客
右上角可以选择2D或者3D模式
Windows下使用Python配置环境、调用Intel realsense D435/D435i,即pyrealsense2库的安装_GRF-Sunomikp31的博客-CSDN博客_d435i windowsWindows下使用Python配置环境、调用Intel realsense D435/D435i前言错误尝试尝试一尝试二配置过程创建Python3.6环境安装**pyrealsense2**、opencv、numpy库测试记录笔记后言Bibliography前言近来太懒了,想拿起Python玩玩,突然想到可以把手边的D435i配置一下,在windows下利用python调调;经过几个小时的配置,解决了一些问题,总结如下;由于只使用RGB和深度图,不使用IMU,因此D435i和D435配置是完全相同的https://blog.csdn.net/qq_44847636/article/details/113821588?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165270910516780357213382%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165270910516780357213382&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-113821588-null-null.nonecase&utm_term=Windows%E4%B8%8B%E4%BD%BF%E7%94%A8Python&spm=1018.2226.3001.4450
安装的时候如果有问题可以临时换源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
恢复源
https://www.csdn.net/tags/MtjaYg4sOTAxNDctYmxvZwO0O0OO0O0O.html
在python中安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))_lsf_007的博客-CSDN博客先向大家展示以下困扰了我好久的问题死活就是安装不上,总是说出错,其实就是说连接超时,下载不了安装包,我这里也没有科学上网的工具,经过多方百度,找到了办法通过几次pip的使用,对于默认的pip源的速度实在无法忍受,于是便搜集了一些国内的pip源,如下:阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors....https://blog.csdn.net/lsf_007/article/details/87931823
用以下方式安装即可
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn opencv-python
此时cv2不再报错
安装imageio
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn imageio
WARNING: The scripts imageio_download_bin.exe and imageio_remove_bin.exe are installed in 'C:\Users\SZU\AppData\Roaming\Python\Python38\Scripts' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
出现这个提醒
加入提示的环境变量
下载相关拓展
关联VSCode与Anaconda
在VSCode里使用快捷键 Ctrl + P ,搜索 >select intetrpreter ,点击图片上这个:
选择要用的环境即可
自己制作数据集最好是100张以上的图片
没有深度图也没事,可以直接用数据集里的图片
以下是相机拍摄效果
打开对应的编码文件
这一部分是建立相机到程序的联通
def run():
pipeline = rs.pipeline()
#Create a config并配置要流式传输的管道
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
align_to = rs.stream.color
align = rs.align(align_to)
这一部分是建立保存图像的文件夹(文件夹名为日期)
# 按照日期创建文件夹
save_path = os.path.join(os.getcwd(), "out", time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()))
os.mkdir(save_path)
这一部分是建立两个opencv2的两个窗口
# 保存的图片和实时的图片界面
cv2.namedWindow("live", cv2.WINDOW_AUTOSIZE)
cv2.namedWindow("save", cv2.WINDOW_AUTOSIZE)
saved_count = 0
然后进入循环
因为抓取检测最好是用彩色图像和深度图对齐的
所以获取了RGB图像以及和RGB对齐的深度图像
# 获取RGB图像
color_frame = aligned_frames.get_color_frame()
color_image = np.asanyarray(color_frame.get_data())
# 获取深度图
aligned_depth_frame = aligned_frames.get_depth_frame()
depth_image = np.asanyarray(aligned_depth_frame.get_data()).astype(np.float32) / 1000. # 单位为m
但因为获取的深度图是以毫米为单位的,为了单位一致,转换成米
此处可以补全也可以不补全
# 可视化图像
# depth_image = inpaint(depth_image) # 补全缺失值
先看一下不补全的效果(所以此处注释掉了补全)
Python-OpenCV中的cv2.inpaint()函数的使用_python_脚本中心 - 编程客栈目录概念库函数实现代码概念修复是图像插值。数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用。大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等。你有没有想过恢复它?我们...http://www.cppcns.com/jiaoben/python/402435.html
深度图转换成RGB(这样观感更好)
depth_image_color = depth2RGB(depth_image)
然后展示出来
cv2.imshow("live", np.hstack((color_image, depth_image_color)))
然后s键保存、q键退出(选中窗口)
# s 保存图片
if key & 0xFF == ord('s'):
cv2.imwrite(os.path.join((save_path), "{:04d}r.png".format(saved_count)), color_image) # 保存RGB为png文件
imsave(os.path.join((save_path), "{:04d}d.tiff".format(saved_count)), depth_image) # 保存深度图为tiff文件
saved_count+=1
cv2.imshow("save", np.hstack((color_image, depth_image_color)))
# q 退出
if key & 0xFF == ord('q') or key == 27:
cv2.destroyAllWindows()
break
先切换到配置好的环境
1.不补全缺省值的情况下
这个live窗口是实时的
然后点击live窗口,再按一下s
多摁几次s多保存几张
然后保存好之后摁q退出
保存在这个目录下
进入对应目录
彩色图像保存为.png格式
深度图保存为.tiff格式
因为后续的GGCNN使用的就是tiff格式
2.打开补全
补全后就没有缺失点了
但是其实还有一点糊
可能是因为就是消费级深度相机
第二个文件是用来展示刚刚保存的图像
path = './out/2021_12_24_14_59_49/0000d.tiff'
的图像
然后搭建拍摄平台对着足够的物体或者样本进行拍摄
GGCNN其实没有标注 (其实只是转换了康奈尔数据集的标签)
但是他不精确,因为康奈尔原本的数据集就不精确
打开网络的代码文件
切换到对应环境
conda activate GGCNN
安装(版本号一定要对上)
conda install scikit-image==0.18.3
更新numpy库不然会报错
pip install -U --user -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn numpy
安装mkl
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn mkl
同样的环境在vscode和在pycharm中运行报错不一样
主要原因有可能是VSCode
默认使用项目文件夹根目录作为工作目录(cwd),这会使得子文件夹中的程序无法使用相对路径。
可以在File -> Preference -> Settings,再搜索Execute in File Dir,勾上这个即可
主要的程序就是main_label.py
if __name__ == '__main__':
path = './test' # 数据集图片路径
label_win_name = 'labeling'
files = glob.glob(os.path.join(path, 'pcd*[0-9]r.png')) # 匹配所有的符合条件的文件,并将其以list的形式返回
就是对指定的path下的
pcd*[0-9]r.png
进行标注
(.png)彩色图命名为pcd+四位数编号+r
(.tiff)格式图命名为pcd+四位数编号+d
注意这里有一个pcd0100Label的.txt文件这是因为此时的test文件夹的图片都是标注好的
所以如果想标注(但是没有数据集,可以先把里面的.txt文件删掉或者移除到别的地方)
程序运行
此时有两个窗口
labeling是可以开始标注的窗口
labeled是显示标注结果的窗口
操作说明
****** 操作说明 ******
1 用鼠标左键画出一条适合夹持器抓取的直线
2 按 上/下 调整线宽(抓取区域宽度)
上: 增加线宽
下: 减小线宽
3 按 W/S/Q/E 设置抓取模式:
w: 朝向红色点单向抓取
S: 朝向绿色单向抓取
E: 对称抓取
Q: 圆形抓取
4 按 左/右 调整抓取宽度 (抓取宽度比物体宽2cm,两侧各1cm)
左: 增加
右: 减小
换下一张:空格
退出标注:Esc
在换下一张时,当前图像上标注的数据会保存至pcd****label.txt,
退出时,当前图像的标注不保存
按住左键拖动然后放开两边出现了一个红色的点和绿色的点(这条直线代表线上的点或者线周围点是可以作为抓取点的)
按方向键上下可以调节线的宽度(抓取区域宽度)
最好不要超过6
注意:如果物体很窄,那画线跟它对齐就行
抓取模式设置(此时要设置为英文输入法)
3 按 W/S/Q/E 设置抓取模式: (实际上就是抓取角)
w: 朝向红色点单向抓取
S: 朝向绿色单向抓取
E: 对称抓取
Q: 圆形抓取
下图为按了E键的效果
对称抓取是针对二指抓取器的
如果是单侧的话
代表一边的抓手先到红色点然后再抓取
4 按 左/右 调整抓取宽度 (抓取宽度比物体宽2cm,两侧各1cm)
左: 增加
右: 减小
代表抓手的张开宽度 (一定要物体更宽防止碰撞)
换下一张:空格
在换下一张时,当前图像上标注的数据会保存至pcd****label.txt,
这是生成的遥控器的抓取配置
.txt 命名是pcd+编号+Label
每一行五个数
第三个数和第四个数就是抓取角的弧度
如果使用单侧抓取模式
此时只有一个抓取角弧度
最后一个数代表抓取宽度
是以像素为单位的
注:圆形抓取
此时只有三个数
前两个数是抓取点的横轴和纵轴
第三个数就是抓取宽度也就是直径
没有角度是因为在这种情况下怎么抓取都是可以的
对应修改path为刚刚的test的路径即可(记得调整反斜杠)
运行前
运行后
对每个图片生成了.mat格式文件
里面的内容是
3代表3个通道
480 640 代表图片大小
抓取点这个通道其实就是对这个480*640的图片上每个像素的抓取置信度
刚刚标注的就是浅蓝色上的点都是置信度都是1其他都是0
抓取角是当时标注时的第一个角
比如说第一行这里它就只选择3.03914880008267作为抓取角
抓取宽度是除以一个数让它在0-1之间
这样就可以直接用sigmod
.mat格式可以通过python的scipy直接读取
修改path为test的路径
注意反斜杠
保存路径如下(此处将保存函数注释掉了,需要的话可以解开注释)
运行结果
缩放
旋转(抓取配置也要对应旋转)
裁剪出适合图像训练的尺寸
随机的翻转
def __getitem__(self, idx):
# 读取img和标签
image = DepthImage(self.depth_files[idx])
label = GraspMat(self.grasp_files[idx])
# 数据增强
if self.argument:
# resize
scale = np.random.uniform(0.9, 1.1)
image.rescale(scale)
label.rescale(scale)
# rotate
rota = 30
rota = np.random.uniform(-1 * rota, rota)
image.rotate(rota)
label.rotate(rota)
# crop
dist = 30
crop_bbox = image.crop(self.output_size, dist)
label.crop(crop_bbox)
# flip
flip = True if np.random.rand() < 0.5 else False
if flip:
image.flip()
label.flip()
else:
# crop
crop_bbox = image.crop(self.output_size)
label.crop(crop_bbox)
# img归一化
image.normalize()
# 获取target
label.encode()
img = self.numpy_to_torch(image.img)
grasp_point = self.numpy_to_torch(label.grasp_point)
grasp_cos = self.numpy_to_torch(label.grasp_cos)
grasp_sin = self.numpy_to_torch(label.grasp_sin)
grasp_width = self.numpy_to_torch(label.grasp_width)
return img, (grasp_point, grasp_cos, grasp_sin, grasp_width)
归一化就是减去均值,让其位于-1~1之间 (0均值标准化使其符合正态分布)