AirSim图像数据集收集
AirSim图像数据集收集
文章目录
- AirSim图像数据集收集
- 前言
- 一、本文实现的效果
- 二、环境依赖
- 1.基本说明
- 2.安装依赖
- 三、程序实现
- 1.基本说明
- 2.implementation
- 总结
- 下篇预告
前言
从该文开始为视觉目标检测做准备,本文介绍一种半自动收集数据集的方法。
一、本文实现的效果
以下的图像数据集均为程序自动收集的,我们通过手动控制无人机切换不同位置以及视角来收集具有多样性的图像数据集。
二、环境依赖
1.基本说明
如果跟着之前的文章做实验,那么恭喜你,这次环境依赖并没有增加。如果你没有看过之前的文章,那么在进行实验之前需要安装pygame库以及opencv-python库。其中pygame库用来做基本的可视化以及实现多按键控制,opencv库用来对AirSim的图像API返回的图像数据进行解码,以及保存图像,写入特定文件夹。
2.安装依赖
安装指令如下:
pip3 install pygame
pip3 install opencv-python
三、程序实现
1.基本说明
当前能够较实时读取的图像分辨率都比较低,事实上,在AirSim中,读取1920x1080分辨率的图像的时候,每帧时间高达300+ms,对视觉集群来说是基本不可行的,而且高分辨率图像给检测带来了较大挑战,我们也没有必要使用到如此高的分辨率。在多次实验测试后,我们决定使用480P的图像进行视觉集群,在单目距离估计中,对于DJI M200模型的无人机对象,如下图所示,该分辨率下有效检测距离达到10米以上,是完全可以满足我们的需求的。
基本的程序流程如下所示:
要注意的是,图像的保存名称应该是动态变化的,否则新图像会不断覆盖旧图像。为了解决这个问题,我们应该对每次的新图像起新名称。容易想到的两种解决方案是使用时间戳或者使用文件夹中文件总数,第二种有覆盖的风险,这里,我们采用时间戳的方法,基本使用如下所示。
import datetimesave_name = images_save_path + str(datetime.datetime.now().strftime('date%w_%H_%M_%S')) + ".jpg"
2.implementation
代码在进阶版的键盘控制基础上增加自动保存数据集的功能,默认的控制可能并不符合自己的手感,可以随意调节,另外在程序中需要修改images_save_path变量。
import sys
import cv2
import time
import airsim
import pygame
import datetime# >------>>> pygame settings <<<------< #
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption('keyboard ctrl @FPV')
screen.fill((0, 0, 0))
# >------>>> -------------------------------- <<<------< ## >------>>> AirSim settings <<<------< #
# 这里改为你要控制的无人机名称(settings文件里面设置的)
base_name = "Drone"
vehicle_index = [0, 1]
now_index = vehicle_index[0]AirSim_client = airsim.MultirotorClient()
AirSim_client.confirmConnection()AirSim_client.enableApiControl(True, vehicle_name=base_name + str(vehicle_index[0]))
AirSim_client.enableApiControl(True, vehicle_name=base_name + str(vehicle_index[1]))AirSim_client.armDisarm(True, vehicle_name=base_name + str(vehicle_index[0]))
AirSim_client.armDisarm(True, vehicle_name=base_name + str(vehicle_index[1]))AirSim_client.takeoffAsync(vehicle_name=base_name + str(vehicle_index[0]))
AirSim_client.takeoffAsync(vehicle_name=base_name + str(vehicle_index[1])).join()image_types = {"scene": airsim.ImageType.Scene,"depth": airsim.ImageType.DepthVis,"seg": airsim.ImageType.Segmentation,"normals": airsim.ImageType.SurfaceNormals,"segmentation": airsim.ImageType.Segmentation,"disparity": airsim.ImageType.DisparityNormalized}
# >------>>> -------------------------------- <<<------< ## >------>>> manual controller settings <<<------< #
# 基础的控制速率
base_rate = 0.2
# 悬停时的油门
base_throttle = 0.55
# 设置临时加速比例
speedup_ratio = 4.0
# 用来设置临时加速
speedup_flag = Falsechange_time = 0.0
# 防止来回切换控制对象
enable_change = True
# 用来标记当前是否进行键盘控制
control_iteration = False
# >------>>> -------------------------------- <<<------< ## >------>>> datasets collect settings <<<------< #
# 1.5s 保存一帧
start_time = 0.0
save_period = 1.5
save_all_number = 0
# 需要把保存路径改成自己的文件夹
images_save_path = "../data/datasets/temp/"while True:pitch_rate = 0.0yaw_rate = 0.0roll_rate = 0.0throttle = base_throttlecontrol_iteration = Falsefor event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()scan_wrapper = pygame.key.get_pressed()# 按下空格键加速10倍if scan_wrapper[pygame.K_SPACE]:scale_ratio = speedup_ratioelse:scale_ratio = speedup_ratio / speedup_ratio# 切换两秒后方可再次切换if time.time() - change_time > 2:enable_change = True# 需要加上enable_change变量判断,否则会来回切换if scan_wrapper[pygame.K_LCTRL] and scan_wrapper[pygame.K_c] and enable_change:enable_change = Falsechange_time = time.time()if now_index == vehicle_index[0]:now_index = vehicle_index[1]else:now_index = vehicle_index[0]print(f"change to drone{now_index} ···")time.sleep(0.2)# 根据 'A' 和 'D' 按键来设置偏航速率变量if scan_wrapper[pygame.K_a] or scan_wrapper[pygame.K_d]:control_iteration = Trueyaw_rate = (scan_wrapper[pygame.K_a] - scan_wrapper[pygame.K_d]) * scale_ratio * base_rate# 根据 'UP' 和 'DOWN' 按键来设置pitch轴速率变量(NED坐标系,pitch为机头向前)if scan_wrapper[pygame.K_UP] or scan_wrapper[pygame.K_DOWN]:control_iteration = Truepitch_rate = (scan_wrapper[pygame.K_UP] - scan_wrapper[pygame.K_DOWN]) * scale_ratio * base_rate# 根据 'LEFT' 和 'RIGHT' 按键来设置roll轴速率变量(NED坐标系,roll为正右方)if scan_wrapper[pygame.K_LEFT] or scan_wrapper[pygame.K_RIGHT]:control_iteration = Trueroll_rate = -(scan_wrapper[pygame.K_LEFT] - scan_wrapper[pygame.K_RIGHT]) * scale_ratio * base_rate# 根据 'W' 和 'S' 按键来设置z轴速率变量(NED坐标系,z轴向上为负,油门为正数)if scan_wrapper[pygame.K_w] or scan_wrapper[pygame.K_s]:control_iteration = Truethrottle = base_throttle + (scan_wrapper[pygame.K_w] - scan_wrapper[pygame.K_s]) * scale_ratio * base_rate# 速率需要限幅if pitch_rate > 1.0:pitch_rate = 1.0elif pitch_rate < -1.0:pitch_rate = -1.0if yaw_rate > 1.0:yaw_rate = 1.0elif yaw_rate < -1.0:yaw_rate = -1.0if roll_rate > 1.0:roll_rate = 1.0elif roll_rate < -1.0:roll_rate = -1.0if throttle > 1.0:throttle = 1.0elif throttle < 0.0:throttle = 0.0# 获取正前方的一帧图像temp_image = AirSim_client.simGetImage('0', image_types["scene"], vehicle_name=base_name + str(now_index))if temp_image is None:print("Warning: Failed to read a frame!! ")pygame.quit()else:pass# 将图像进行解码,变成像素值为0-255的范围,保存路径自行修改image = cv2.imdecode(airsim.string_to_uint8_array(temp_image), cv2.IMREAD_COLOR)cv2.imwrite("visual.png", image)# 不控制的时候保持悬停,也可以用于刹车if control_iteration:# 设置速率控制以及设置偏航控制AirSim_client.moveByRollPitchYawrateThrottleAsync(pitch=pitch_rate, roll=roll_rate, yaw_rate=yaw_rate,throttle=throttle, duration=0.05,vehicle_name=base_name + str(now_index))else:# 保持当前位置AirSim_client.hoverAsync(vehicle_name=base_name + str(now_index))# 自动生成的图片名称save_name = images_save_path + str(datetime.datetime.now().strftime('date%w_%H_%M_%S')) + ".jpg"if time.time() - start_time >= save_period:success = cv2.imwrite(save_name, image)if success:save_all_number += 1print("\rsaving the {:4d} frames...".format(save_all_number), end='')else:print(f"Warning: Failed to save {save_name}")start_time = time.time()# 利用pygame库加载保持的第一视角图像,screen_image = pygame.image.load("visual.png")# 图像坐标系,左上角为(0, 0),在此放置图片screen.blit(screen_image, (0, 0))pygame.display.flip()pygame.display.update()# press 'Esc' to quitif scan_wrapper[pygame.K_ESCAPE]:pygame.quit()sys.exit()
总结
该文提供了一种半自动收集数据集的方法,在控制无人机进行飞行时程序自动定时收集数据集,事实上,在实际应用时应该采用快捷键启动数据集收集与停止数据集收集,不过在前两篇博文的基础上,应该自己就能轻松想到解决方案,这个工作留给读者自己去做。
下篇预告
随着代码功能块分散,程序可读性会越来越差,下篇博文将开始进行功能封装,并且开始搭建yolov5的深度学习目标检测算法。
AirSim图像数据集收集相关推荐
- ImageNet图像数据集介绍
ImageNet图像数据集始于2009年,当时李飞飞教授等在CVPR2009上发表了一篇名为<ImageNet: A Large-Scale Hierarchical Image Databas ...
- 计算机视觉的“惨胜”:反思大型图像数据集
诞生于第二次世界大战.恐怖纳粹统治时期的1947年纽伦堡法案和随后的1964年赫尔辛基宣言,帮助人们建立起了知情同意原则(Informed Consent),该原则建立在人类尊严和控制关于自己信息传播 ...
- Dataset:数据集集合(CV方向数据集)-常见的计算机视觉图像数据集大集合包括表面缺陷检测数据集(持续更新)
Dataset:数据集集合(CV方向数据集)-常见的计算机视觉图像数据集大集合包括表面缺陷检测数据集(建议收藏,持续更新) 目录 CV常用数据集平台集合 Mendeley Data CAISA-Web ...
- 如何做一个“实用”的图像数据集
目录 引言 一.探究数据的"用途" 二.梳理专业的"知识" 三.数据与知识"迭代" 四.确定性能的"指标" 五.总结 鸣 ...
- 如何让机器向“时尚达人”学习?阿里做了个“实用”的图像数据集
阿里妹导读:阿里资深算法专家雷音带领的团队,有个非常特别的名字,叫做"图像与美".雷音希望,未来AI产品对衣服的理解不只限于照片和文字,还可以理解衣服本身,进而理解时尚穿搭之道.理 ...
- Dataset之CV:人工智能领域数据集集合(计算机视觉CV方向数据集)之常见的计算机视觉图像数据集大集合(包括表面缺陷检测数据集,持续更新)
Dataset之CV:人工智能领域数据集集合(计算机视觉CV方向数据集)之常见的计算机视觉图像数据集大集合(包括表面缺陷检测数据集,持续更新) 目录 CV常用数据集平台集合 Mendeley Data ...
- 计算机视觉方向地理空间遥感图像数据集汇总
文章目录 1.DSTL卫星图像数据集/Kaggle竞赛 2.Swimming Pool and Car Detection/Kaggle竞赛 3.SpaceNet Challenge 3数据集 4.R ...
- 各种数据集总结 图像数据集 语音数据集
1.图像数据集: (1)MNIST:由纽约大学的Yann LeCun整理的手写数字(0-9)数据集,图片大小为28*28,包含60000个训练集,10000个测试集,广泛用于机器学习的测试和训练. ( ...
- 常用图像数据集:标注、检索
http://www.csdn123.com/html/blogs/20131023/87499.htm 常用图像数据集:标注.检索 返回脚本百事通 1.搜狗实验室数据集: http://www.so ...
最新文章
- 那些想坐等AI成熟再采用的公司,可能永远也跟不上AI浪潮
- ora-01033:oracle initializationgorshutdown 处理方法
- Ubuntu-16.04 部署 OpenStack Ocata下
- Jetty实战之 嵌入式Jetty运行web app
- php 返回map,PHP Ds\Map get()用法及代码示例
- JVM监控-命令行篇
- gridview 导出到excel,repeater类似
- 谷歌TensorFlow Lite支持Core ML
- MySQL集群搭建--多主模式
- 计算机字符编码详尽讲解
- 利用modelarts和物体检测方式识别验证码
- Software Switching优化
- Faied to run MSBuild commond CmakeError
- 【月径流预测】基于matlab海洋捕食者算法优化BP神经网络月径流预测【含Matlab源码 2002期】
- 用户手册 (V4.0 版)
- 大学英语四六级13年12月大改革应对办法全套复习规划
- 声纹技术(三):声纹识别技术
- 牛逼,手机居然可以无线投屏到笔记本电脑!
- 用css写一个向下的箭头
- Mybatis-笔记1