今日总结

  • java随笔录——Spring Security介绍,网关的功能,如何在微服务中添加网关
  • AI随探录——恶劣天气下目标检测YOLO算法研究综述
  • 代码随想录——回溯算法的剪枝

目录

今日总结

详细内容

java随笔录

认证和授权模块

Spring Security介绍

网关的功能

如何在微服务中添加网关

AI随探录

                恶劣天气下目标检测YOLO算法研究综述

代码随想录

回溯算法的剪枝


详细内容

java随笔录

认证和授权模块

        用户身份认证即用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问。常见的用户身份认证的表现形式有:用户名密码登录,微信扫码等方式。

        用户认证通过后去访问系统的资源,系统会判断用户是否拥有访问资源的权限,只允许访问有权限的系统资源,没有权限的资源将无法访问,这个过程叫用户授权。

单点登录:用户只需要认证一次便可以在多个拥有访问权限的系统中访问,这个功能叫做单点登录。

Spring Security介绍

        Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,它是一个专注于为 Java 应用程序提供身份验证和授权的框架。与其类似的还有Apache Shiro、CAS(更侧重于单点登录)等。

注入的依赖如下

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

对登录进行安全配置,需要用户信息,密码方式和安全拦截机制信息。

package com.xuecheng.auth.config;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

/**
 * @author Mr.M
 * @version 1.0
 * @description 安全管理配置
 * @date 2022/9/26 20:53
 */
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


    //配置用户信息服务
    @Bean
    public UserDetailsService userDetailsService() {
        //这里配置用户信息,这里暂时使用这种方式将用户存储在内存中
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());
        manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build());
        return manager;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
//        //密码为明文方式
        return NoOpPasswordEncoder.getInstance();
//        return new BCryptPasswordEncoder();
    }

    //配置安全拦截机制
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/r/**").authenticated()//访问/r开始的请求需要认证通过
                .anyRequest().permitAll()//其它请求全部放行
                .and()
                .formLogin().successForwardUrl("/login-success");//登录成功跳转到/login-success
    }



}

Spring Security所解决的问题就是安全访问控制,而安全访问控制功能其实就是对所有进入系统的请求进行拦截,校验每个请求是否能够访问它所期望的资源。

当初始化Spring Security时,会创建一个名为SpringSecurityFilterChain的Servlet过滤器,类型为 org.springframework.security.web.FilterChainProxy,它实现了javax.servlet.Filter,因此外部的请求会经过此类,下图是Spring Security过虑器链结构图:

FilterChainProxy是一个代理,真正起作用的是FilterChainProxy中SecurityFilterChain所包含的各个Filter,同时这些Filter作为Bean被Spring管理,它们是Spring Security核心,各有各的职责,但他们并不直接处理用户的认证,也不直接处理用户的授权,而是把它们交给了认证管理器(AuthenticationManager)和决策管理器(AccessDecisionManager)进行处理。

spring Security功能的实现主要是由一系列过滤器链相互配合完成。

网关的功能

1.路由转发

2.认证,校验jwt令牌的合法性

3.维护一份白名单

如何在微服务中添加网关

1.添加网关依赖

2.读懂网关的过滤器

3.配置白名单

4.在微服务中放行所有校验

AI随探录

完成了篇综述作业。如下

                恶劣天气下目标检测YOLO算法研究综述

摘要:本文系统分析2022至2023年间恶劣天气目标检测领域的可微分图像处理(DIP)技术演进路径。以Image-Adaptive YOLO为起点,剖析其通过端到端学习实现退化图像增强与检测协同优化的创新范式;进而聚焦GDIP的门控动态路由架构,实现滤波器链的按需激活;最终追踪至DENet提出的检测驱动增强网络,首次建立检测损失对图像增强模块的梯度直传机制。

引言:随着深度学习的发展,以YOLO、Faster R-CNN等为代表的目标检测算法在清晰场景下取得了巨大成功。然而,这些模型在部署于真实世界时,不可避免地会遇到由恶劣天气(如雾、霾、雨)引起的视觉挑战。

因此,提升模型在恶劣天气下的鲁棒性成为一个重要研究方向。早期的工作通常将图像复原(如去雨、去雾)与目标检测视为两个独立的任务,但这种串联方式的次优性问题逐渐暴露:为人类视觉优化的图像复原算法可能并不能最大化后续检测任务的性能。为了解决这一问题,本文所提到的四篇文献 《Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions》《GDIP: Gated Differentiable Image Processing for Object-Detection in Adverse Conditions》《DENet: Detection-driven Enhancement Network for Object Detection under Adverse Weather Conditions》 和 《Detection-Friendly Dehazing: Object Detection in Real-World Hazy Scenes》 

1、早期探索与IA - YOLO的提出(2022)

早期在恶劣天气下进行目标检测时,主要采用两种方法。一种是使用两个子网络联合学习可见性增强和对象检测,但这种方法在训练期间很难调整参数以平衡检测和恢复之间的权重;另一种是通过图像去雾或图像增强来进行预处理,不过这要求复杂的图像恢复网络,同时需要手工标记图像进行恢复,且二者通常忽视了基于天气恢复过程中可以获得的潜在信息。

2022年提出的Image - Adaptive YOLO for Object Detection in Adverse Weather Conditions(IA - YOLO)是一次重要的突破。该算法提出了CNN - PP与YOLOv3主干检测网络联合的方式优化DIP(可微的图像处理模块)的学习。CNN - PP采用弱监督,通过边界框的标注去学习适当的DIP,利用正常和恶劣天气条件下的图像来训练网络。整个通道由CNN参数预测期(CNN - PP)、可微的图像处理模块(DIP)和检测网络组成,采用单阶段检测YOLOV3作为检测网络,基于Resnet思想的darknet - 53架构,通过多尺度训练预测,从而进一步提高检测精度。IA - YOLO巧妙地利用了图像自适应方法,挖掘了天气恢复过程中的潜在信息,为后续研究奠定了基础。

  1. 改进的GDIP算法(2022

在IA - YOLO的基础上,GDIP: Gated Differentiable Image Processing for Object - Detection in Adverse Conditions进一步改进了可微分图像处理模块。GDIP可能通过引入门控机制等方式,对DIP模块进行优化,使其在恶劣天气下的目标检测中能够更灵活地处理图像信息,提高检测性能。它是对IA - YOLO中DIP模块的深化和拓展,沿着图像自适应和可微分处理的思路,不断优化算法以适应恶劣天气的挑战。

3、DENet与DE - YOLO的出现(2023

2023年提出的DENet: Detection - driven Enhancement Network for Object Detection under Adverse Weather Conditions带来了新的思路。该算法提出了一个极其轻量级的增强模型,称为DENet。为了有效和高效地增强,在DENet中应用了基于Laplacian - pyramid的结构。同时,为增强LF分量设计和开发了DEM(细节增强模块),自适应增强细化HF分量。通过级联DENet和yolov3,获得了一种称为DE - YOLO的端到端检测框架,只使用正常的检测损失,不需要高质量的GT图像。与不同类型的SOTA方法相比,所提出的方法提供最可靠的检测结果,同时所需的运行时间非常有限。实验表明DENet避免了繁重的计算,忠实地保留了有利于检测的潜在特征,并且DE - YOLO对在正常条件和恶劣天气条件下拍摄的图像都是有效的。这一算法在保证检测精度的同时,解决了计算资源消耗大的问题,推动了恶劣天气下目标检测算法向更高效的方向发展。

4. 方法比较与分析

文献标题

核心思想

方法类型

主要创新点

Image-Adaptive YOLO

让检测器自身适应退化的图像

模型自适应

在YOLO中引入自适应模块,根据图像质量动态调整网络。

DENet

增强网络由检测任务的性能驱动

端到端增强与检测

提出“检测驱动”的增强理念,通过联合训练使增强服务于检测。

Detection-Friendly Dehazing

去雾算法应保留和增强对检测友好的特征

端到端增强与检测

将“检测驱动”思想应用于去雾,强调了视觉质量与检测性能的差异。

GDIP

设计一个通用的、可学习的图像处理前端模块

端到端增强与检测

提出可微的、带门控机制的图像处理模块,可灵活嵌入现有检测器。

代码随想录

回溯算法的剪枝

剪枝操作在for循环的大小范围进行控制。当集合所剩元素小于所需求的元素个数时,就没必要
在进行循环操作,因此剪枝就是求的最大满足题目要求可以循环的条件。(不会找这个范围,先了解)

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n
class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        combine(n, k , 1);
        return result;
    }   
    void combine(int n, int k, int startindex) {
        if(path.size() == k){
            result.add(new ArrayList<>(path));
            if(startindex > n)
            return;
            return;
        }
        //剪枝操作在for循环的大小范围进行控制。当集合所剩元素小于所需求的元素个数时,就没必要
        //在进行循环操作,因此剪枝就是求的最大满足题目要求可以循环的条件。
        for(int i = startindex; i <= n -(k - path.size()) + 1; i++) {
            path.add(i);
            combine(n,k,i+1);
            path.removeLast();
        }
    }
    }

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐