利用无人机的倾斜摄影技术可以全自动、高效率、高精度、高精细的构建地表全要素三维模型/实景三维模型,而模型的质量主要取决于两个因素:
一是影像质量(影像地面分辨率和影像清晰度);
二是照片数量(对同一区域的照片覆盖度)。
无人机倾斜摄影及建模的一般流程为:
整个过程有四重知识面可以拆解:无人机类型、倾斜摄影相机选择、三维建模、应用场景。下文详述。
1、无人机飞行器的分类与选择
无人机系统由飞机平台系统、信息采集系统和地面控制系统组成。每个系统的核心元件如图所示。
无人机的能源类型有电动、油动类型:
油动力固定翼无人机,虽然飞行效率和性能都不错,但使用和保养要求高,那么就可以考虑电动/混合动力垂直起降固定翼无人机。而常见的电动垂直起降固定翼无人机的有效载荷1~2公斤,续航时间60~90分钟,相对飞行高度300米左右,影像地面分辨率5厘米。
根据机翼情况,常见的各类型工业无人机特点有:
多旋翼无人机:起降条件要求低,可空中悬停拍照;
固定翼无人机:飞行姿态稳定,体积小;
其他:如大载荷无人机,体积大,载荷大,安全性能高。
一般来说,八旋翼无人机的起飞重量应小于7公斤,作业续航时间20分钟,使用远景双镜头摆动式倾斜摄影相机,每架次飞行可获取有效面积0.3平方公里2厘米分辨率的照片约900张。
在实际作业中,对于一些特定项目,四旋翼无人机可能载荷指标不够;八旋翼无人机有一定的动力冗余和飞行可靠性,可以提高作业的安全性和持续性,那么就满足要求。
从经验来看,多旋翼无人机是进行建筑区倾斜摄影的首选,一般地区的倾斜摄影则可选择小型电动垂直起降固定翼无人机。实际上,每个项目的具体要求不同,设备选择就要根据实际情况来测试,综合考虑选择最合适的机型。
2、倾斜摄像机的选择
倾斜摄像机属于工业级无人机范畴。与消费级无人机市场不同,工业级市场由于主要侧重飞机的技术性能和行业应用,因此需要在实际运用中与需求方反复沟通和不断地改进方案,选择合适的机型以制定航拍计划。
从建模效果来看,要想获得完整清晰、可供高精度量测的三维模型,建筑区倾斜影像的分辨率一般要达到2~3厘米、一般地区要达到5~6厘米,照片的平均覆盖度要达到30度重叠以上。
使用倾斜摄影无人飞行器的目的是为三维建模提供影像基础,虽然市面上固定式五镜头倾斜摄影相机是无人机倾斜摄影普遍使用的设备之一,但也有专家探究了倾斜摄影三维建模对照片方位和数量、相机数量的要求。
实验分别采用1台和2台相机,对同一区域采用多次飞行、交叉飞行的方法,模拟五镜头相机的方式,分别获取下视、前视、后视、左视、右视的影像,并以不同组合分别进行了三维建模试验。
用不同数量相机模拟五相机结构进行倾斜摄影试验的主要结论如下:
(1)建模效果与相机数量无关,但与照片数量和相邻航线飞行的间隔时间相关;
(2)下视相机不是必须的,因为真正射影像是由三维模型的正投影生成。下视相机的作用与其它方位相机的作用相似;
(3)倾斜相机的角度在20~30度之间较为合适。45度倾斜角安置的相机的照片边缘的分别率过低;
(4)采用双相机、三相位摆动结构的倾斜摄影系统综合性价比最优。
实验表明双镜头摆动式倾斜摄影系统仅用两台相机就达到了固定式五镜头相机的效果,系统结构简单、成本低、重量轻、维修使用方便,可以是多旋翼无人机倾斜摄影的良好选择。但具体选择依然要结合实际情况,论证后再设计航拍计划,在避免不必要的资源浪费的情况下,获得三维重建的额影像数据。
3、航线设计与飞行作业
飞行任务规划是指在区域空照、导航、混合三种模式下进行飞行任务的规划。举两个常见的例子:如使用多旋翼无人机和双镜头摆动式倾斜摄影系统进行建筑区2厘米分辨率的倾斜摄影,航线设计的通常要求是:
(1)航摄分区尽量为矩形,航线沿矩形区域长边方向敷设,实际飞行范围应超出任务范围1个航高,分区内地形高差小于1/2航高;
(2)航线数量为双数且不少于6条,单航线最大长度按多旋翼无人机有效续航里程的40%计算;
(3)相对航高平均按100米设计,当航摄分区内有超过30米的建筑物时,最小相对航高应按100米加上建筑物高度计算;
(4)航向重叠度大于75%,旁向重叠度大于30%。
如使用双相机和固定翼无人机对普通地区进行5厘米分辨率的倾斜摄影,航线设计的通常要求是:
(1)航摄分区尽量为矩形,沿矩形区域长边方向和短边方向分别敷设航线,呈格网状(按十字交叉飞行),实际飞行范围应超出任务范围1个航高,分区内地形高差小于1/2航高;
(2)航线数量应为双数且不少于6条,单航线最大长度按无人机有效续航里程的40%设计,最大长度不超过5500米;
(3)相对航高平均按300米设计,最小相对航高应高于摄区内容其他构筑物100米以上;
(4)航向重叠度大于75%,旁向重叠度大于30%。
另外,在开始飞行作业前,要进行航前检查。为保证任务的安全进行,起飞前结合飞行控制软件进行自动检测,确保飞机的GPS、罗盘、空速管及其俯仰翻滚等状态良好,避免在航拍中危险情况的发生。
飞行作业时要进行航飞监控,实时掌握飞机的姿态、方位、空速、位置、电池电压、即时风速风向、任务时间等重要状态,便于操作人员实时判断任务的可执行性,进一步保证任务的安全。
每个航摄分区应统一进行航线设计,用在同一航线设计文件中删除多余航线的方法确定每架次的飞行参数文件。
同时,根据不同行业的具体情况,可在外出作业时选择配备10组以上电池,或配置便携式发电机现场充电,以提高作业效率。无人机起降场地应尽量靠近摄区,以减少无效飞行距离。作业小组配置的地勤、飞手、助理和设备量,就要依照具体项目决定了。
4、实景三维重建方法及应用场景
传统三维建模通常使用3dsMax、AutoCAD等建模软件,基于影像数据、CAD平面图或者拍摄图片估算建筑物轮廓与高度等信息进行人工建模。这种方式制作出的模型数据精度较低,纹理与实际景象偏差大,生产过程依赖大量的人工参与,同时数据制作周期较长,造成数据的时效性较低,因而无法真正满足用户需要。那么,如何用无人机倾斜摄影拍摄的图片生成实景三维实景模型呢?
将无人机拍摄的画面导入计算机后,打开【RGB3DS-RS实景三维重建系统】,使用账号密码登陆,添加实景/实物影像后点击"自动处理",系统从空三匹配至纹理映射全过程自动处理,得到三维纹理模型。
这种一键建模模式可快速完成实景三维重建,以便后续的产品转化和使用。【RGB3DS-RS实景三维重建系统】还有独特的分步建模模式:
①添加影像:添加被摄物/区域影像并新建工程
②自动空三:影像数据进行自动解算,得到RGB点云
③三维重建:基于点云进行构网建模、自动映射纹理得到三维纹理模型
通过【RGB3DS-RS实景三维重建系统】进行实景三维重建得到的实景3D模型,可视化效果良好,可显示显示精确地理位置及1:1尺寸信息,以便多元量测:可直接在可视化的多元数据成果上量测出与实景一致的距离、面积、体积、点位坐标等信息。
使用【RGB3DS-RS实景三维重建系统】完成重建后, 可借助实景三维数字成果进行下一步工作
该系统可适用于大范围、高精度、高清晰的方式全面感知复杂场景。这种高效的数据采集设备及专业的数据处理流程生成的数据成果直观反映地物的外观、位置、高度等属性,为真实效果和测绘级精度提供保证。在应急指挥、国土安全、城市管理、交通运维、工程监测、基坑监测、数字存档等领域均可发挥出色效用。
【RGB3DS-RS实景三维重建系统】是博雅弘拓科技推出的一款三维重建软件。它基于视觉AI和图像精密解算技术,让使用者可借助影像一键生成RGB密集点云DSM、数字高程模型DEM、数字正射影像DOM、真彩纹理模型等可视化数字成果并进一步使用。
文章来源:文章来自公众号"博雅3D"。
Original: https://blog.csdn.net/Boyahongtuo/article/details/124825454
Author: 博雅弘拓科技
Title: 如何用无人机倾斜摄影采集影像,完成实景三维重建?
相关阅读1
Title: 解决(‘You must install pydot (pip install pydot
) and install graphviz (see...) ‘, ‘for plot_model..
目录
一、报错提示
调用keras.utils.plot_model报错提示:
('You must install pydot (pip install pydot
) and install graphviz (see instructions at https://graphviz.gitlab.io/download/) ', 'for plot_model/model_to_dot to work.')
因为tensoerflow2.0以上兼容了keras,只是产生图而已,所以不必在这里使用tf.keras,再者使用tf.keras也会报错,tf的库里没有这个函数。
二、解决方案(共四步)
2.1 安装pydot
按照提示,安装pydot
pip install pydot
2.2 下载并安装graphviz包
踩坑:千万别pip install graphviz。因为测试过无效。
正确做法是从官网
找到如下图所示的Win10 64位版本的graphviz进行下载,然后安装
下一步就好了
; 2.3 配置环境变量(graphviz)
进入到安装的bin目录下
变量名:别与系统的专用词冲突即可
变量值:路径,我这里是D:\Graphviz\bin (仅供参考)
2.4 调用
添加环境变量后,引入包
from keras.utils.vis_utils import plot_model
模型编译后调用plot_model函数(见下图)
(to_file中设置产生图片的路径,下面这种方式表示保存到当前文件下)
keras.utils.plot_model(model, to_file='graph.png', show_shapes=True)
三、结果展示
模型编译后运行就会产生对应的可视化结构
由于比较长,只截取部分
Original: https://blog.csdn.net/QAQIknow/article/details/119188790
Author: sinysama
Title: 解决(‘You must install pydot (pip install pydot
) and install graphviz (see...) ‘, ‘for plot_model..
相关阅读2
Title: tensorflow语义分割计算mIoU时忽略某一类别
在做语义分割的时候,有不少数据集中的部分类别是我们不想让其参与mIoU计算的。tensorflow忽略某一类别计算mIoU的方法网上比较少。经过阅读tensorflow文档,总结出一下求解方法:
数据准备:
1、先理解一维张量:
其实数组和张量相通,tensorflow绝大多数情况下能自动转化
假设有张量a,b
a = np.array([0, 1, 2, 3]) # 真实
b = np.array([0, 1, 0, 3]) # 预测
手动计算一下mIoU
类别0:= 交集 / 并集 = 1 / 2 = 0.5
类别1:= 1 / 1 = 1
类别2:= 0 / 1 = 0
类别3:= 1 / 1 = 1
因此 :mIou = (0.5+1+0+1)/4 = 0.625
利用tensorflow的 API计算如下:
import numpy as np
import tensorflow as tf
a = np.array([0, 1, 2, 3])
b = np.array([0, 1, 0, 3])
iou = tf.keras.metrics.MeanIoU(num_classes=4)
iou.update_state(a, b)
print('mIoU为: ',iou.result().numpy())
上述是所有类别都参与运算的情况,现在假设我们要忽略的类别为3
以下分两种情况讨论:
情况1:
a = np.array([0, 1, 2, 3]) # 真实
b = np.array([0, 1, 0, 3]) # 预测
情况2:
a = np.array([0, 1, 2, 3]) # 真实
b = np.array([0, 1, 0, 0]) # 预测
情况1和情况2的不同点在于,真实值中类别3的位置对应的预测值为3或者其他值时,应该怎么计算单个类别的iou呢?(例如情况2中的类别0)
带着问题我们首先去用tensorflow的API来计算,然后再分析手动计算的方法
先看代码:
情况1:
a = np.array([0, 1, 2, 3])
b = np.array([0, 1, 0, 3])
iou = tf.keras.metrics.MeanIoU(num_classes=4)
sample_weight = np.ones_like(a)
sample_weight[a == 3] = 0
iou.update_state(a, b,sample_weight)
print('mIoU为: ',iou.result().numpy())
情况2:
a = np.array([0, 1, 2, 3])
b = np.array([0, 1, 0, 0])
iou = tf.keras.metrics.MeanIoU(num_classes=4)
sample_weight = np.ones_like(a)
sample_weight[a == 3] = 0
iou.update_state(a, b,sample_weight)
print('mIoU为: ',iou.result().numpy())
可见两种情况的mIoU计算结果不受类别3位置的元素类别影响,也就是说,在预测结果中真实标签位置的预测值随意,不影响最后的结果
因此手动计算方法可以归纳如下:
把真实标签中被忽略类别的位置记录下来,然后把真实值和预测值在该位置的元素直接删除,然后按照计算常规mIou的计算方法计算即可
下面分析一下API的使用方法:
我们要忽略某一类别,实际是将此类别计算IoU的权重设置为0。tensorflow在MeanIoU类中的update_state()方法有一个sample_weight参数:
该参数的官方解释含义如下:(贴一下连接:tf.keras.metrics.MeanIoU | TensorFlow Core v2.3.0)
sample_weight是一个张量或数组,形状与y_true和y_pred相同,或者广播后相同,为了避免广播造成的错误,建议使用与y_true和y_pred相同的张量。默认情况下sample_weight即使不设置,在计算时tensorflow也会自动补充为1。当我们想忽略某一类别时,直接将sample_weight权重数组对应位置设置为0就行,其他位置的值还保持为1
这样再回头看上述代码,应该就能比较清楚了。
2、高维张量:
一维张量理解后多维的多维的也就能顺理成章的。在此只给出例子:
读者可以自己手动计算一下。
a = np.array([[[0, 1, 2], [0, 1, 2], [0, 1, 3]],[[0, 1, 1], [0, 1, 0], [0, 1, 2]]])
b = np.array([[[0, 1, 2], [0, 1, 2], [0, 1, 3]],[[0, 1, 1], [0, 0, 0], [0, 1, 2]]])
a = np.expand_dims(a,-1)
b = np.expand_dims(b,-1)
iou = tf.keras.metrics.MeanIoU(num_classes=4)
sample_weight = np.ones_like(a)
sample_weight[a == 3] = 0
iou.update_state(a, b,sample_weight)
print(a.shape)
print(b.shape)
print('mIoU为: ',iou.result().numpy())
补充:
当我们想要自定义可以忽略某一类别的mIou计算类的时候可以参考如下的自定义方法:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
a = np.array([[[0, 1, 2], [0, 1, 2], [0, 1, 3]], [[0, 1, 1], [0, 1, 0], [0, 1, 2]]])
b = np.array([[[0, 1, 2], [0, 1, 2], [0, 1, 3]], [[0, 1, 1], [0, 0, 0], [0, 1, 2]]])
a = np.expand_dims(a, -1)
b = np.expand_dims(b, -1)
iou = tf.keras.metrics.MeanIoU(num_classes=4)
sample_weight = np.ones_like(a)
sample_weight[a == 3] = 0
iou.update_state(a, b, sample_weight)
print('a的shape:', a.shape)
print('b的shape:', b.shape)
print('tensorflow 内置API计算mIoU为: ', iou.result().numpy())
class MeanIoU(tf.keras.metrics.MeanIoU):
def __init__(self, num_classes, ignore_class_id, name=None, dtype=None):
"""
num_classes:需要计算mIoU的像素类别数 +1 !!!一定要加1
ignore_class_id: 需要忽略的像素类别 类型为列表
"""
super(MeanIoU, self).__init__(num_classes, name=name, dtype=dtype)
self.ignore_class_id = ignore_class_id
def __call__(self, y_true, y_pred):
if self.ignore_class_id:
self.sample_weight = np.ones_like(y_true.numpy())
for i in self.ignore_class_id:
self.sample_weight[y_true.numpy() == i] = 0
else:
self.sample_weight = None
return super().__call__(y_true, y_pred, sample_weight=self.sample_weight)
iou2 = MeanIoU(4, [3, ])
a = tf.convert_to_tensor(a)
b = tf.convert_to_tensor(b)
iou2(a, b)
print("自定义的mIoU类计算结果:", iou2.result().numpy())
Original: https://blog.csdn.net/qq_39197555/article/details/124516356
Author: 山顶洞人
Title: tensorflow语义分割计算mIoU时忽略某一类别
相关阅读3
Title: 树莓派-14-打造智能音箱
智能音箱,是一个音箱升级的产物,是家庭消费者用语音进行上网的一个工具,比如点播歌曲、播报新闻、或是了解天气预报,它也可以对智能家居设备进行控制,比如打开窗帘、设置冰箱温度、提前让热水器升温等。
1 硬件
1.1 音箱
把音箱插到树莓派的3.5mm接口上。
card 0是树莓派自带的声卡,3.5mm接口的音箱设备,接入的音箱,用的就是这个声卡,其设备编号为device 0。
headphones 耳机; 头戴式受话器
; 1.2 麦克风
$ alsamixer
Capture:拾音器
$ arecord -d 3 temp.wav录音
$ aplay temp.wav播放
树莓派如果新增了麦克风的输入设备,需要进行如下操作,改配置文件让usb声卡作为默认的音频输入
在/home/pi目录下新增如下文件
sudo vim .asoundrc
新增如下内容 (这个地方根据自己的来,默认按照如下情况,特殊情况特殊对待)
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "hw:0,0"
}
capture.pcm {
type plug
slave.pcm "hw:1,0"
}
}
2 软件
2.1 wukong-robot
wukong-robot 只支持 Python 3.x
$ cd /home/pi/
**********************************************************************
(1)克隆仓库
$ git clone https://github.com/wzpan/wukong-robot.git克隆仓库
**********************************************************************
(2)安装sox和ffmpeg和PyAudio
$ sudo apt-get install portaudio19-dev python-pyaudio python3-pyaudio sox pulseaudio libsox-fmt-all ffmpeg
$ pip3 install pyaudio
**********************************************************************
(3)安装依赖的库:
$ cd wukong-robot
$ pip3 install -r requirements.txt
$ pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
pyyaml>=4.2b1
requests==2.21.0
baidu-aip==2.0.0.1
pydub==0.23.1
python-dateutil==2.7.5
watchdog==0.9.0
pytz==2018.9
fire==0.1.3
tornado==5.1.1
markdown==3.0.1
semver==2.8.1
websocket==0.2.1
websocket-client==0.56.0
pypinyin
jieba
**********************************************************************
(4)手动编译snowboy得到_snowboydetect.so以支持更多的平台
(4-1)安装swig
$ sudo apt-get -y update
$ sudo apt-get install -y libpcre3 libpcre3-dev
$ sudo apt-get install python3-dev
$ cd /home/pi
$ wget http://hahack-1253537070.file.myqcloud.com/misc/swig-3.0.10.tar.gz
$ tar xvf swig-3.0.10.tar.gz
$ cd swig-3.0.10
$ ./configure --prefix=/usr --without-clisp --without-maximum-compile-warnings
$ make
$ sudo make install
$ sudo install -v -m755 -d /usr/share/doc/swig-3.0.10
$ sudo cp -v -R Doc/* /usr/share/doc/swig-3.0.10
$ sudo apt-get install -y libatlas-base-dev
(4-2)构建snowboy
$ cd /home/pi/
$ wget http://hahack-1253537070.file.myqcloud.com/misc/snowboy.tar.bz2
$ tar -xvjf snowboy.tar.bz2
$ cd snowboy/swig/Python3
$ make
$ cp _snowboydetect.so <wukon-robot的根目录/snowboy/>
$ cp _snowboydetect.so /home/pi/wukong-robot/snowboy/
**********************************************************************
(5)安装第三方技能插件库 wukong-contrib
$ mkdir $HOME/.wukong
$ cd $HOME/.wukong
$ git clone http://github.com/wzpan/wukong-contrib.git contrib
$ pip3 install -r contrib/requirements.txt
2.2 树莓派必须更新唤醒词
默认自带的唤醒词是在 Macbook 上录制的,用的是作者的声音模型。但由于不同的人发声不同,所以不保证对于其他人都能很好的适用。
而树莓派上或者其他板子上接的麦克风可能和 PC 上的麦克风的声音畸变差异非常大,所以现有的模型更加不能直接在树莓派上工作,否则效果会非常糟糕。
如果你是第一次使用,需要先创建一个配置文件方便配置唤醒词。这个工作可以交给 wukong-robot 帮你完成。在 wukong-robot 的根目录下执行:
$ cd /home/pi/wukong-robot/
$ python3 wukong.py
第一次启动将提示你是否要到用户目录下创建一个配置文件,输入 y 即可。配置文件将会保存在 ~/.wukong/config.yml 。
在浏览器中输入 localhost:5000 ,即可进入登陆页面,账号默认 wukong ,密码默认:wukong@2019
登录进后台之后,就可以对 wukong-robot 的 API 进行修改和配置了。
2.3 树莓派安装docker
根据官网建议,我们最好是使用,docker官方提供的便捷脚本来一键安装。
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ docker -v【20.10.5】
2.4 修改唤醒词
本地部署一个 snowboy-seasalt 服务
$ sudo docker pull rhasspy/snowboy-seasalt
$ sudo docker run -it -p 8000:8000 rhasspy/snowboy-seasalt
Original: https://blog.csdn.net/qq_20466211/article/details/114411139
Author: 皮皮冰燃
Title: 树莓派-14-打造智能音箱

百度语音合成模型Deep Voice3

PaddlePaddle的静态图与动态图

论文学习–Learning High-Speed Flight in the Wild

【好数推荐】数据堂平均音色语音库

tensorflow一些参数的详细讲解分享(tensorflow1的哦)

python 智能语音_python实现人工智能语音助手

Ubuntu 系列学习(三)Ubuntu下深度学习相关软件安装

ValueError: operands could not be broadcast together with shapes (100,) (71,)

opencv (三十四)边缘提取(拉普拉斯算子、Canny算法)

说话人识别综述阅读1

《剑指Offer》09-用两个栈实现队列

Windows上安装GPU版本TensorFlow的详细安装步骤

Windows下安装mmdetection

语音翻译常用数据集
