一、基础的图像变化 之前做过了Harris特征匹配和SIFT特征匹配的测试例子,如果要实现拼接,会涉及到一些基础的图像处理,简单的2D图像变换主要包括以下几种:
1. 平移变换
主要是水平方向和垂直方向地移动变换,2个自由度。
2. 刚体变换
刚体变换包含旋转和平移变换, 3个自由度,点与点之间的距离不变。就好像你扔了一把三角尺出去,不仅在位置上发生变化,也进行了一定角度的旋转。
3. 相似变换
相似原理大家高中都学过,就是形状不变,加了缩放尺度, 四个自由度,点与点之间的距离比不变。
4. 仿射变化,
仿射变换和相似变换近似,不同之处在于相似变换具有单一旋转因子和单一缩放因子,仿射变换具有两个旋转因子和两个缩放因子,因此具有6个自由度. 不具有保角性和保持距离比的性质,但是原图平行线变换后仍然是平行线.。
5. 投影变换
投影变换叫作单应性变换。投影变换是齐次坐标下非奇异的线性变换。然而在非齐次坐标系下却是非线性的,这说明齐次坐标的发明是很有价值的。投影变换比仿射变换多2个自由度,具有8个自由度。
下面主要介绍的是二维图像的仿射变化。
二、图像仿射变换原理 刚开始老师介绍图像变换类型的时候并不太明白仿射是什么含义,后来通过例子明白其实仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”或者“二维坐标变换”和“三维坐标变换”。
定义:仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。
仿射变换能够保持图像的“平直性”,包括旋转,缩放,平移,错切操作。一般而言,仿射变换矩阵为2*3的矩阵,第三列的元素起着平移的作用,前面两列的数字对角线上是缩放,其余为旋转或者错切的作用。变换矩阵关系如下:
其中A为变换后坐标矩阵,C为原始坐标矩阵,B是仿射变换矩阵,有6个未知量,假设目标图形以(x , y )为轴心顺时针旋转θ弧度到目标图像,则变换矩阵对应的变量为:
所以前两列的4个未知量a,b,d,e是起到旋转的作用,第三列的2个未知量c,f起到了平移的作用。仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面。
如果不考虑特征匹配,我们只考虑图像的固定点映射,那么大概有以下三个步骤:
1. 根据图像的变化特点,选择合适的变化结构。
2. 根据DLT等方法计算变换结构。
3. 采用正向/逆向映射,利用插值方式实现图像映射变换。
三、实际应用与分析 下面我们来看一下图像映射的效果图。图片取景于集美大学的中山纪念馆已经嘉庚湖,以及一张广告牌,一张表情包。
例子一:把表情包贴到建筑物上。
建筑物(中山纪念馆):
表情包:
映射效果图:
例子二:将集美大学嘉庚湖映射到广告牌上。
嘉庚湖:
广告牌:
映射效果图:
可以看出来,当映射的图片只有位移上的变化时,图片可以完美映射到理想的位置,可以如果要让图像发展旋转的话,就会出现上图的情况,右下角的部分并没有完全贴合,这是因为变换矩阵中存在着映射残差,使得变化矩阵并不能达到最理想的状态。
首先我们来看一下图像映射源代码:
main:
from scipy import ndimage from pylab import * from PIL import Image from numpy import * import warp im1 = array(Image.
堆叠柱状图和dataZoom 组件 用于区域缩放的实现的一个实例,参数颜色是自己自定义的,可根据需要添加颜色
/** * 获取上传率图表Option * * @param chart * @param json * json对象 * 格式例子:{"devices":[{"name":"已启用","data":[{"name":"UDP透传","value":48},{"name":"电信IoT","value":4}]}, * {"name":"已停用","data":[{"name":"UDP透传","value":10},{"name":"电信IoT","value":5}]}, * {"name":"其他","data":[{"name":"UDP透传","value":3853},{"name":"电信IoT","value":2}]}], * "series":[{"name":"已上传","data":[{"name":"UDP透传","value":1},{"name":"电信IoT","value":0}]}, * {"name":"未上传","data":[{"name":"UDP透传","value":3900},{"name":"电信IoT","value":6}]}], * "uprates":[{"name":"UDP透传","value":0.03},{"name":"电信IoT","value":0}]} * @param serColors * series颜色数组 * @param devColors * devices颜色数组 * @param rateColor * 上传率颜色 * @param chartTitle * 图表标题 */ function getUprateChartOption(json, serColors, devColors, rateColor, chartTitle) { var maxValue = 0; var series = []; var legend = []; var category = []; // 上传率 var uprate = { name : "
前言 DSP28335的例程如何下载,老笨相信还有很多人不知道,所以老笨想教大家如何下载TI官方例程源码,顺便下载寄存器手册(见《DSP28335入门教程:寄存器手册的下载》)。大家肯定都这么试过:直接搜索“DSP28335 官方例程”,残念铁丝,很遗憾,这是找不到官网的例程的下载地址的。
[2020/4/4更新]:鉴于下文所述的下载器很可能无法正常连接下载,老笨直接传了一份例程源码到网盘(有fft例程,在libs目录下),自行下载。链接: https://pan.baidu.com/s/1obNl9Z5n4P0weeSs-kbdAg 提取码: iss2。
正文 毫无疑问,先打开TI官网http://www.ti.com,没有账号的需要先注册一个,只需要用邮箱就可以注册,无任何压力。
搜索tms320f28335,搜索结果的右侧点击器件进入详细页面。
例程源码的下载 来到这个页面,点击 工具&软件 选项卡:
往下翻一点
点击框中,来到这里
第一个是离线安装包,有几个G,很大,里边包含了所有东西,我们并不需要,所以选第二个在线下载。
EXE?什么鬼?我要下例程,你让我下软件???
别急,他确实是个EXE,但它非常简单,就是一个下载器,只会建一个文件夹,然后例程下载到里面。不会带其它任何东西,不是那种所谓的毒瘤软件,所以不要有任何压力。TI是靠硬件赚钱的,不是靠AD赚钱,所以要把它和一些靠垃圾赚钱的互联网软件区分开来。
点击框中的下载,还有几个步骤,老笨直接做成动图了:
下载好后我们打开软件,需要联网。先来看看动图演示,中间有个地方老笨鼠标停了一会,等待它加载完成,并不是卡了,后面再稍加说明:
文字描述 1 双击打开,如果准备安装界面进度条不动或太慢,关掉再重新打开一遍就行。来到如下:
这里请稍等一下,等待Next变成可点击。
好,点击Next。
2 点击框中的地方。
3 这里等待加载完成,即等待框中变成如下:
4 我们只需要例程源码,所以先关掉所有的项:
Kits项选择:Entire feature will be unavailable。
逐个点击三角选择最后一项:Feature will be installed when required。
最后如下:
5 然后展开device support-f2833x,可以看到有5个版本,我们这里随便选一个,如V141。点击三角图标,选择菜单第一个:Will be installed on local hard drive。路径改不改看个人习惯,老笨一般不改,然后再看看大小对了没,以防下到其他不需要的东西,太大了就回头看看哪里没有取消。
点击Next。
6 第一遍进度走完之后,会弹出一个软件安装界面,点击确定即可,会再走一遍进度。
第二遍进度走完时,弹出如下提示,请一定要选择忽略,不会有影响,不然下好的文件它又给你删除了。
最后finish后,我们来看看,例程源码都已经下好了:
好了,DSP28335的官方例程源码下载就是这样了,教程看起来很长,其实操作起来也就一分钟左右。
[2020/4/4更新]:上文所述的下载器很可能无法正常连接下载,老笨直接传了一份例程源码到网盘(有fft例程,在libs目录下),自行下载。链接: https://pan.baidu.com/s/1obNl9Z5n4P0weeSs-kbdAg 提取码: iss2。
寄存器手册的下载 篇幅有点长了,老笨放到下一篇讲,见《DSP28335入门教程:寄存器手册的下载》。
END
正交试验概念:正交试验法研究多因素和多水平的一种实验法,设计正交表来进行试验;
正交表概念:正交表是一种特制的表格,用表示,L代表是正交表,n代表试验次数或正交表的行数,k代表最多可安排影响指标因素的个数或正交表的列数,m表示每个因素水平数,且有n=k*(m-1)+1;
因子概念:在同一试验中,影响试验结果的输入条件称为因子;
水平概念:影响每个试验因子的取值或输入称为水平;
例如:
输入条件:姓名、电话和地址;
输入结果:查询结果;
输入条件即是因子:姓名、电话和地址都是因子;
影响每个试验因子的取值称为水平:
姓名:输入(1)和不输入(0)称为水平;
电话:输入(1)和不输入(0)称为水平;
地址:输入(1)和不输入(0)称为水平;
正交表如下图所示:
上面的用例称为3因子2水平;n=k*(m-1)+1=3*(2-1)+1=4种测试用例;
3因子2水平正交表如图下图所示:
4因子3水平正交表如下图所示:
正交试验使用前提:整齐可比,均匀分散;(每个因子的水平一样多);
正交试验使用场景:解决多个输入条件和多个输出结果的情况;
优点:正交试验从全面试验中选出有代表性的点进行试验,减少了测试用例,合理地减少了测试的时间,提高测试效率,是一种高效率,快速,经济的测试方法;
缺点:每个状态点同等对待,重点不突出,容易造成在不常用的功能或场景中,话费不少时间进行测试,而侧重点被忽略。
注:
正交表查找方法:
http://support.sas.com/techsup/technote/ts723_Designs.txt
ESXI :安装包 http://pan.baidu.com/s/1c2gM0Xq (包含注册机和其他套件,驱动打包工具)
ESXI 6.5 在服务器安装比较方便,一般intel 的网卡都没多大问题,选择安装包里的 VMware-VMvisor-Installer-6.5.0-4564106.x86_64.iso ,写入U盘引导,就可以安装。
安装完使用注册机注册 vSphere56-keygen.rar
其他套件可选择安装。
普通PC安装遇到各种问题一般是网卡驱动有问题,需要给安装包的 ISO 加入驱动,要用到ESXI 的一个打包驱动的软件 叫 ESXi-Customizer-v2.7.1 (网盘有),然后请查看你的PC 网卡型号,可以到这里下载驱动
https://vibsdepot.v-front.de/wiki/index.php/List_of_currently_available_ESXi_packages (注意对应的ESXI 版本号)
ESXi-Customizer-v2.7.1 使用很简单,选择要打包进去的ISO,选择驱动文件就可以生成新的 ISO 了。
下一篇讲教大家如何在 EXSI6.5 安装 群晖DSM6.0 系统
def getValueFromStr(str1): """给定字符串,字符串表示一个公式,可能有整数、加减乘除符号和左右括号,返回公式计算结果""" return valueProcess(str1, 0)[0] # 返回两个值:计算结果,计算到的位置 def valueProcess(str1, index): pre = 0 que = [] while index < len(str1) and str1[index] != ')': if '0' <= str1[index] <= '9': pre = pre * 10 + int(str1[index]) index += 1 elif str1[index] != "(": # str1[index] 此时是 +-*/ addNum(que, pre) que.append(str1[index]) index += 1 pre = 0 else: # str1[index] 此时为 '(' bra = valueProcess(str1, index + 1) pre = bra[0] index = bra[1] + 1 addNum(que, pre) return getResult(que), index def addNum(que, num): if que !
class AbstractBinarySearchTree(object): def __init__(self, pHead): self.root = pHead self.size = 0 def createNode(self, value, parent, left, right): self.newNode = withParentNode(value) self.newNode.parent = parent self.newNode.left = left self.newNode.right = right return self.newNode def search(self, element): node = self.root while node is not None and node.value is not None and node.value != element: if element < node.value: node = node.left else: node = node.right return node def insert(self, element): if self.root is None: self.
def hanoiProcess(n, fromStr, toStr, helpStr): if n == 1: print("Move 1 from " + fromStr + ' to ' + toStr) else: hanoiProcess(n - 1, fromStr, helpStr, toStr) print("Move " + str(n) + ' from ' + fromStr + ' to ' + toStr) hanoiProcess(n - 1, helpStr, toStr, fromStr) def printAllSub(str1, index, resultStr): """打印字符串所有的子序列""" if index == len(str1): print(resultStr) return printAllSub(str1, index + 1, resultStr) printAllSub(str1, index + 1, resultStr + str1[index]) def minPath1(matrix): return minPath1Process(matrix, 0, 0) def minPath1Process(matrix, i, j): res = matrix[i][j] if i == len(matrix) - 1 and j == len(matrix[0]) - 1: return matrix[i][j] if i == len(matrix) - 1 and j !
class getCommonNode(object): """返回两个单链表的第一个相交点""" def FindFirstCommonNode(self, pHead1, pHead2): loop1 = self.getLoopNode(pHead1) loop2 = self.getLoopNode(pHead2) if loop1 is None and loop2 is None: return self.noLoop(pHead1, pHead2) if loop1 is not None and loop2 is not None: return self.bothLoop(pHead1, pHead2, loop1, loop2) return None def getLoopNode(self, pHead): if pHead is None or pHead.next is None or pHead.next.next is None: return pHead slow = pHead.next fast = pHead.next.next while slow != fast: if fast.
定义了三个文件,在运行时发生了错误
错误
后来,经过以下修改,在run->edit Configuration中
但是从新运行会有一个以下错误
点击 Continue Anyway程序可以正常运行,这里可能是package的路径填写不正确,目前不知道怎么填写
默认命令行形式启动 sudo systemctl set-default multi-user.target reboot 临时使用一次图形界面进入 sudo systemctl start lightdm 默认图形界面启动 systemctl set-default graphical.target reboot
错误: java.sql.SQLException: Unknown type '246 in column 2 of 7 in binary-encoded result set.
出错原因:mysql中某字段类型为decimal类型
解决方式:
法1:更换字段类型,但若需表示金额这些数字时此类型是首选,不想更换类型,则用方法2
法2:更换jar包,可以把mysql连接jar包更换为mysql-connector-java-5.0.8-bin.jar
https://blog.csdn.net/bzfys/article/details/55252962
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
主要功能 服务限流降级:默认支持 Servlet、Feign、RestTemplate、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。 项目地址:https://github.com/spring-cloud-incubator/spring-cloud-alibaba
转载于:https://www.cnblogs.com/yangzhilong/p/10578597.html
vue3中引入jquery 由于我用vue创建项目之后并没有出现build文件夹,应该是vue3之后简化了,看了网上的一些教程都是要修改build文件下面的webpack文件,但是我没有找到
就想到一个方法,个人拙见,在main.js的文件中插入
import $ from 'jquery' Vue.prototype.JQ = $ 然后在需要用到的地方使用this.JQ来调用
mounted: function () { this.JQ(document).ready(function () { console.log('11') }) } 以上方式是我一时之间想到的,好的方式如下
在vue.config.js文件中写入
const webpack = require('webpack') module.exports = { chainWebpack: config => { config.plugin('provide').use(webpack.ProvidePlugin, [{ $: 'jquery', jquery: 'jquery', jQuery: 'jquery', 'window.jQuery': 'jquery' }]) } } 然后就可以在任何地方应用$这个啦
测试test是否在ARR数组中 if echo "${ARR[@]}" | grep -w "test" &>/dev/null; then echo "Found" fi 打印出 bf_db_list中不包含default_table中的内容
bf_db_list=($(mysql --defaults-extra-file=./mysql-bf.cfg -e "show databases")) default_table=(Database information_schema mysql performance_schema) for a in ${bf_db_list[@]} do echo "${default_table[@]}" | grep -w "$a" &>/dev/null || echo $a done
根据不同的目的,Kamailio提供了不同的模块完成各种消息分发策略。比如LCR模块,dispatcher模块。本文描述怎样利用dispatcher模块实现SIP消息的负载均分。
假设kamailio安装在/usr/local/kamailio/目录下。
添加dispatcher.list 在/usr/local/kamailio/etc/kamailio下添加dispatcher.list文件并编辑它,内容:
# line format # setid(int) destination(sip uri) flags(int,opt) priority(int,opt) attributes(str,opt) 1 sip:192.168.1.8:5060 1 sip:192.168.1.9:5060 说明:dispatcher支持从数据库里配置,也支持从配置文件里配置,这里选择配置文件。
配置里面的setid很重要,后面的配置脚本里会用到,每个ID表示一组,可以配置多个不同的分发组。
这里假设需要分发给两个处理节点,IP分别中192.168.1.8和192.168.1.9
dispatcher.list文件的位置可以放在你自己习惯的位置。
配置kamailio.cfg 编辑kamailio.cfg文件:
在模块加载区域里添加一行:
loadmodule "dispatcher.so" 在模块参数区域(# ----------------- setting module-specific parameters ---------------)里添加dispatcher模块的配置:
# ----- dispatcher params -----
modparam("dispatcher", "list_file", "/usr/local/kamailio/etc/kamailio/dispatcher.list") modparam("dispatcher", "force_dst", 1) 在request_route段的route(LOCATION);前添加以下内容 # dispatch destinations route(DISPATCH); 在kamailio.cfg的文件末尾添加路由定义:
# Dispatch requests route[DISPATCH] { # round robin dispatching on gateways group '1' if(!ds_select_dst("1", "4")) { send_reply("404", "No destination"); exit; } xdbg("
问题描述:
自己制作的图像分割label.png,二进制编码打开png图像源文件后,标签全部变为0
原因:
制作标签时,注意图像的存储模式,是RGB还是灰度模式(L)
from PIL import Image import tensorflow as tf import numpy as np #img_path='F:\\VOC2012\\SegmentationClassAug\\2007_000032.png' img_path='00.png' #原label.png img=Image.open(img_path) img_array=np.asarray(img) print('1') print(np.sum(np.int32(img_array==1))) #二进制打开png图片,再解码 with tf.gfile.GFile(img_path, 'rb') as fid: encoded_jpg0 = fid.read() with tf.Session() as s: label0 = tf.image.decode_image(encoded_jpg0,1) #label0=tf.decode_raw(encoded_jpg0,out_type=tf.uint8) print('2') print(np.sum(np.int32(s.run(label0)==1))) #原label.png img=Image.open(img_path).convert('L') img.save('01.png') img_path1='01.png' #二进制打开png图片,再解码 with tf.gfile.GFile(img_path1, 'rb') as fid: encoded_jpg0 = fid.read() with tf.Session() as s: label0 = tf.image.decode_image(encoded_jpg0,1) print('3') print(np.sum(np.int32(s.run(label0)==1))) 1 866 2 0 3 866
oh-my-zsh 如果你使用Linux操作系统,那就免不了要和终端打交道,而shell是与系统交互的外壳,也是Linux的精髓,通常系统默认安装的shell是bash.
(一)oh-my-zsh是什么 Oh My Zsh是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式。它基于zsh命令行,提供了主题配置,插件机制,已经内置的便捷操作。给我们一种全新的方式使用命令行。
Oh My Zsh这个名字听起来就很有意思,它是基于zsh命令行的一个扩展工具集,提供了丰富的扩展功能。
Oh My Zsh只是一个对zsh命令行环境的配置包装框架,但它不提供命令行窗口,更不是一个独立的APP。
(二)oh-my-zsh优点 1.兼容bash,原来使用bash的兄弟切换过来毫无压力。
2.默认显示项目当前路径与分支,可配置多种主题
3.强大的历史纪录功能,在用或者方向上键查找历史命令时,zsh支持限制查找。比如输入ls然后再按方向上键,则只会查找用过的ls命令。而此时使用则会仍然按之前的方式查找,忽略ls。
4.多个终端会话共享历史记录。经常有多个窗口,tab,tmux的多个session,panel。这些命令历史不能共享实在是很糟糕的回忆。但是有了zsh之后,这些确实成了回忆了,所有的命令历史都可以共享。
5.智能拼写纠正,输入gtep mactalk * -R,系统会提示:zsh: correct ‘gtep’ to ‘grep’ [nyae]?d
6.各种补全:路径补全、命令补全,命令参数补全,插件内容补全等等。触发补全只需要按一下或两下tab键,补全项可以使用ctrl+n/p/f/b上下左右切换。比如你想杀掉java的进程,只需要输入kill java + tab键,如果只有一个java进程,zsh 会自动替换为进程的 pid,如果有多个则会出现选择项供你选择。ssh+空格+两个tab键,zsh会列出所有访问过的主机和用户名进行补全
7.智能跳转,安装了autojump之后,zsh 会自动记录你访问过的目录,通过 j + 目录名 可以直接进行目录跳转,而且目录名支持模糊匹配和自动补全,例如你访问过hadoop-1.0.0目录,输入j hado 即可正确跳转。j –stat 可以看你的历史路径库。
8.目录浏览和跳转:输入 d,即可列出你在这个会话里访问的目录列表,输入列表前的序号,即可直接跳转。
9.在当前目录下输入 … 或 … ,或直接输入当前目录名都可以跳转,你甚至不再需要输入cd命令了。
10.通配符搜索:ls -l **/*.sh,可以递归显示当前目录下的 shell 文件,文件少时可以代替find,文件太多还是用find。
(三)安装oh-my-zsh 地址:https://ohmyz.sh/
查看系统当前使用的shell $ echo $SHELL /bin/bash 查看系统是否安装了zsh $ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh 安装 (1).
写在最前面的,个人学习参照该官方文档:http://airtest.netease.com/docs/docs_AirtestIDE-zh_CN/
官方文档其实已经讲的很详细了,本次只记录官方文档未涉及或者没有详细讲解的地方,以及个人采坑全过程。
1.这是一个写 UI 自动化的框架,语言使用python ,官方推荐我们使用3.X
2.初衷是为了自动化测试app 游戏的,目的是让我们测试的脚本,脱离手机性能,兼容性等束缚的一个自由框架(前景看好)
3.入门要求低,但要写出严谨和优雅的脚本还是需要经验和语言基础。持续打副本中。。。
4.网易提供了一个 编辑器airtest IDE
优点:内部自带了airtest 插件和Poco 插件,更有录制的功能,用过SeleniumIDE 的同学都知道,录完的脚本不堪直视啊。但是此录制非彼录制,谁用谁知道。
缺点:无法查看源码实现。或者当前个人还么有把该ide 用熟悉。另外不能自定义风格哈哈
不扯了,入正题:
1.个人使用的夜神模拟器,第一天远程连接:adb connect 127.0.0.1:62001 正常使用,但是第二天发现使用这个端口连接不上了,多连接了几次系统还崩溃了。(说到这里,这说的只是该ide 崩溃,在此之前使用的是木木模拟器,特么直接搞的我 新买的高配 拯救者 都宕机了。个人推荐夜神,可以模拟位置,比如签到打卡哈哈,某些办公软件自动绕过,请给普通员工一点活路)
解决办法:在进程中查看当前模拟器的pid
cmd 中查询:netstat -ano|findstr 14972
使用adb 命令测试连接:adb connect 127.0.0.1:52001,连接成功!
持续更新。。
文章目录 WindowsWindow 的生命周期分组和非分组Windows (Keyed vs Non-Keyed Windows)窗口分配器(Window Assingers)滚动窗口滑动窗口会话窗口(Session Windows)全局窗口(Global Windows)窗口函数(Window Functions)1、ReduceFunction2、AggregateFunction3、FoldFunction4、ProcessWindowFunction5、ProcessWindowFunction with Incremental Aggregation6、Incremental Window Aggregation with ReduceFunction7、Incremental Window Aggregation with AggregateFunction8、Incremental Window Aggregation with FoldFunction Using per-window state in ProcessWindowFunctionTriggers触发器Fire and Purge 触发和清除Default Triggers of WindowAssigners 窗口分配中的默认触发器内置的和自定义的触发器(Build-in and Custom Triggers)Evictors驱逐器允许延迟(Allowed Lateness)以侧输出来获取延迟数据(Getting Late Data as a Site Output)延迟元素考虑Late elements considerations使用窗口结果Working with window results水印和窗户的互动 Interaction of watermarks and windows连续窗口操作 Consecutive windowed operations使用状态大小的考虑(Useful state size considerations) 初学flink和第一次进行博客编写,决定从文档看起,以及附上从各位博主总结来的内容。主要作用是督促自己养成读文档,记录博客的习惯以及记录下自己在学习、实际生产过程中的心得,记录下来留给需要之时参考,如有错误还请批评指正。 原文: flink 1.7文档 本文多部分引用自 简书上一位大大:写Bug的张小天 Windows Window是无限数据流处理的核心,Window将一个无限的stream拆分成有限大小的桶(buckets),我们可以在这些桶上做计算操作。本文主要聚焦于在Flink中如何进行窗口操作,以及程序员如何从window提供的功能中获得最大的收益。
git log 查看 提交历史
默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。
常用的格式占位符写法及其代表的意义。
选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
-p 按补丁格式显示每个更新之间的差异。
--stat 显示每次更新的文件修改统计信息。
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph 显示 ASCII 图形表示的分支合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。
好,接着ADC to DMA 前篇我们继续,后篇主要是举例子加以理解这三个函数:
DMACH1BurstConfig(3,1,10); //burst传输 DMACH1TransferConfig(9,1,0); //transfer传输 DMACH1WrapConfig(1,0,0,1); //wrap传输 还是上一个程序:
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File #define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz #define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocks #define BUF_SIZE 40 // Sample buffer size // Global variable for this example Uint16 j=0; #pragma DATA_SECTION(DMABuf1,"DMARAML4"); volatile Uint16 DMABuf1[BUF_SIZE]; volatile Uint16 *pDMADest; volatile Uint16 *pDMASource; __interrupt void local_DINTCH1_ISR(void); void main(void) { Uint16 i; // step 1.
在C++中若要设置长度大于1000000的数组,不能在函数内部声明,因为这样属于局部变量,存放在了栈上,容易造成内存溢出。
解决这个问题有两种办法:
1.将数组声明为全局变量:
#include<iostream> using namespace std; int list[1000000]; //声明为全局变量 int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>list[i]; } /**** *****/ return 0; } 2.将数组存放在堆上:
#include<iostream> using namespace std; int main(){ int *list = new int[1000000]; //存放在堆上 int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; /*** ***/ return 0; }
1.将Instant Formatting 由Off设置为On
2.弹出的对话框,点击ignore all
参考: https://blog.csdn.net/coberup/article/details/82525988
前言 DSP28335的官方例程其实是比较不错的,基本上各个功能都涉及到。(有没有人第一反应就是:哦,官方例程去哪里下载啊,我去TI官网找了几天都找不到?老笨觉得很多人都还不知道,DSP28335官方例程的下载方法,见《DSP28335入门教程:官方例程的下载》)
主题 本文就说说Example_2833xAdcToDMA这个例程,有些地方它默认你都懂了,没有举更多的例子来帮助理解,恰恰是这些地方就可能让人百思不得解,就比如接下来要登场的这三个函数:
DMACH1BurstConfig(3,1,10); //burst传输 DMACH1TransferConfig(9,1,0); //transfer传输 DMACH1WrapConfig(1,0,0,1); //wrap传输 正文 涉及到硬件电路的连接,老笨习惯先上原理图:
好,按照常规操作,接下来再看程序,先看全局再看细节,先上完整的程序:
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File #define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz #define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocks #define BUF_SIZE 40 // Sample buffer size // Global variable for this example Uint16 j=0; #pragma DATA_SECTION(DMABuf1,"DMARAML4"); volatile Uint16 DMABuf1[BUF_SIZE]; volatile Uint16 *pDMADest; volatile Uint16 *pDMASource; __interrupt void local_DINTCH1_ISR(void); void main(void) { Uint16 i; // step 1.
func ( x DDDD) FOO(var type) ( ret type , err Errot)
也就是说 x DDDD是什么意思.
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ... } 这意味着ServeHTTP不是一个独立的功能。函数名称前面的括号是Go定义这些函数将在其上运行的对象的方式。所以,本质上ServeHTTP是一个类型处理程序的方法,可以使用类型处理程序的任何对象来调用,比如h。
他们也被称为接收者。这里是定义他们的方法有两种。如果你想修改接收器,使用如下的指针:
func (s *MyStruct) pointerMethod() { } // method on pointer 如果你不需要修改接收器,则可以将接收器定义为如下值:
func (s MyStruct) valueMethod() { } // method on value Go的这个例子展示了这个概念。
package main import "fmt" type Mutatable struct { a int b int } func (m Mutatable) StayTheSame() { m.a = 5 m.
做性能测试,先是根据策略编写脚本,然后才是执行脚本,现在我已经编写好了脚本,一个最简单的脚本
然后保存,运行,在察看结果树里,可以看到正确的响应结果
现在,启一个线程让这个脚本一直循环运行,查看运行情况,因为是循环运行,HTTP请求,会执行很多次,而这些结果都在察看结果树里显示出来,就不是很好,所以在察看结果里里勾上,只显示错误的请求信息
然后线程组配置成永远循环,调度器设置成60秒,我这里只是演示,就不去跑10分钟了
配置好保存,清除之前的结果,之后就开始运行
右上角,小框框里面显示的是脚本的运行时间,小三角形前面的数字,代表jmeter运行过程中的异常数,这个异常数和脚本里的错误是两码事。比如连接不上服务器,这里就会有异常。小圈圈前的0/1代表当前正在运行的线程数和脚本运行中的最大线程数,因为现在脚本已经停止运行了,所以没有线程在运行,所以前面就是0。而且我的脚本运行时,只启了一个线程,所以最大线程数就是1。在察看结果树里,没有结果输出,代表没有错误的请求,重点看聚合报告
Label:是请求的名称
#Samples:在脚本运行过程中,一共发了多少个请求
Average:平均响应时间,服务器处理一个请求需要多少时间的平均值,单位:毫秒
Median:响应时间的中间值,就是所有请求的响应时间从小到大排个序,正中间的那个值是多少
90%Line:响应时间从小到大排序,在第90%位置处的值是多少,比如一共发了10000个请求,那么就是第9000个的值
95%Line、99%Line同上
Min:最小响应时间,就是所有请求中响应时间最短的那一个
Max:最大响应时间,就是所有请求中响应时间最长的那一个
Error %:错误率,错误请求占所有请求的比率是多少
Throughput:这个就是常说的TPS了,也就是中文常说的吞吐量。代表的是服务处理请求的能力,服务器在1秒之内能处理多少个请求。
最后面两个就是每秒接收数据量和发送数据量,不过这两个值,有些情况下会没有
因为跑的时间比较短,再跑长点时间,TPS可以到1000。因为我这个框架,业务比较简单,而且数据库里的数据也非常少,所以响应非常快。通过响应时间,我们可以推算出服务器一个线程,在1秒内可以处理多少个请求。比如这里是1毫秒,那么服务器一个线程,1秒是可以处理1000个请求的。不过呢,这个1毫秒是向下取整得来的,显示是1毫秒,而实际上可能是1.2或是1.3毫秒。再通过TPS,就可以推出服务器大致启了多少个线程在处理请求。比如平均响应时间是20毫秒,那么服务器一个线程一秒可以处理50个请求,如果TPS是400,那么就可以推出服务器大概是启了8个线程在处理请求。当然,这个并不是绝对的,尤其是在服务器没有达到极限的时候。接下来,再看服务器的资源使用情况
可以看到,在刚开始发请求的时候,服务器的CPU使用率非常地高,最高的时候达到了75%,因为这个时候,服务器要创建很多线程,线程又要处理业务,所以CPU的使用率就变得很高了。然后,到了后期,线程都创建好了,那么就只有处理业务的消耗,所以CPU的使用率就慢慢的降下来了,并趋于平稳。内存就没有什么可看的了,跑得时间短,如果跑的时间比较长,比如10分钟,而在跑的过程中,一直在增高,那么就要考虑有内存泄露的问题了。而磁盘I/O,因为没有打日志,所以就完全没有了。
1个线程的跑完了,服务器的性能就有了一个基准值。那么就要再加线程跑,现在加到2个线程跑。
清除之前的结果,运行
可以看到2个线程的时候,TPS是1677,相较于1个线程的TPS,没有达到2倍,存在着衰减,当然跑的时间太短,对比的数据,参考性不是很准确。然后,再启3个线程跑:
2个线程TPS是1677,3个线程是1729,只增加了一点点。那么就可以得出结论,服务器的TPS极限就是1700多一点。后面,再增加线程来压,TPS也增长不动,甚至还会出现下降的情况。
现在只是测试了一种情况,还有带参数的情况,只是脚本改一下,测试的过程是差不多的。再然后就是做参数化,让脚本在运行的过程中,不停地改变参数,来查看服务器的的性能,新建一个记事本,内容如下
然后,在脚本里引入这个文件,读取里面的内容做参数
然后线程组,设置启一个线程,循环4次,察看结果树的只显示错误,不勾选,运行一下,看结果
可以看到,4次,每次运行的结果都不一样,然后就是让脚本一直循环,持续运行一段时间,看性能数据
这是启2个线程跑的,可以看到,比之前全是一样的请求时,性能下降了
欢迎加入测试群:91425817,一起讨论测试的那此事。
老笨来讲讲dsp28335的ADC的最基本用法。
先来看看硬件电路连接图:
程序 #include "DSP28x_Project.h" #define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz #define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocks #define BUFF_SIZE 4 Uint16 SampleTable[BUFF_SIZE]; main() { Uint16 i; InitSysCtrl(); EALLOW; //允许编辑受保护的寄存器 SysCtrlRegs.HISPCP.all = 0x3; //HSPCLK = SYSCLKOUT/6 = 25.0 MHz EDIS; //禁止编辑 DINT; //关中断 InitPieCtrl(); //复位PIE控制寄存器为0 IER = 0x0000; //清除所有CPU中断标识 IFR = 0x0000; InitPieVectTable(); //初始化中断向量表 InitAdc(); //开启ADC时钟,校准,ADC电路上电 AdcRegs.
整理……
//1> 0.00 或者#.00 格式:小数点后两位,不足用0补足。 // 补充:当格式化定义为#.00,对数字0格式化时结果为:.00,此时应使用0.00格式化 DecimalFormat df1 = new DecimalFormat("#.00"); System.out.println(df1.format(2.2));// 2.20 System.out.println(df1.format(2.246));// 2.25 //2> #.## 格式:小数点后两位,多余的0不显示 DecimalFormat df2 = new DecimalFormat("#.##"); System.out.println(df2.format(2.2));// 2.2 System.out.println(df2.format(2.246));// 2.25 System.out.println(df2.format(2.244));// 2.24 //3> 使用BigDecimal自有API BigDecimal decimal = new BigDecimal(2.2); System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.20 decimal = new BigDecimal(2.456); System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.46 此处的setScale: 参数1:代表小数点后位数 参数2: BigDecimal.ROUND_HALF_UP 四舍五入 BigDecimal.ROUND_DOWN 直接删除多余小数位 参考:https://www.cnblogs.com/jpfss/p/8072379.html
警告:
下面的操作涉及更改操作系统的重要组成部分。必要时,请咨询计算机系统专业人士。
重命名 ESRI 文件夹即对 ArcGIS 恢复出厂设置,因此必须重新安装当前安装的所有第三方工具、自定义脚本和自定义工具栏。 此外,必须重新连接所有现有的文件夹连接。
操作:
1、重命名ESRI文件夹,以恢复ArcGis初始设置
关闭任何活动的 ArcMap 和 ArcGIS 应用程序。
打开 Windows 资源管理器。导航至路径:C:\Users\Administrator\AppData\Roaming
win7-win10为该路径,Administrator为当前系统用户名。默认情况下,应用程序数据( AppData)文件夹是隐藏的。 如果无法定位文件夹,通过“文件夹选项”启用“显示隐藏的文件和文件夹”。
2、在“注册表编辑器”窗口中重命名 ESRI 文件夹
单击开始 > 运行,然后输入 regedit。
在“注册表编辑器”窗口中,展开 HKEY_CURRENT_USER 文件夹。
展开“Software”文件夹。
将 ESRI 文件夹重命名为“ESRI_OLD”。
3、启动ArcMap,将自动完成初始化设置(自动生成ESRI文件夹与注册表项)。
更多阅读:CGCS2000 国土三调 HEC-RAS 注册测绘师
一、延时对主观质量的影响(T-REC-G.114) 图中横轴坐标是毫秒,代表时延。纵轴坐标是用户的体验度。由上图,时延达到150毫秒的时候,用户体验度开始下降,当达到400毫秒的时候,用户的感受是无法容忍。
由此,ITU-T G.114国际标准规定,延时超过150毫秒表示已经开始影响用户体验,用户可以容忍的最高延时是400毫秒。
二、测试组网模型 三、视频处理流水 视频端到端时延,分三大块:发送端产生时延、网络产生时延、接收端产生时延。
四、视频发送端产生延时 1)摄像头产生延时 摄像头视频采集时会遇到成像延迟,主要由如下几方面组成:
1、CMOS/AD转换相关硬件产生延时。
2、视频增强处理,产生延时:比方说白平衡、防闪烁等。
3、视频数据传输产生的延时:例如下面这个云台视频输出格式有YUV、MJPE。
使用YUV传输的优点是不需要编解码,但是数据量大,这里1080P数据只能传输8fps。
使用MJPG传输的优点是数据量小,但是摄像头采集需要经过编码,应用程序使用的时候,需要解码。这里也会产生延时。
成像延时可以根据产品说明书提供的最大帧率计算,市面上较好的摄像头一秒可达50帧,成像延时约为20ms,如果是一秒20~25帧的摄像头,会产生40~50ms的延时;
需要注意当摄像头开启AE功能后,视频采集帧率会随着光强动态调整,实际使用时可能不能达到最大帧率值。
2)视频编码产生延时 与解码器性能、系统配置有关。需要实际仿真测试出具体值。
3)pacer产生延时 视频报文不同于音频报文,一个视频帧有可能分别封装在几个RTP报文,若这个视频帧的RTP报文一起发送到网络上,必然会导致网络瞬间拥塞。以25fps为例,若这帧视频的RTP报文,能够在40ms之内发送给接收端,接收端既可以正常工作,也缓冲了网络拥塞的压力。PACER就是实现把RTP同一时刻生产的若干包,周期性的发送,防止上行流量激增导致拥塞。
pacer延时取决于一帧视频实际的大小和帧率。正常来说,pacer的延时是1000/fps的大小。
五、网络产生延时 根据实际网络情况确定。可以通过webrtc提供的rtt参数计算。
六、视频接收端产生延时 1)JitterBuffer产生延时 JitterBuffer实现原理是,在收到网络上的RTP报文后,不直接进行解码,需要缓存一定个数的RTP报文,按照时间戳或者seq的顺序进行重排,消除报文的乱序和抖动问题。JitterBuffer分动态JitterBuffer和静态JitterBuffer两种模式:
1、静态JitterBuffer缓存报文个数固定。
2、动态JitterBuffer是根据网络环路延时的情况,动态调整缓存报文个数。
JitterBuffer产生的延时与JitterBuffer的深度有关。目前webrtc采用的是动态JB的思想。解码器解码结束后,找frame_buffer要帧,若当前帧完整无缺,直接送给解码器。若当前帧不全,需要等一个kMaxWaitForFrameMs固定时长,超过这个固定时长,直接跳下一帧。
所以JB产生的延时在0到kMaxWaitForFrameMs固定时长之间。
2)视频解码产生延时 与解码器性能、系统配置有关。需要实际仿真测试出具体值。
3)视频渲染产生延时 与显卡性能有关,需要实际仿真测试出具体值。
在windows10操作系统,使用potplay播放器采集摄像头视频,直接opengl渲染回放,测试出(视频采集+视频渲染)=80ms
视频采集大概1000ms/30fps=30+ms。所以视频渲染大概是80ms-30ms=40ms-50ms左右。
七、端到端视频延时小结 视频端到端延时=摄像头采集延时+视频编码延时+pacer延时+网络延时+JB延时+视频解码延时+视频渲染延时+接收发送端系统调用延时。
在intel i7-7700 cpu@3.60GHZ 16G内存 windows10操作系统,以25fps摄像头、openh264 480p分辨率,网络0延时,视频端到端固有延时:
摄像头采集延时40ms
+视频编码延时7ms
+pacer延时40ms
+网络延时0ms
+JB延时0ms
+视频解码延时3ms
+视频渲染延时40ms
+接收端系统调用延时15ms
+发送端系统调用延时15ms
=160ms。
1 如何配置hive
使用which hive查找到hive安装路径,hive/conf/路径下的hive-site.xml文件。
以下4项分别配置使用jdbc链接hive底层元数据库的链接字符串、驱动类名、登录元数据库的用户名、登录元数据库的密码
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.76.100:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123</value>
<description>password to use against metastore database</description>
</property>
</configuration>
2 如何要使用java连接hive,需要启动hive的hiveserver2服务。并且进行相关配置,具体如下:
首先在hive-site.xml中找到
<property>
<name>hive.server2.authentication</name>
<value>NONE</value>
</property>
其中value的值默认是NONE,即不需要认证,如果在连接时需要提供认证信息,则需要进行如下配置
首先将value值改为CUSTOM
<property>
<name>hive.server2.authentication</name>
<value>CUSTOM</value>
</property>
配置自定义验证类
<property>
<name>hive.server2.custom.authentication.class</name>
<value>自定义类名如:org.apache.hadoop.hive.contrib.auth.CustomPasswdAuthenticator</value>
<description>
Custom authentication class.
tooltip: { trigger: 'axis', axisPointer: { type: 'cross' }, formatter:function(params){ console.log(params,'paramsparams'); // 这个params能不能有一个index 区分开当前鼠标在第几个? let colstyle = colorArr[params[0].dataIndex]=== 0?'#FFFFFF':'#E83636'; if(params[0].data == null){ params[0].value = '数据为空'; } //:style="{color:colorArr[params[0].dataIndex]=== 0?'#FFFFFF':'#E83636'}" if(params[0]&¶ms[1]){ return '<div style="width: 300px;white-space: pre-wrap;">'+params[0].marker+params[0].seriesName+' : '+params[0].value +'<br/>'+params[1].marker+params[1].seriesName+' : '+params[1].value +'<hr style="border:1px dashed; height:1px" color="#6E6E6E"/>' +'<span style="color: #1890FF;width: 50%;">【风险事件】</span>' +'<span style="color: #1890FF;width: 50%;float: right">【数灵提示】</span>' + `<div style="width: 50%;float: left;color: ${colstyle};">${eventArr[params[0].dataIndex]}</div>` + `<div style="width: 50%;float: right;">${tipsArr[params[0].dataIndex]}</div>` +'</div>'; // "{backgroundColor : item.is_badcase === '0'?
在使用minimize()函数最优化时,有时候会遇到输出的解和设定的初始值一样,即似乎该函数失效了,并没有求出最优的解。对于这种情况,很可能是因为误差容忍度的设置问题。对于最优化,其利用的数值算法是有停止条件的,不可能一直运算下去,其中误差容忍度就是这个停止条件,即当两次值的差值小于这个容忍度的时候,其就会停止运算,返回结果了。因此,对于这种情况,有可能是目标函数值太小,甚至已经小于了容忍度,这样刚开始运算就停止了,就会让人误以为是函数失效了。对此解决办法有两个,一是重新设置容忍度,即minimize()的tol参数,把其设的小一点,比如你的目标函数值再1e-5左右,则你可以设为1e-8或1e-10之类的,其默认值似乎是1e-5还是1e-6;第二个办法是加大你的目标函数值的尺度,比如乘以1e5或1e6之类的。总之只要保证你的目标函数值和tol相差一定的数量级即可,具体的数量级取决于你对误差的要求,一般5个左右的数量级就可以了。
当我本地的HTTPS服务器使用了一个自己生成的证书时,用curl访问这个服务器,遇到如下错误信息:
SSL certificate problem: self signed certificateMore details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could notestablish a secure connection to it. To learn more about this situation andhow to fix it, please visit the web page mentioned above
这个网站提供了解决方案。最简单的一种:
使用–insecure忽略:
问题描述: 移动端ios键盘弹起时页面会把页面顶上去,输入完成后点击软键盘的完成, 弹框下来了,但是页面没有下来,必须得滑动一下页面。 解决方法: document.body.addEventListener('focusout', function () { window.scrollTo(0,0); }); 转载于:https://www.cnblogs.com/zhouqiaoyun/p/10515607.html
SRGAN的网络结构如图所示:
github pytorch实现源码:https://github.com/ai-tor/PyTorch-SRGAN
上周末将SRGAN论文阅读了一遍,细节很多,结合源码今天做个总结
本文在生成器中使用了SRResnet的残差块架构,每个残差块中包含两个3*3卷积层,Conv后跟BN层,采用PRelu作为激活函数,然后使用两个Pixelshuffler层来放大特征尺寸,最后使用一个3×3卷积层得到输出3通道图像。
在辨别器后用了8个卷积层,每个Conv后跟BN层,采用LeakyRelu作为激活函数,论文里最后用两个全连接层和最终的sigmoid激活函数得到预测为自然图像的概率,代码中使用的激活函数为Sigmoid函数,并在最后使用FCN代替了原始论文中的FC层。
LeakyReLU和PReLU的区别:https://blog.csdn.net/qq_23304241/article/details/80300149
PS:SRGAN的纹理更多,可能更适合处理纹理多的图片。
生成器的Loss计算公式为:
在生成器中的content loss有两种Loss的选择,一种是平常使用的MSE损失,采用这种损失最后生成的图像PSNR值高但细节并不好
一种是VGG19的Loss,采用这种损失最后生成的图像细节较好但数据指标较低。
训练网络的过程为:
1.使用MSEloss预训练一个生成器
2.正式开始训练SRGAN,将各级loss清零,初始化label,并分别为真假label赋值
3.第一遍G生成图和真图一起输入D,然后在D中进行判别,训练D
4.再次训练G,循环往复
今天周一,这周准备刷完高翔的视觉SLAM课程前六章,并完成相对应的作业,任务艰巨,争取完成。在学完每章过后都会把今天学习的心得记下来方便日后进行回顾,第一讲的资料我放在文章的最后,方便大家下载。
第一讲 视觉SLAM:从理论到实践:
首先:SLAM是什么?
simultaneous localization and mapping 同时定位与地图构建
它主要解决两个问题:
1.我在什么地方? 就是定位
2.我周围的环境是什么样子的? 建图
这里我们就需要相机来获取信息,相机就是通过一定速率采集图像,形成视频,使用相机就可以通过二维像素点的形式来表示三维世界的信息。但是在这中间缺少了一个维度也就是最重要的维度-深度。
常用的相机主要是单目相机,双目相机,RGB-D相机;
他们之间的区别:
单目相机:把三维空间通过二维面来表示,这种情况下缺少了深度信息,深度信息必须要通过其他方式去获取,现在最好的方式就是通过运动来获取三维信息。
双目相机:是通过视差来计算深度信息,两个相机对同一物体的拍摄通过不同的角度获取不同的图像,经过相机的标定和算法可以计算出场景中物体的实际大小和距离。
RGB-D相机是通过红外结构光或者TOF原理来获取物体的深度信息,这种获取的方式比较直接,但是这种方式不能够在室外使用。
当然还有别的一些相机例如全景相机,但是实际上现在还处于研究阶段,并没有被大家所使用。
视觉SLAM框架
一个完整的slam框架主要包括:
前端: visual odometry
后端: optimization
回环:loop closing
建图:Mapping
针对SLAM的数学描述:
我们用运动方程和观测方程来描述SLAM的整个过程,这个过程中,我们已知Uk(我们给小车的运动信号),Z(k,j)也是知道的,这是我们使用传感器测到的数据,我们需要去求的xk和yi,分别对应着定位和环境 这个问题叫做状态估计问题,也是我们后面需要去解决的核心问题。
第一讲的资料链接:https://pan.baidu.com/s/17lhsDEk2tjp-q7pElniGPQ
提取码:4lqd
调试时装charles证书,报错不插SIM卡,不能安装未知来源应用
解决方法:
打开开发者选项,滑动到最底层有“启用miui优化”,然后把它关闭就可以了。
开发过程中,经常会建立私有分支,但master主线只有一条,通过rebase把自己的私有分支rebase到最新master branch.
git fetch origin git rebase origin/master
详情请参考:HTTP长连接、短连接究竟是什么? - dai.sp - 博客园
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。
2. 如何理解HTTP协议是无状态的 HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
3. 什么是长连接、短连接? 在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
echarts自带的dataZoom设置后触发的鼠标滚轮滚动事件会放大缩小echarts图表本身,而不是我们想要的图表滚动效果。
并且要实现自定义滚动条还是需要自己设置的滚动条用得舒服。通过dataZoom配置项设置很是麻烦。
于是想出了通过内嵌高度溢出的图表,外层使用高度固定的div来设置滚动条。
<el-scrollbar style="height:235px;"> <div id="barchart"></div> </el-scrollbar> 在图表外面加上一层element-ui的滚动条。
#barchart{ width: 1280px; height: 940px; } 图表高度与宽度设置。
由于图表是根据div宽高自适应生成的,所以滚动条出现时看不到图表的X轴。业务需求又要求既要能滚动又要能看到X轴。
于是就想到在图表上手动加上一个自定义X轴,但X轴的数值是根据配置项的数据自动计算来的,又搜不到Echarts的内置X轴数值生成算法。而且也不会动态变化。
所以就想顺水推舟用Echarts来解决Echarts。此时的想法是再生成一个配置项数据一样的图表,但是只显示X轴,将其固定。
这样就解决了所有问题。
又想通过设置barWidth为0来隐藏生成的柱状图。但是发现不行。
灵机一动设置颜色为rgba(x,x,x,0) 即颜色透明。就看不到拉。完美隐藏掉所有不想要的图表组件。
这时候只需要将X轴固定在希望的位置即可。
.el-scrollbar{ position: absolute; top: 72px; left: 24px; z-index: 999 } 给外层加上绝对定位,并且提高层级。
提高层级才能在鼠标移上图表时展示相关信息。不然会被隐藏图表覆盖而没有交互效果
效果如上图
版权声明:本文为博主原创文章,无需授权即可转载,甚至无需保留以上版权声明,转载时请务必注明作者。
https
解决——》Handler dispatch failed; nested exception is java.lang.NoSuchMethodError 1、操作2、现象(错误信息)3、原因(可能有多种原因,但下面是我这次导致错误的原因)4、解决 1、操作 项目重新打包后,程序就找不到对应的方法
2、现象(错误信息) Handler dispatch failed; nested exception is java.lang.NoSuchMethodError 3、原因(可能有多种原因,但下面是我这次导致错误的原因) 有2个不同版本的jar同时存在
注:项目的打包都是maven的package,结果发现这种方式不会把同名的另外版本的jar给clean掉,所以之后要先clean再package
4、解决 删除掉老版本的jar
上网找了半天解决方法,都说下载后的APP移动到文件管理-本地-内部储存-Download-browser-安装包,之后再去应用市场-管理-安装包管理 去安装
结果试了半天都不行。。。。。。最后
换了谷歌浏览器重新输入网址进行下载就可以安装了,亲测华为浏览器和qq浏览器都安装不了,下载完成的授权信任请查看另一篇相关的文章,还是苹果好没这么多问题,安卓每次装个插件真费劲
1. 阻抗匹配
具有电阻、电感和电容的电路里,对交流电所起的阻碍作用叫做阻抗。阻抗常用Z表示,阻抗的单位是欧。对于一个具体电路,阻抗不是不变的,而是随着频率变化而变化。类似于向墙上扔皮球,要把皮球传过去,但是墙是硬的,会弹回来,如果是扔到窗帘上就不会弹回来,阻抗的意义就是让发射,接收,传输过程中能量都是一致的衰减程度,不会有能力反射,向皮球一样,连续不断地向墙上扔皮球,如果有皮球弹回来,就会和正在扔过去的皮球撞上,这就类似于一个方波信号在取反的时候有毛刺震荡。
阻抗匹配则传输功率大,对于一个电源来讲,当它的内阻等于负载时,输出功率最大,此时阻抗匹配。阻抗匹配是指在能量传输时,要求输出阻抗,负载阻抗要和传输线的特征阻抗相等此时的传输不会产生反射,这表明所有能量都被负载吸收了。高速 PCB布线时,为了防止信号的反射,通常要求是线路的阻抗为单端50欧姆,差分100欧。
也就是P0 = Z0 =Z1=50欧。
阻抗匹配一般有2种方式,串电阻和并电阻。
经常会见到这种结构,输出串一个电阻,输入并一个电阻。因为输出时,经常内部很低,有很强驱动能力,假设是17欧,串个33欧,输出就是50欧,传输线是50欧,接收时,输入引脚通常是内阻很大的,那么并一个49欧,电阻会比2个都小,接近49欧,这样就实现了阻抗匹配。
那么什么时候都要考虑阻抗匹配?
实际上当电缆的长度对于信号的波长来说可以忽略不计时,就勿需阻抗匹配的。
考虑信号频率为1MHz,其波长在空气中为300m,在同轴电缆中约为200m。在通常使用的长度为1m左右的同轴电缆中,是在完全可忽略的范围之内。但千兆以太网1000M,在电路板上波长0.2m。和电路板走线走线已经是一个数量级了,需要考虑了。
2. 单端阻抗和差分阻抗
单端就是一根线,高电平1,电平0。差分线,2根线的电压差正代表1,负代表0,可知,差分线可以降低一半的电压达到同样的0-1幅度,但多了一根线。好处是有外界影响时同时影响2根线,抗干扰能力强。
3. 层叠结构
打开AD的层叠结构可以看到阻抗计算。
单端阻抗和三个因素相关,一个是铜皮厚度,一般是35um,电路板材介电常数,常用的板子是FR4,4.5左右,层厚,一般10mil-20mil,0.127mm的整数倍。用一个polar Si9000的软件来算,50欧单端要多宽的线。
输入参数。
差分同理。
先选中差分。再输入参数。
由此可见,差分需要控制线宽和中心距。实际用的时候,问清楚厂家的层厚,介电常数,就可以设计了。交付文件时大多会填写工艺说明,里面就有层叠结构,说明层厚,材料,就可以了。
本文介绍ZYNQ AXI DMA的简单模式使用方法,查询模式(poll),不使用中断,32bit。
1.有关DMA的函数调用,去参照DMA的官方例程。所有的外设都是有ID的,先建立一个结构体,初始化外设,把外设的基地址赋值给结构体,对结构体进行赋值就是写相应的寄存器,控制DMA工作。所有的外设都有寄存器手册,自己去下载,直接看寄存器空间register space就可以了,例如DMA的寄存器手册。DMA有两种方式,我只学习了使用简单模式,Scatter / Gather Mode可以看其他博主的介绍。下面的代码是DMA的初始化,非常简单,以及开启一次DMA接收,数据从axis stream fifo到DMA到DDR3。
Xil_In32 和Xil_Out32直接读和写寄存器,还有Xil_In8和Xil_Out8,是按byte操作。
void DMA_INIT(void) { //初始化 int Status; XAxiDma_Config *Config; XScuGic_Config *IntcConfig; Config = XAxiDma_LookupConfig(XPAR_AXIDMA_0_DEVICE_ID); Status = XAxiDma_CfgInitialize(&AxiDma, Config); //不使能中断 XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK,XAXIDMA_DMA_TO_DEVICE); XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK,XAXIDMA_DEVICE_TO_DMA); //初始化DMA,初不初始化无所谓,跟进去就知道本质都在写寄存器 XAxiDma_Reset(&AxiDma); while(!XAxiDma_ResetIsDone(&AxiDma)); //打印寄存器 //0x4040 0000是DMA的基地址,在block design的address中可以看到,后面是偏移地址, //window->address editor xil_printf("CR is %d\r\n", Xil_In32(0x40400000 + 0x30)); xil_printf("SR is %d\r\n", Xil_In32(0x40400000 + 0x34)); xil_printf("LENGTH is %d\r\n", Xil_In32(0x40400000 + 0x58)); //开始传输 Xil_Out32((0x40400000 + 0x30),1); //start dma Xil_Out32((0x40400000 + 0x48),base_addr); //set da address Xil_Out32((0x40400000 + 0x58),16383); //set length //再次打印,看寄存器的状态 xil_printf("
总是碰到如标题的错误。。整了好久才知道错在哪里。
原来我真的是数组超出范围了。。。。。我的天啊。。我还以为我不会再犯这种低级错误呢。。。。
当然这里我还想记录一下与此同时解决的问题。类数组的声明和使用。要使用这样的格式
private Point[] weights;
weights = new Point[3];
weights[0] = new Point(····);