python中常见错误
opencv相关
最基础的imread、imwrite都不能使用
1 | cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:651: error: (-2:Unspecified error) The function is not implemented. |
解决办法:降低python版本为3.7
注意:python版本使用3.7的,要不然opencv会出错,什么原因不知道
1 | python demo/topdown_demo_with_mmdet.py demo/mmdetection_cfg/cascade_rcnn_x101_64x4d_fpn_1class.py cascade_rcnn_x101_64x4d_fpn_20e_onehand10k-dac19597_20201030.pth configs/hand_2d_keypoint/topdown_heatmap/onehand10k/td-hm_hrnetv2-w18_8xb64-210e_onehand10k-256x256.py hrnetv2_w18_onehand10k_256x256-30bc9c6b_20210330.pth --input tests/data/onehand10k/9.jpg --show --draw-heatmap |
梯度下降
1 | import tensorflow as tf |
1 | import tensorflow as tf |
所有的深度学习都包含上面几个步骤
因此,tensorflow将上面的固定步骤写在同一的接口中方便使用
1 | import tensorflow as tf |
过拟合:训练精度很高,测试精度不够(可能)
欠拟合:训练精度不够,测试精度也不够(可能)——模型复杂度不够
前面是误差,后面是参数的范式,参数的一范式越小说明参数越接近于0,那么拟合出来的模型就越平滑,出现过拟合的可能性就越小
两张regularization方式,分别是一范数二范数
动量设置,参数更改的不仅仅由当前梯度的影像,还与上一次梯度的方向有关
学习率一般刚开始比较大,后续慢慢变小,前期学习率大变化快,后续会较慢
如果出现了训练精度还在提高,测试精度不提高了,说明已经过拟合,可以停止训练
每一次训练都有一些连线可能中断
tensorflow和pytorch的dropout参数是相反的
dropout在做test时不能使用——要手动取消
为什么要卷积?不使用简单的Dense层?
视野?滑动窗口?这个窗口是卷积核?cv里面锐化模糊边缘提取的卷积核
卷积核的个数,也就是con2d中的两个参数:
[c, 3, 3]一个卷积核可以将一张图片卷积到一个channels为1的新层次,c为图片的通道数
如图,这个[3, 3, 3]依次对三个通道做乘法,然后将结果加起来得到一个一通道的数据,这个一通道的数据代表着原图像在某一层次上的特征
有时候我们需要更多的特征,这时候就需要[N, c, 3, 3]这样N个卷积来提取特征,就会得到N个通道的特征
如下面的(64, 3)其中的64就是上面的N代表着64个通道的特征,3是卷积核的大小,也就是[c, 3, 3]中的3,c会默认与图片的通道数相同,所以不需要额外设置
1 | conv1 = Conv2D(64, 3, activation='relu', padding='same')(inputs) |
不同的程度可以获取到不同层级的特征
探地雷达使用过程中,有一个基站RTK、一个绑定在探地雷达上的移动站RTK
由于要用基站RTK去纠正移动站RTK,因此移动站RTK的数据采集时间应当在基站RTK采集时间包含中
对RTK的数据.GNS文件的处理:使用HGO数据处理软件
HGO软件中:工具→RINEX转换工具
Output→Export Wizard
注意选择导出文件格式,这里可以选择cor,如果没有用new添加,格式如图所示,可以点击预览如图所示——然后一直下一步
cor的配置
Header/Footer Options参数设置
Field Separator参数设置
Export Variables内各项参数设置
具体参数如下图所示:
1 | timeFilePath = 'GPR/2023041102line_time' |
打开CrossPoint
打开同一个项目中的各项文件
全景图片一张可以投影为若干张普通图片,在PhotoScan中可以将一张全景图片所投影出的图片设置为一个组,对其加以约束,会使得图片对齐效果更好
进入对应的chunk文件夹下
doc.xml内容如图所示,其中包含了我们预设的group,我们只需要将其他camera也组织成group格式就可以分组成功
1 | def photoScanNewChunk(): |
注意更改id、label和type的值
Workflow→Align Photos
根据需求更改精度之类的东西
如果对齐成功,就会像下面一样只有一个component,而如果对齐失败就会出现多个component这时就需要其他方法去改进优化
除了按上述将投影后的图片进行对齐及后续处理,还可以直接使用全景图片进行操作
全景图片数量更少(一张全景图片会投影为若干张普通图片),因此处理速率更快
出现多个component的概率更小
但可能也会出现其他问题
由于是全景图片,因此不存在分group的情况,当然也可以将比较靠近的若干图片分为一组
物理层所传数据单位为比特。要求发送法发送1/0时,接受方应当准确接受到1/0。因此物理层要考虑用多大的电压代表1或0,以及接受方如何识别出发送法发送的比特。
物理层的作用正是要尽可能的屏蔽掉多种多样的传输媒体和通信手段的差异,使物理层上面的数据链路层感觉不到这些差异。
信道:向某一个方向传送信息的媒体。单工通信、半双工通信、全双工通信
两台主机之间的数据传输,总是在一段一段的链路上完成的,这就需要专门的链路层协议。在两个相邻节点之间传输数据时,数据链路层将网络层交下来的IP数据报组装成帧,两个相邻节点在链路中传送帧。
每一帧会包括必要的控制信息:同步信息、地址信息、差错控制。
1 | create-react-app name |
删除默认生成的文件:
直接把需要使用的icon替换public下面的favicon.ico
设置html文件下的title属性
配置后编写项目的智能提示会好很多
1 | { |
webpack的配置:
1 | npm install @craco/craco@alpha -D |
1 | const path = require('path') |
要是craco生效,项目启动必须以craco启动,才能和webpack的配置融合——修改package.json中的scripts
1 | "scripts": { |
此时就可以用别名去写路径,避免长串的../../
项目的less配置:
1 | npm i craco-less@2.1.0-alpha.0 --save -D |
1 | const path = require('path') |
对默认样式进行重置:
normalize.css:
1 | npm install normalize.css --save |
在index.js中导入
reset.css:
1 | /* 把需要重置的元素名称放在这里 */ |
1 | npm install react-router-dom --save |
index.js:
1 | import React, { Suspense } from 'react'; |
router/index.js:
1 |
|
1 | npm install @reduxjs/toolkit react-redux --save |
普通方式:
1 | const initialState = { |
1 | import reducer from "./reducer"; |
@reduxjs/toolkit方式:
1 | import { createSlice } from "@reduxjs/toolkit"; |
1 | import { configureStore } from "@reduxjs/toolkit"; |
发起网络请求库:
1 | npm install axios --save |
index.js代码:
1 | import owwRequest from "./request" |
request/index.js代码:
1 | import axios from "axios"; |
request/config.js:
1 | export const BASE_URL = "" |
内存的管理都会有如下的生命周期:
不同的编程语言对于第一步和第三步会有不同的实现:
对于开发者来说,JavaScript 的内存管理是自动的、无形的:
因为内存的大小是有限的,所以当内存不再需要的时候,我们需要对其进行释放,以便腾出更多的内存空间
在手动管理内存的语言中,我们需要通过一些方式自己来释放不再需要的内存,比如free函数:
垃圾回收的英文是Garbage Collection,简称GC
引用计数:
当一个对象有一个引用指向它时,那么这个对象的引用就+1
当一个对象的引用为0时,这个对象就可以被销毁掉
循环引用不会被销毁
标记清除:
闭包访问过程:
闭包执行过程:
makeAdder函数执行完毕,正常情况下我们的AO对象会被释放
但是因为在0xb00的函数中有作用域引用指向了这个AO对象,所以它不会被释放掉
闭包的内存泄露问题:
AO对象不会被销毁时,是否里面的所有属性都不会被释放?
下面这段代码中name属于闭包的父作用域里面的变量
我们知道形成闭包之后count一定不会被销毁掉,那么name是否会被销毁掉呢
不编写class的情况下使用state以及其他的React特性
复杂组件变得难以理解
难以理解的class
Hook可以解决上述class和函数组件存在的问题
它可以让我们在不编写class的情况下使用state以及其他的React特性
Hooks只能在函数组件中使用
为什么Hooks中的函数都叫use,不叫create呢?
useState主要在函数组件中定义state
1 | import React, { memo, useState } from 'react' |
useState返回的是一个数组,其中数组中的第一个值是state变量的值,第二个值是设置状态值的函数
只能在最外层调用Hook,不能在循环、条件判断或者子函数中调用
1 | import React, { memo, useEffect, useState } from 'react' |
但是在默认情况下,无论第一次渲染,还是在上面更改count更新后的渲染,在渲染结束后都会执行这个回调函数
由于每次渲染都会执行useEffect中的函数,那么每次都会添加监听,最后会添加若干监听,因此需要在函数组件卸载或渲染前卸载掉之前的监听
useEffect通过传入的回调函数1的返回值函数2,在返回值函数2中做清除操作
React何时清除useEffect
使用Hook的其中一个目的就是解决class中生命周期经常将很多的逻辑放在一起的问题
使用Effect Hook,我们可以将它们分离到不同的useEffect中
1 | import React, { memo, useEffect, useState } from 'react' |
默认情况下,useEffect的回调函数会在每次渲染时都重新执行,但是这会导致两个问题
1 | import React, { memo, useEffect, useState } from 'react' |
useEffect的实际上有两个参数
1 | import React, { memo, useEffect, useState } from 'react' |
那么这里的两个回调函数分别对应的就是componentDidMount和componentWillUnmount生命周期函数了
获取Context的方式:
但是多个Context共享时会存在大量的嵌套——Context Hook允许我们通过Hook来直接获取某个Context的值
但是Provider依然会有嵌套
Provider代码:
1 | import React from 'react'; |
useContext代码:
1 | import React, { memo, useContext, useEffect, useState } from 'react' |
useReducer仅仅是useState的一种替代方案——与Redux关系不大
1 | import React, { memo, useReducer } from 'react' |
useReducer的参数与返回值:
useCallback实际的目的是为了进行性能的优化
父组件代码:
1 | import React, { memo, useCallback, useState } from 'react' |
子组件代码:
1 | import React, { memo } from 'react' |
可以看出每次修改count都会刷新不依赖count子组件,会造成性能浪费
1 | import React, { memo, useCallback, useState } from 'react' |
可以看出点击更改count后,子组件并未刷新
useCallback的参数与返回值:
使用useCallback的目的是不希望子组件进行多次渲染,并不是为了函数进行缓存
useMemo也是为了进行性能的优化:
useMemo的使用案例:
父组件代码:
1 | import React, { memo, useCallback, useState } from 'react' |
子组件代码:
1 | import React, { memo } from 'react' |
可以看出:
1 | import React, { memo, useMemo, useState } from 'react' |
可以看出:
修改count后,依赖于message的函数不再重新执行,子组件也不再刷新
注意:
useRef返回一个ref对象,返回的ref对象再组件的整个生命周期保持不变
1 | import React, { memo, useRef} from 'react' |
1 | import React, { memo, useCallback, useRef, useState} from 'react' |
父组件代码:
1 | import React, { memo, useRef, useState} from 'react' |
子组件代码:
1 | import React, { forwardRef, memo } from 'react' |
注:要使用ref参数,子组件需用forwardRef包裹,且要使用memo的话,memo在forwardRef外层
1 | import React, { forwardRef, memo, useImperativeHandle, useRef } from 'react' |
useLayoutEffect看起来和useEffect非常的相似,事实上他们也只有一点区别而已:
1 | import React, { memo, useEffect, useLayoutEffect} from 'react' |
注:先”render app”,等数据更新后,渲染到DOM前执行useLayoutEffect,渲染结束后执行useEffect
在页面即将刷新错误数据前及时拦截
使用useEffect代码:
1 | import React, { memo, useEffect, useState} from 'react' |
使用useLayoutEffect代码:
1 | import React, { memo, useLayoutEffect, useState} from 'react' |
自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上来说,它本身并不算React的特性
注:
整个项目index.js代码:
1 | import React from 'react'; |
countSlice.js代码
1 | import { createSlice } from "@reduxjs/toolkit"; |
导出的stero的index.js代码:
1 | import { configureStore } from "@reduxjs/toolkit"; |
stero使用的jsx代码:
1 | import React, { memo, useLayoutEffect, useState} from 'react' |
注:
App.jsx代码:
1 | import React, { memo} from 'react' |
注:
可以看到能够直接使用useSelector对stero中的数据进行映射,直接通过useDispatch获取dispatch
但是上述会出现一些问题:
ChildComponent代码:
1 | import React, { memo } from 'react' |
子组件只与state中的message有关,但当count改变时子组件依然会刷新,会引起性能的降低
给useSelector设置shallowEqual就可以避免上述问题,实际上是进行一个浅层比较,如果相同就不更新
1 | const {message} = useSelector((state)=>({ |