一、SpringBoot
1.核心特性
- 自动配置Spring Boot 能依据项目依赖自动对 Spring 应用进行配置,这样就减少了开发者手动配置的工作量。
- 起步依赖起步依赖是一组预先定义好的依赖集合,它简化了项目的依赖管理。比如,
spring-boot-starter-web这个起步依赖,包含了构建 Web 应用所需的 Spring MVC、Tomcat 等相关依赖,开发者只需引入这一个依赖,就能快速搭建 Web 应用。 - 嵌入式服务器Spring Boot 支持嵌入式服务器,如 Tomcat、Jetty 等。这意味着开发者可以将应用打包成一个可执行的 JAR 文件,其中包含了嵌入式服务器,无需额外部署到外部服务器中。例如,在开发 Web 应用时,启动 Spring Boot 应用,嵌入式 Tomcat 服务器会自动启动并运行应用。
- ActuatorActuator 提供了生产级别的功能,用于监控和管理 Spring Boot 应用。它可以通过 HTTP 端点或 JMX 暴露应用的健康信息、指标信息、环境信息等。例如,通过
/actuator/health端点可以查看应用的健康状态,通过/actuator/metrics端点可以查看应用的各种指标。
2.关键注解
- @SpringBootApplication这是一个组合注解,包含了
@Configuration、@EnableAutoConfiguration和@ComponentScan。它通常标注在 Spring Boot 应用的主类上,用于开启自动配置、组件扫描等功能。 - @RestController该注解用于创建 RESTful 风格的控制器,它是
@Controller和@ResponseBody的组合。使用@RestController注解的类中的方法会直接返回数据,而不是视图。 - @RequestMapping用于映射 HTTP 请求到控制器的处理方法上。可以指定请求的路径、请求方法等。
- @Autowired用于实现依赖注入。Spring Boot 会自动将合适的 Bean 注入到使用
@Autowired注解的字段、方法或构造函数中。
3.开发流程
- 创建项目 可以使用 Spring Initializr(https://start.spring.io/) 快速创建 Spring Boot 项目,选择所需的依赖,生成项目骨架。
- 编写代码 在生成的项目中编写控制器、服务层、数据访问层等代码。
- 配置文件 根据项目需求,在
application.properties或application.yml中进行配置。 - 运行项目 可以直接运行主类的
main方法启动 Spring Boot 应用。也可以使用 Maven 或 Gradle 命令进行打包和运行。例如,使用 Maven 打包:mvn clean package,然后运行生成的 JAR 文件:java -jar target/myapp.jar。
4.安全机制
Spring Security
Spring Boot 集成了 Spring Security 框架,用于为应用提供全面的安全防护。它能处理身份验证(如用户名和密码验证、OAuth2 验证等)和授权(决定用户对资源的访问权限)。
- 身份验证:可以配置不同的身份验证方式,如基于表单的登录、HTTP 基本认证等。例如,使用表单登录时,用户在登录页面输入用户名和密码,Spring Security 会验证这些信息是否正确。
- 授权:通过定义角色和权限,限制用户对特定资源的访问。例如,只有具有 “ADMIN” 角色的用户才能访问
/admin路径下的资源。
5.日志管理
Logback 和 Log4j
Spring Boot 默认使用 Logback 作为日志框架,它提供了强大的日志功能,如日志级别控制、日志输出格式配置、日志文件滚动等。也可以切换到 Log4j 等其他日志框架。
6.微服务与云原生
Spring Cloud
Spring Cloud 为 Spring Boot 应用提供了构建微服务架构的工具集,包括服务发现(如 Eureka、Consul)、配置管理(如 Config Server)、负载均衡(如 Ribbon)、断路器(如 Hystrix)等。
- 服务发现:服务发现组件允许服务之间相互发现和通信。例如,使用 Eureka 作为服务注册中心,服务提供者将自己注册到 Eureka 服务器,服务消费者从 Eureka 服务器获取服务提供者的信息。
- 配置管理:Config Server 可以集中管理微服务的配置文件,实现配置的动态更新。
Docker 和 Kubernetes
Spring Boot 应用可以很方便地打包成 Docker 镜像,并部署到 Kubernetes 集群中。Docker 提供了容器化的环境,确保应用在不同环境中的一致性;Kubernetes 则用于自动化部署、扩展和管理容器化应用。
二、SSM
1.Spring
核心特性
- IoC(控制反转):也被叫做依赖注入(DI),其核心是将对象的创建和依赖关系的管理从代码中转移到 Spring 容器里。比如,在传统编程时,对象 A 若依赖对象 B,那么 A 要自己负责创建 B;而在 Spring 中,对象的创建和依赖关系由 Spring 容器管理,A 只需接收 Spring 容器注入的 B 即可。主要方式有构造器注入、Setter方法注入、接口注入、注解注入、方法注入等
- AOP(面向切面编程):传统的面向对象编程是按照对象和类的层次结构来组织代码,强调数据和操作的封装、继承和多态。而 AOP 则是将程序中的一些通用功能(如日志记录、事务管理、权限验证等)从业务逻辑中分离出来,形成独立的模块,这些模块被称为切面(Aspect)。通过 AOP,可以在不修改原有业务逻辑的基础上,对程序进行增强。
Bean 管理
- Bean 定义:在 Spring 里,对象被称作 Bean。可以通过 XML 配置文件、Java 注解或者 Java 配置类来定义 Bean。
- Bean 生命周期:包含 Bean 的创建、初始化、使用和销毁等阶段。Spring 提供了相应的接口和注解来干预 Bean 的生命周期。
事务管理
- 编程式事务:开发者需要在代码里手动管理事务的开启、提交和回滚。
- 声明式事务:借助 AOP 实现,开发者只需在配置文件或者方法上添加注解,Spring 就会自动管理事务。
2.SpringMVC(Web层)
核心组件
- DispatcherServlet:作为 Spring MVC 的核心,它是一个前端控制器,负责接收所有的 HTTP 请求,并将请求分发给相应的处理器进行处理。
- HandlerMapping:负责将请求映射到具体的处理器(Controller)。
- Controller:处理请求的业务逻辑,通常会返回一个 ModelAndView 对象,包含模型数据和视图名称。
- ViewResolver:根据视图名称解析出具体的视图,如 JSP、Thymeleaf 模板等。
请求处理流程
- 客户端发送 HTTP 请求到 DispatcherServlet。
- DispatcherServlet 通过 HandlerMapping 找到处理该请求的 Controller。
- Controller 处理请求,生成模型数据和视图名称。
- DispatcherServlet 将模型数据和视图名称传递给 ViewResolver,解析出具体的视图。
- 视图将模型数据渲染成 HTML 页面返回给客户端。
3.Mybatis(数据持久层)
核心组件
- SqlSessionFactory:负责创建 SqlSession 对象,它是 MyBatis 的核心工厂类,通常通过 XML 配置文件或者 Java 代码进行配置。
- SqlSession:表示与数据库的一次会话,通过它可以执行 SQL 语句,获取映射器接口的实例等。
- Mapper 接口:定义了与数据库交互的方法,MyBatis 会根据接口的方法名和参数自动生成对应的 SQL 语句。
- Mapper XML 文件:可以手动编写 SQL 语句,与 Mapper 接口中的方法进行映射。
映射机制
- 结果映射:将数据库查询结果映射到 Java 对象中,可以通过 XML 配置或者注解来实现。
- 参数映射:将 Java 对象的属性值映射到 SQL 语句的参数中。
4.SSM 整合要点
Spring 作为核心提供基础支持,Spring MVC 负责处理 Web 请求,MyBatis 负责数据持久化,三者相互协作,共同构建出一个高效、可维护的 Java Web 应用程序。
配置整合
- 把 Spring、Spring MVC 和 MyBatis 的配置文件整合在一起,确保它们能够协同工作。
- 配置数据源、事务管理器等。
依赖注入
- 利用 Spring 的 IoC 特性,将 MyBatis 的 Mapper 接口注入到 Service 层,将 Service 层的实例注入到 Controller 层。
事务管理
- 借助 Spring 的声明式事务管理,确保数据库操作的一致性和完整性。
在实际开发中,这三个框架一起配合工作。用户通过浏览器发送请求,Spring MVC 接收请求并找到对应的控制器来处理,控制器在处理过程中如果需要操作数据库,就会让 MyBatis 去和数据库交互,MyBatis 把数据取回来后交给控制器,控制器再把结果交给 Spring MVC,由 Spring MVC 把结果展示给用户。而 Spring 则在背后默默地管理着所有这些组件,让它们能够顺利地协同工作。
三、Vue
Vue 是一个用于构建用户界面的渐进式 JavaScript 框架。
1.核心概念
响应式原理
Vue 采用了 Object.defineProperty ()(Vue 2.x)或 Proxy(Vue 3.x)来实现数据的响应式。当一个 Vue 实例创建时,Vue 会遍历 data 选项中的所有属性,使用这些方法将这些属性转换为 getter/setter。这样,当这些属性的值发生变化时,Vue 会自动更新与之绑定的 DOM 元素。
虚拟 DOM
虚拟 DOM 是一种轻量级的 JavaScript 对象,它是真实 DOM 的抽象表示。Vue 通过虚拟 DOM 来提高渲染效率,当数据发生变化时,Vue 会先计算出新的虚拟 DOM 树,然后通过对比新旧虚拟 DOM 树的差异,只更新需要更新的真实 DOM 节点。
编译器
Vue 的编译器负责将模板字符串编译成渲染函数。渲染函数返回虚拟 DOM 树,最终由 Vue 的渲染器将虚拟 DOM 树渲染成真实的 DOM 节点。
渲染器
渲染器负责将虚拟 DOM 树转换为真实的 DOM 节点,并将其插入到页面中。渲染器还负责处理虚拟 DOM 的更新和销毁操作。
组件化开发
组件是 Vue 应用中最核心的概念之一,它允许你将一个大型应用拆分成多个小的、可复用的组件。每个组件都有自己的模板、逻辑和样式,它们可以独立开发、测试和维护。例如,一个页面可能由头部组件、侧边栏组件、内容组件等组成。
生命周期钩子
Vue 实例从创建到销毁的整个过程中,会经历多个阶段,每个阶段都有对应的生命周期钩子函数,开发者可以在这些钩子函数中编写代码来执行特定的操作。
路由管理(Vue Router)
Vue Router 是 Vue.js 官方的路由管理器,用于实现单页面应用(SPA)的路由功能。它允许你根据不同的 URL 路径显示不同的组件,实现页面的切换。
状态管理(Vuex)
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
组合式 API(Vue 3)
组合式 API 是 Vue 3 引入的一种新的代码组织方式,它允许你基于逻辑关注点来组织代码,而不是像选项式 API 那样基于选项来组织。
2.整体架构分层
视图层(View)
这是直接呈现给用户的部分,由 HTML、CSS 和 Vue 模板组成。Vue 通过模板语法(如双大括号插值、指令等)将数据绑定到 DOM 元素上,实现数据的动态展示。
视图模型层(ViewModel)
ViewModel 是 Vue 的核心部分,它是视图和数据模型之间的桥梁。Vue 实例就是一个 ViewModel,它负责处理数据的响应式更新、事件处理、计算属性等。Vue 实例通过 data 选项定义数据模型,通过 methods 选项定义方法,通过 computed 选项定义计算属性。
数据模型层(Model)
数据模型层代表应用中的数据和业务逻辑。在 Vue 中,数据模型可以是简单的 JavaScript 对象,也可以是从后端服务器获取的数据。例如,通过 axios 等工具从后端接口获取数据
四、Token
1.Token 的作用
Token 是在身份验证和授权过程中使用的一段字符串,在现代 Web 应用和移动应用开发中发挥着至关重要的作用
2.Token 的实现方法
生成 Token
- 使用 JWT(JSON Web Token):JWT 是一种广泛使用的 Token 实现方式,它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
- 头部:通常包含 Token 的类型(如 JWT)和使用的签名算法(如 HMAC SHA256 或 RSA)。
- 载荷:包含声明(Claims),声明是关于实体(通常是用户)和其他数据的声明。声明分为三种类型:注册声明、公开声明和私有声明。
- 签名:为了创建签名部分,需要使用编码后的头部、编码后的载荷、一个密钥(secret)和头部中指定的签名算法进行签名。
验证 Token
- JWT 验证:服务器在接收到客户端请求时,需要验证 Token 的有效性。验证过程包括检查签名是否正确、Token 是否过期等。
存储和传输 Token
- 客户端存储:客户端通常将 Token 存储在本地,如浏览器的 localStorage 或 sessionStorage 中,或者存储在移动应用的本地存储中。
- 请求传输:客户端在每次请求时,将 Token 包含在请求头中,常见的请求头字段是
Authorization,格式为Bearer <token>。
五、Redis
Redis 是一款开源的、基于内存的数据结构存储系统,常被用作数据库、缓存和消息中间件。
1.基础概念
- 数据类型:Redis 支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)等。
- 字符串:是 Redis 中最基本的数据类型,可用于存储任何类型的数据,如整数、浮点数、文本等。
- 哈希:是一个键值对集合,适用于存储对象,其中字段名作为键,字段值作为值。
- 列表:是一个有序的字符串元素集合,可用于存储队列或栈等数据结构。
- 集合:是一个无序的字符串元素集合,其中每个元素都是唯一的,可用于去重和交集、并集等操作。
- 有序集合:与集合类似,但每个元素都关联一个分数,用于排序。
- 键值对:Redis 中的数据都是以键值对的形式存储的,键是唯一的标识符,用于获取对应的值。键可以是任何字符串,值可以是 Redis 支持的任意数据类型。
- 内存存储:Redis 将所有数据存储在内存中,这使得它具有极高的读写性能。但由于内存空间有限,因此需要合理规划数据存储和使用内存。为了保证数据的持久化,Redis 提供了多种持久化方案,如 RDB(Redis Database)快照和 AOF(Append Only File)日志。
- 原子操作:Redis 的操作是原子性的,这意味着要么整个操作成功执行,要么根本不执行。在处理并发请求时,原子操作可以确保数据的一致性和完整性。
- 过期时间:可以为 Redis 中的键设置过期时间,当键过期后,Redis 会自动删除该键及其对应的值。这一特性常用于缓存数据,以避免缓存数据占用过多内存。
- 事务:Redis 支持事务,允许将多个命令组合在一起,作为一个原子操作执行。事务中的命令要么全部执行成功,要么全部不执行,从而保证数据的一致性。
- 发布 / 订阅:Redis 提供了发布 / 订阅功能,允许客户端将消息发布到指定的频道,其他客户端可以订阅这些频道以接收消息。这一功能常用于实现消息队列和实时通信等场景。
- 集群:为了提高 Redis 的性能和可扩展性,可以将多个 Redis 节点组成一个集群。集群中的节点可以分担数据存储和请求处理的压力,实现数据的分布式存储和高可用性。
2.实现登录缓存
- 用户登录验证:用户输入用户名和密码,系统首先在数据库中验证用户信息。若验证通过,生成一个唯一的令牌(Token),并将用户信息存储在 Redis 中,同时将令牌返回给客户端。
- 后续请求验证:客户端在后续请求中携带该令牌,系统从 Redis 中根据令牌查找对应的用户信息。若找到,则认为用户已登录,允许访问;若未找到,要求用户重新登录。
- 设置过期时间:为了保证安全性和合理利用 Redis 内存,为存储在 Redis 中的用户信息设置过期时间,过期后用户需重新登录。
六、DB算法
在深度学习领域,DB 算法通常指的是 “Differentiable Binarization”(可微二值化)算法,它主要用于文本检测等任务,以下是其相关介绍:
原理
- 二值化:传统的文本检测中,二值化是将图像中的文本区域和非文本区域进行分离的关键步骤。但传统二值化方法通常是不可微的,难以直接融入到深度学习的端到端训练中。DB 算法通过提出一种可微的二值化方法解决了这个问题。
- 可微近似:它使用一个近似函数来模拟二值化的过程,这个函数在训练过程中是可微的,从而可以通过反向传播算法来优化模型的参数。具体来说,DB 算法利用了一种称为 “Sigmoid” 函数的变体,将其输出通过一个阈值处理来近似二值化的结果。在训练阶段,通过调整模型参数使得近似的二值化结果尽可能接近真实的文本区域。
网络结构
- 骨干网络:通常采用一些经典的卷积神经网络结构,如 ResNet、MobileNet 等,用于提取图像的特征。这些骨干网络能够捕捉图像中的各种语义信息和空间特征,为后续的文本检测提供基础。
- 特征金字塔结构:为了更好地处理不同尺度的文本,DB 算法通常会采用特征金字塔结构,如 FPN(Feature Pyramid Network)。通过在不同尺度的特征图上进行融合和处理,可以提高对不同大小文本的检测能力。
- 二值化模块:这是 DB 算法的核心部分,它基于可微二值化原理,将骨干网络和特征金字塔结构提取的特征进行处理,生成二值化的文本区域预测结果。同时,在训练过程中,该模块会根据真实标签计算损失,并通过反向传播更新模型参数。
训练与优化
- 损失函数:DB 算法的损失函数通常由多个部分组成,包括用于二值化结果的损失、用于文本区域边界细化的损失等。通过合理设计损失函数,可以使得模型在训练过程中能够同时优化文本区域的检测精度和边界的准确性。
- 优化器:常用的优化器如 SGD(Stochastic Gradient Descent)、Adam 等都可以用于 DB 算法的训练。在训练过程中,需要根据具体的数据集和模型结构调整优化器的参数,如学习率、动量等,以保证模型能够快速收敛到较好的性能。
优点
- 端到端训练:可微二值化使得文本检测可以实现端到端的训练,将图像输入到模型中,直接输出文本区域的检测结果,无需像传统方法那样进行复杂的后处理步骤,提高了检测的效率和准确性。
- 对不同尺度文本的适应性:通过特征金字塔结构和可微二值化的结合,DB 算法能够较好地处理不同尺度的文本,在各种文本检测数据集上都表现出了良好的性能。
- 鲁棒性强:DB 算法对图像中的噪声、模糊等情况具有一定的鲁棒性,能够在复杂的实际场景中准确地检测出文本区域。
应用场景
- 自然场景文本检测:在各种自然场景图像中,如街道场景、广告招牌、文档图像等,DB 算法可以准确地检测出文本的位置和范围,为后续的文本识别和信息提取提供基础。
- 文档分析:对于扫描文档、电子文档等,DB 算法可以用于定位文档中的文本区域,帮助进行文档的结构分析、文字识别等处理,提高文档处理的自动化程度。
- 图像字幕生成:在图像字幕生成任务中,DB 算法可以先检测图像中的文本信息,然后将其作为额外的语义信息融入到字幕生成模型中,提高字幕生成的准确性和相关性。
七、CNN 卷积神经网络
卷积神经网络(Convolutional Neural Network,CNN)是一类专门为处理具有网格结构数据(如图像、音频)而设计的深度学习模型,在计算机视觉、自然语言处理等领域取得了巨大成功。以下从多个方面详细介绍 CNN:
基本原理
CNN 受到生物视觉系统的启发,通过模拟人类视觉皮层中神经元对局部信息的感知方式来处理数据。它通过卷积层、池化层和全连接层等组件,自动从输入数据中提取特征,并进行分类、检测等任务。
主要组件
1. 卷积层(Convolutional Layer)
- 卷积操作:卷积层是 CNN 的核心组件,使用卷积核(滤波器)在输入数据上滑动,进行卷积操作,提取局部特征。每个卷积核可以学习到不同的特征,如边缘、纹理等。
- 特征图:卷积操作的输出称为特征图,它表示输入数据在不同卷积核下的特征响应。
- 参数共享:卷积层的一个重要特性是参数共享,即每个卷积核在整个输入数据上使用相同的参数,这大大减少了模型的参数数量,降低了计算复杂度,同时也提高了模型的泛化能力。
2. 激活函数层
- 卷积层的输出通常会经过激活函数进行非线性变换,引入非线性因素,增强模型的表达能力。常用的激活函数有 ReLU(Rectified Linear Unit)、Sigmoid、Tanh 等。其中,ReLU 函数因其计算简单、能有效缓解梯度消失问题而被广泛使用,其公式为(f(x)=\max(0, x))。
3. 池化层(Pooling Layer)
- 作用:池化层主要用于降低特征图的维度,减少计算量,同时增强模型的鲁棒性。它通过对特征图进行下采样操作,保留重要的特征信息。
- 常见类型:常见的池化操作有最大池化(Max Pooling)和平均池化(Average Pooling)。最大池化是在每个池化窗口中选择最大值作为输出,平均池化则是计算池化窗口内所有值的平均值。
4. 全连接层(Fully Connected Layer)
- 作用:全连接层通常位于 CNN 的末尾,将前面卷积层和池化层提取的特征进行整合,用于分类或回归任务。在全连接层中,每个神经元与上一层的所有神经元相连。
- 输出:对于分类任务,全连接层的输出通常会经过 Softmax 函数进行归一化,得到每个类别的概率分布。
训练过程
- 数据准备:收集和整理训练数据,并进行预处理,如归一化、数据增强等。数据增强可以通过随机裁剪、翻转、旋转等操作增加训练数据的多样性,提高模型的泛化能力。
- 定义模型:构建 CNN 模型的架构,确定卷积层、池化层、全连接层的数量和参数。
- 损失函数:选择合适的损失函数来衡量模型的预测结果与真实标签之间的差异。对于分类任务,常用的损失函数有交叉熵损失(Cross-Entropy Loss);对于回归任务,常用的损失函数有均方误差损失(Mean Squared Error Loss)。
- 优化算法:使用优化算法(如随机梯度下降 SGD、Adam 等)来更新模型的参数,使得损失函数最小化。
- 训练循环:将训练数据输入到模型中,计算损失函数,然后使用优化算法更新模型的参数,重复这个过程直到模型收敛。
优点
- 自动特征提取:CNN 能够自动从输入数据中提取特征,无需手动设计特征,大大减少了特征工程的工作量。
- 局部感知和参数共享:卷积层的局部感知和参数共享特性使得模型具有平移不变性,能够更好地处理图像等具有局部结构的数据,同时减少了模型的参数数量,降低了过拟合的风险。
- 高效处理多维数据:CNN 在处理高维数据(如图像、音频)时具有很高的效率,能够充分利用数据的空间结构信息。
八、智能水表使用DB和CNN的好处
应用领域
- 计算机视觉:图像分类、目标检测、语义分割、人脸识别等。例如,在图像分类任务中,CNN 可以对图像进行分类,判断图像中物体的类别;在目标检测任务中,CNN 可以检测出图像中物体的位置和类别。
- 自然语言处理:文本分类、情感分析、机器翻译等。通过将文本转换为词向量序列,CNN 可以对文本进行特征提取和分类。
- 语音识别:对语音信号进行特征提取和分类,识别语音中的文字信息。
在智能水表检测系统中使用 DB(Differentiable Binarization,可微二值化)算法和 CNN(Convolutional Neural Network,卷积神经网络)能够从图像预处理、特征提取、模型训练、应用效果等多个层面提升系统性能,具体好处如下:
使用 DB 算法的好处
高精度的水表读数区域分割
- 清晰分离读数:智能水表的表盘图像可能存在光照不均、背景复杂等问题,DB 算法可微二值化的特性能够精准地将水表读数区域从复杂背景中分割出来,将读数部分清晰地凸显,为后续的读数识别提供高质量的输入。
- 适应不同场景:无论是在强光、弱光还是有遮挡的环境下拍摄的水表图像,DB 算法都能通过可微的二值化过程自适应地调整分割策略,确保在各种实际场景下都能准确分割出读数区域。
端到端训练优势
- 简化流程:传统的水表读数区域分割方法通常需要多个步骤和复杂的后处理,而 DB 算法支持端到端的训练,将图像输入模型后可直接输出分割结果,减少了中间环节,提高了系统的整体效率。
- 提升准确性:在端到端训练过程中,模型可以根据最终的读数识别结果来优化分割策略,使得分割结果更符合后续识别的需求,从而提高整个检测系统的准确性。
对不同字体和样式的适应性
- 广泛识别:不同厂家生产的智能水表,其读数的字体、样式和颜色可能存在差异。DB 算法能够学习到这些不同的特征,对各种字体和样式的水表读数都能进行有效的分割,增强了系统的通用性。
使用 CNN 的好处
强大的特征提取能力
- 多层次特征学习:CNN 的卷积层可以自动从水表图像中提取多层次的特征,从底层的边缘、纹理特征到高层的语义特征。例如,能够识别出水表数字的轮廓、笔画等特征,为准确识别读数奠定基础。
- 高效捕捉局部信息:CNN 的局部感知和参数共享特性使其能够高效地捕捉水表图像中的局部信息,对于水表上的小数字、刻度等细节也能进行准确的特征提取。
高准确率的读数识别
- 分类能力强:通过全连接层和 Softmax 函数,CNN 可以对提取的特征进行分类,准确识别出水表的读数。在大量的训练数据支持下,CNN 能够学习到不同数字的特征模式,从而实现高精度的读数识别。
- 抗干扰能力:CNN 在训练过程中可以学习到如何区分水表读数和周围的干扰信息,如灰尘、污渍等,提高了系统在复杂环境下的抗干扰能力。
模型的可扩展性和迁移学习
- 功能扩展:可以通过增加 CNN 的层数、调整卷积核的数量等方式对模型进行扩展,以适应不同的检测需求。例如,除了识别读数,还可以扩展到检测水表的故障、异常等。
- 迁移学习:在智能水表检测系统中,如果有相似的数据集或预训练模型,CNN 可以利用迁移学习的方法,快速在新的数据集上进行微调,减少训练时间和数据量的需求。
九、常见的机器学习算法
常见的机器学习算法可以分为监督学习、无监督学习和强化学习等类别,以下是一些具有代表性的算法介绍:
监督学习算法
- 线性回归(Linear Regression)
- 原理:通过寻找一条最优直线(在多元情况下是超平面)来拟合数据,使得实际值与预测值之间的误差平方和最小。
- 应用场景:常用于预测连续型数值,如房价预测、股票价格预测等。
- 优点:简单易懂,可解释性强,计算复杂度较低。
- 缺点:对非线性数据的拟合能力有限,容易过拟合。
- 逻辑回归(Logistic Regression)
- 原理:基于线性回归,通过 Sigmoid 函数将线性回归的结果映射到 0 到 1 之间,用于表示分类的概率。
- 应用场景:广泛应用于二分类问题,如垃圾邮件分类、疾病诊断等。
- 优点:模型简单,训练速度快,可解释性强。
- 缺点:对于多分类问题处理相对复杂,对数据的分布有一定要求。
- 决策树(Decision Tree)
- 原理:通过条件判断对样本进行分类,每个内部节点是一个属性上的测试,分支是测试输出,叶节点是类别。
- 应用场景:适用于分类和回归问题,在医疗诊断、金融风险评估等领域有广泛应用。
- 优点:可解释性强,不需要大量的数据预处理,能处理非线性数据。
- 缺点:容易过拟合,对噪声数据敏感,决策树的结构可能不稳定。
无监督学习算法
- K-Means 聚类算法
- 原理:将数据点划分为 K 个簇,使得同一簇内的数据点相似度高,不同簇的数据点相似度低。通过迭代更新簇中心,使簇内误差平方和最小。
- 应用场景:常用于数据聚类分析,如客户细分、图像分割等。
- 优点:算法简单,收敛速度快,能处理大规模数据。
- 缺点:需要预先指定簇的数量 K,对初始簇中心的选择敏感,可能陷入局部最优。
- 主成分分析(PCA)
- 原理:通过线性变换将原始数据转换为一组新的正交特征向量,这些特征向量按照方差大小排序,保留主要成分,去除次要成分,实现数据降维。
- 应用场景:用于数据降维、特征提取和可视化,在图像处理、生物信息学等领域有广泛应用。
- 优点:能有效降低数据维度,去除数据中的噪声和冗余信息。
- 缺点:可能会丢失一些重要信息,对数据的线性假设较强。
强化学习算法
- Q - 学习(Q - learning)
- 原理:智能体在环境中通过不断尝试不同的动作,根据环境反馈的奖励信号来学习最优策略。Q 值表示在某个状态下采取某个动作的长期累积奖励的期望,通过不断更新 Q 值来逼近最优策略。
- 应用场景:在机器人控制、游戏、自动驾驶等领域有广泛应用。
- 优点:不需要对环境进行精确建模,能在未知环境中学习最优策略。
- 缺点:收敛速度较慢,在复杂环境中可能需要大量的训练数据和时间。
- 深度 Q 网络(DQN)
- 原理:结合了深度学习和 Q - 学习,用深度神经网络来逼近 Q 值函数,能够处理高维的状态空间和动作空间。
- 应用场景:在 Atari 游戏、机器人控制等领域取得了显著成果。
- 优点:能够自动提取特征,处理复杂的感知信息,具有较强的泛化能力。
- 缺点:训练难度较大,容易出现过拟合和不稳定的情况,对硬件要求较高。
十、MVC模式
MVC(Model-View-Controller)即模型 - 视图 - 控制器,是一种软件设计模式,用于将应用程序划分为三个主要的逻辑组件:模型、视图和控制器。这种模式的核心目的是实现代码的分离,提高代码的可维护性、可扩展性和可测试性。以下为你详细介绍 MVC 模式的各个组件及其相关概念。
模型(Model)
- 定义:模型代表应用程序的数据和业务逻辑。它负责管理数据的存储、检索、更新和验证,同时实现与数据相关的业务规则。
- 特点
- 独立性:模型不依赖于视图和控制器,它可以独立于用户界面进行开发和测试。
- 数据处理:处理数据的增删改查操作,以及复杂的业务计算。
- 示例:在一个电商应用中,模型可能包含商品信息、用户信息、订单信息等,以及处理商品库存管理、订单结算等业务逻辑。
视图(View)
- 定义:视图是用户界面的呈现部分,负责将模型中的数据以可视化的方式展示给用户。它不包含任何业务逻辑,只是简单地显示数据。
- 特点
- 展示性:专注于数据的展示,提供良好的用户体验。
- 可替换性:可以根据不同的需求和平台,更换不同的视图实现。
- 示例:在电商应用中,视图可以是商品列表页面、商品详情页面、购物车页面等,它们将模型中的商品信息、订单信息等展示给用户。
控制器(Controller)
- 定义:控制器是模型和视图之间的桥梁,负责接收用户的输入,根据输入调用相应的模型方法进行业务处理,并将处理结果更新到视图中。
- 特点
- 协调作用:协调模型和视图之间的交互,确保数据的流动和更新。
- 事件处理:处理用户的各种操作事件,如点击按钮、提交表单等。
- 示例:在电商应用中,当用户点击 “加入购物车” 按钮时,控制器会接收到这个事件,调用模型的方法将商品添加到购物车中,并更新视图以显示新的购物车信息。
MVC 模式的工作流程
- 用户操作:用户通过视图界面进行操作,如点击按钮、输入文本等。
- 控制器接收请求:视图将用户的操作传递给控制器。
- 控制器调用模型:控制器根据用户的请求,调用相应的模型方法进行业务处理。
- 模型更新数据:模型根据控制器的调用,对数据进行更新和处理。
- 控制器更新视图:控制器将模型处理后的结果传递给视图,视图根据新的数据进行更新和展示。
MVC 模式的优点
- 代码分离:将数据处理、业务逻辑和用户界面分离,使代码结构更加清晰,易于维护和扩展。
- 可复用性:模型和视图可以独立开发和复用,提高了代码的复用性。
- 可测试性:由于各个组件的职责明确,便于进行单元测试和集成测试。
MVC 模式的缺点
- 复杂度增加:对于简单的应用程序,使用 MVC 模式可能会增加代码的复杂度。
- 通信开销:模型、视图和控制器之间的通信需要一定的开销,可能会影响性能。
十一、Linux基础知识
Linux 是一种开源的类 Unix 操作系统,在服务器、嵌入式系统、移动设备等众多领域都有广泛应用。以下为你介绍 Linux 的一些基础概念:
1. 内核(Kernel)
- 定义:内核是 Linux 操作系统的核心部分,它负责管理系统的硬件资源,如 CPU、内存、磁盘 I/O 等,同时为上层的应用程序提供系统调用接口。
- 功能:进程管理(创建、调度和销毁进程)、内存管理(分配和回收内存)、文件系统管理(读写文件、目录操作)、设备驱动管理(控制硬件设备)和网络管理(网络通信)。
2. 文件系统(Filesystem)
- 定义:文件系统是操作系统用于组织和存储文件的一种方式。Linux 采用树形结构的文件系统,所有文件和目录都挂载在根目录(
/)下。 - 常见目录
/bin:存放系统的基本命令,如ls、cp等。/etc:存放系统和应用程序的配置文件。/home:用户的主目录,每个用户在该目录下有自己的子目录。/var:存放经常变化的数据,如日志文件、邮件等。/root:超级用户(root)的主目录。
- 文件系统主要由inode和block组成,一个文件占有一个inode,记录文件的属性,同时记录该文件所在的block;block记录文件内容,superblock记录文件系统的整体信息
3. 用户和用户组(Users and Groups)
- 用户:使用 Linux 系统的个体,每个用户有唯一的用户名和用户 ID(UID)。超级用户(root)拥有最高权限,可以执行系统的任何操作。
- 用户组:将多个用户组织在一起的集合,每个用户组有唯一的组名和组 ID(GID)。用户可以属于一个或多个用户组,通过用户组可以方便地管理用户的权限。
4. 权限管理(Permissions)
- 文件和目录权限:Linux 对文件和目录的访问权限分为读(r)、写(w)和执行(x)三种,分别对应不同的操作。权限可以分配给文件的所有者(user)、所属组(group)和其他用户(others)。
- 权限表示方法:通常使用三位八进制数来表示权限,例如
755表示所有者具有读、写、执行权限,所属组和其他用户具有读、执行权限。
5. 进程(Process)
- 定义:进程是正在运行的程序的实例。每个进程都有自己的进程 ID(PID),可以通过
ps、top等命令查看系统中的进程信息。 - 进程状态:常见的进程状态包括运行(Running)、就绪(Ready)、阻塞(Blocked)和终止(Terminated)。
6. 服务(Service)
- 定义:服务是在后台运行的进程,通常用于提供特定的系统功能,如 Web 服务(Apache、Nginx)、数据库服务(MySQL、PostgreSQL)等。
- 管理命令:可以使用
systemctl命令来管理服务,如启动(start)、停止(stop)、重启(restart)和查看状态(status)等。
7. 包管理(Package Management)
- 定义:包管理是 Linux 系统中用于安装、升级和卸载软件包的机制。不同的 Linux 发行版使用不同的包管理工具,如 Debian 和 Ubuntu 使用
apt,Red Hat 和 CentOS 使用yum或dnf。 - 功能:自动解决软件包的依赖关系,确保软件包的正确安装和运行。
8. 终端和 Shell
- 终端(Terminal):是用户与 Linux 系统进行交互的界面,用户可以在终端中输入命令并查看系统的输出结果。
- Shell:是终端的解释器,负责解析用户输入的命令并执行相应的操作。常见的 Shell 有 Bash、Zsh 等。
十二、南大通用GBase 8s
GBase 8s
- 基本介绍:GBase 8s 是南大通用具有完全自主知识产权的安全数据库产品,适用于联机事务处理(OLTP)应用场景。它全面达到国标第三级的安全模型和安全要求,采用国产密码算法和硬件加密技术,提供数据存储加密、数据传输加密、安全标签、强制访问控制、三权分立、安全审计等安全功能。
- 应用场景:广泛应用于金融、电信行业的关键核心业务系统,安全、党政、国防等对信息安全性有较高要求的信息系统,以及大型企业的经营类、管理类信息系统,能够提供 7×24 小时不间断运行处理能力,在 80% 以上场景中可以替代国际主流数据库。
十三、深度学习
1. 监督学习 vs 无监督学习
| 维度 | 监督学习 | 无监督学习 |
|---|---|---|
| 输入数据 | 带标签(明确答案) | 无标签(只有数据本身) |
| 目标 | 预测标签(如分类、回归) | 发现数据模式(如聚类) |
| 例子 | 房价预测、图像分类 | 客户分群、新闻主题归类 |
一句话总结:监督学习像老师带着答案教,无监督学习像自己找规律。
2. 过拟合 vs 欠拟合
• 欠拟合:模型太简单,连训练数据都学不好(如用直线拟合曲线)。 • 过拟合:模型太复杂,死记硬背训练数据,考试(测试)成绩差。
解决方法: • 欠拟合:换复杂模型(如神经网络)、增加特征。 • 过拟合:加数据、简化模型、用正则化(L1/L2)、早停法(Early Stopping)。
3. 逻辑回归 vs 线性回归
| 逻辑回归 | 线性回归 | |
|---|---|---|
| 任务 | 分类(如判断是否生病) | 预测数值(如房价) |
| 输出 | 概率(0~1) | 任意实数 |
| 核心 | Sigmoid函数转概率 | 直接拟合直线 |
一句话:逻辑回归是"概率版"线性回归,专攻分类问题。
4. SVM核函数的作用
• 核心思想:把数据“投影”到高维空间,让原本线性不可分的数据变得可分。 • 常用核: • 线性核(简单数据) • 高斯核(万能但计算慢) • 多项式核(中等复杂度)
比喻:就像用3D眼镜看平面图,突然发现规律。
5. 决策树如何剪枝?
• 预剪枝:边建树边刹车(如限制树深度、节点最少样本数)。 • 后剪枝:先长成大树,再修剪枝叶(删除不重要的分支)。
目的:防止模型太“钻牛角尖”(过拟合)。
6. 随机森林为什么强?
• 核心:多棵决策树投票,少数服从多数。 • 优点: • 抗过拟合(树之间相互纠错) • 能处理高维数据(如基因数据) • 自带特征重要性评估
比喻:三个臭皮匠顶个诸葛亮。
7. XGBoost改进点
• 传统GBDT痛点:速度慢、容易过拟合。 • XGBoost绝招: • 加正则化(控制模型复杂度) • 二阶梯度优化(步子更准) • 并行计算(训练更快)
一句话:GBDT的“Pro Max”版本。
8. 目标检测中的IoU
• 计算:预测框和真实框的交集面积 ÷ 并集面积。 • 作用:衡量预测框准不准,值越大(接近1)越好。 • 缺点:完全无重叠时IoU=0,无法区分远近。
改进:GloU(考虑中心点距离)、CloU(加长宽比惩罚)。
9. YOLO系列核心改进
• YOLOv1:首创单阶段检测,速度快但精度低。 • YOLOv3:多尺度预测(大中小目标通吃)。 • YOLOv5:Focus结构(省计算量)、混合精度训练(显存减半)。
总结:越新版本越像“六边形战士”(又快又准)。
10. 激活函数的作用
• 核心功能:给神经网络加“非线性”,让模型能学复杂规律。 • 常用函数: • ReLU(最常用,计算快) • Sigmoid(输出概率,但易梯度消失) • LeakyReLU(解决ReLU“死神经元”问题)
比喻:激活函数就像开关,决定神经元是否传递信号。
11. 梯度消失/爆炸
• 梯度消失:深层网络反向传播时,梯度越来越小,参数不更新。 • 梯度爆炸:梯度指数级增大,模型崩溃。
解决: • 用ReLU激活函数 • 残差连接(ResNet跳线设计) • 梯度裁剪(防爆炸)
12. 卷积神经网络(CNN)优势
• 三大法宝:
- 局部感受野(只看局部,像人眼)
- 参数共享(一个模式学遍全图)
- 池化(压缩数据,防过拟合)
应用场景:图像、视频、自然语言处理(文本分类)。
13. 目标检测 vs 图像分类
| 图像分类 | 目标检测 | |
|---|---|---|
| 输出 | 图片类别标签 | 多个物体的位置+类别 |
| 难度 | 简单(看整体) | 复杂(找局部) |
例子:分类说“图里有猫”,检测要说“猫在左上角,狗在右下角”。
14. Batch Normalization作用
• 操作:每层输入做标准化(减均值、除方差)。 • 好处: • 加速训练(允许更大学习率) • 减少对初始化的依赖 • 轻微正则化效果
比喻:给每层数据“瘦身塑形”,让网络学得更稳。
15. 注意力机制
• 核心思想:让模型关注重点信息(像人看照片先看人脸)。 • 类型: • 通道注意力(关注重要特征) • 空间注意力(关注重要区域)
应用:Transformer、目标检测(如YOLOv4的SAM模块)。
附:高频问题速记
• L1/L2正则化区别:L1让参数稀疏化(部分变0),L2让参数均匀变小。 • 交叉熵损失公式:-Σ(真实值×log预测值),衡量预测概率分布多不准。 • Adam优化器优点:自适应学习率,兼顾动量(惯性)和梯度平方历史。
面试技巧:
- 举例比公式更重要(如用房价预测解释线性回归)。
- 关联实际应用(如“抖音推荐用协同过滤”)。
- 突出对比思维(如SVM核函数 vs 逻辑回归)。
整理自三篇文档核心内容,覆盖机器学习、深度学习、目标检测高频考点,祝复试顺利! 🚀

Comments NOTHING