图像去雾数据集的下载和预处理操作

前言

目前,因为要做对比实验,收集了一下去雾数据集,并且建立了一个数据集的预处理工程。

这是以前我写的一个小仓库,我决定还是把它用起来,下面将展示下载的路径和数据处理的方法。 

下面的代码均可以在此找到。Auorui/img-processing-techniques: Used for data set image processing

I-HAZE

下载地址:I-HAZE.zip

具有真实朦胧和无雾霾室内图像的去雾基准,包含 35 对朦胧和相应的无雾(地面实况)室内图像。实际下载下来只有30对。

这属于是一个小的室内数据集,下载之后,文件夹名为:I-HAZY NTIRE 2018, 这里我们手动改为I_HAZY_NTIRE_2018。避免出现路径找不到的问题。

# 下载之后,文件夹名为:I-HAZY NTIRE 2018, 这里我们手动改为I_HAZY_NTIRE_2018
""" https://github.com/Auorui/img-processing-techniques
I_HAZY_NTIRE_2018
        - GT
        - hazy

请注意,在去雾当中我个人习惯使用png格式的图片,如果要保留原来格式的,请注意修改格式是否正确
01_indoor_hazy.jpg -----> 1.png
"""
import os
from pathlib import Path
from natsort import natsorted
import shutil

def multi_makedirs(*args):
    """该函数将会放入在
    https://github.com/Auorui/img-processing-techniques
    下的 utils 文件夹当中, 以后将会多次使用
    为给定的多个路径创建目录, 如果路径不存在, 则创建它
    """
    for path in args:
        if not os.path.exists(path):
            os.makedirs(path)
            
def batch_process_I_HAZY_NTIRE_2018(
    target_path,
    save_path,
    start_index=None,
    file_ext=None,
    preview=True,
):
    file_list = natsorted(os.listdir(target_path))
    nums_file = len(file_list)
    start_index = start_index if start_index is not None else 1
    for i in range(nums_file):
        file_extension = Path(file_list[i]).suffix if file_ext is None else file_ext
        new_file_name = f"{start_index}{file_extension}"
        start_index += 1
        new_file_path = os.path.join(save_path, new_file_name)
        file_path = os.path.join(target_path, file_list[i])
        if not preview:
            shutil.copy(file_path, new_file_path)
        print(f"Copied: {file_path} -> {new_file_path}")

if __name__=="__main__":
    # 建议先进行预览 True, 避免出错, 确定没问题后改为False
    preview = False
    # 起始数字, 如果为None, 默认从 1 开始
    start_index = 1
    # 后缀名, 如果为None, 就使用原来的后缀
    file_ext = '.png'
    # 目标文件夹路径
    target_path = r'F:\dataset\Dehazy\I_HAZY_NTIRE_2018'
    # 防止修改错误, 完成修改之后保存到其他文件夹当中,最后删除原来文件夹,复制到文件夹下(该操作建议手动)
    save_gt_path = r'F:\dataset\Dehazy\I_HAZY_NTIRE_2018\cache\GT'
    save_hazy_path = r'F:\dataset\Dehazy\I_HAZY_NTIRE_2018\cache\hazy'
    
    target_gt_path = os.path.join(target_path, 'GT')
    target_hazy_path = os.path.join(target_path, 'hazy')
    
    # os.makedirs(save_gt_path, exist_ok=True)
    # os.makedirs(save_hazy_path, exist_ok=True)
    multi_makedirs(save_gt_path, save_hazy_path)

    batch_process_I_HAZY_NTIRE_2018(target_gt_path, save_gt_path,
                                    start_index=start_index, file_ext=file_ext, preview=preview)
    batch_process_I_HAZY_NTIRE_2018(target_hazy_path, save_hazy_path,
                                    start_index=start_index,file_ext=file_ext,preview=preview)

O-HAZE

下载地址:O-HAZE

该数据库由成对的真实朦胧和相应的无朦胧图像组成。在实践中,朦胧图像是在真实雾霾存在的情况下由专业雾霾机生成的,O-HAZE 包含 45 个不同的户外场景,描绘了在无雾和雾霾条件下、在相同照明参数下录制的相同视觉内容。

总计共45对,操作方式同I-HAZE相同,只用换个地址就可以了。

Dense_Haze_NTIRE19  

下载地址:Dense_Haze_NTIRE19.zip

一种新的去雾数据集。Dense-Haze 以密集均匀的朦胧场景为特征,包含 33 对真实朦胧和对应的各种户外场景的无雾图像。朦胧场景是通过引入由专业雾霾机生成的真实雾霾来录制的。朦胧和无朦胧的相应场景包含在相同的照明参数下捕获的相同视觉内容。

下载下来实际一共为55对,是一个室外场景,可见度很低的数据集。

# 下载之后,文件夹名为:Dense_Haze_NTIRE19
""" https://github.com/Auorui/img-processing-techniques
Dense_Haze_NTIRE19
	- GT
	- hazy
请注意,在去雾当中我个人习惯使用png格式的图片,如果要保留原来格式的,请注意修改格式是否正确
01_GT.png -----> 1.png
"""
import os
from pathlib import Path
from natsort import natsorted
import shutil
from utils import multi_makedirs


def batch_process_Dense_Haze_NTIRE19(
	target_path,
	save_path,
	start_index=None,
	file_ext=None,
	preview=True,
):
	file_list = natsorted(os.listdir(target_path))
	nums_file = len(file_list)
	start_index = start_index if start_index is not None else 1
	for i in range(nums_file):
		file_extension = Path(file_list[i]).suffix if file_ext is None else file_ext
		new_file_name = f"{start_index}{file_extension}"
		start_index += 1
		new_file_path = os.path.join(save_path,new_file_name)
		file_path = os.path.join(target_path,file_list[i])
		if not preview:
			shutil.copy(file_path, new_file_path)
		print(f"Copied: {file_path} -> {new_file_path}")


if __name__=="__main__" :
	# 建议先进行预览 True, 避免出错, 确定没问题后改为False
	preview=False
	# 起始数字, 如果为None, 默认从 1 开始
	start_index=1
	# 后缀名, 如果为None, 就使用原来的后缀
	file_ext='.png'
	# 目标文件夹路径
	target_path=r'F:\dataset\Dehazy\Dense_Haze_NTIRE19'
	# 防止修改错误, 完成修改之后保存到其他文件夹当中,最后删除原来文件夹,复制到文件夹下(该操作建议手动)
	save_gt_path=r'F:\dataset\Dehazy\Dense_Haze_NTIRE19\cache\GT'
	save_hazy_path=r'F:\dataset\Dehazy\Dense_Haze_NTIRE19\cache\hazy'

	target_gt_path=os.path.join(target_path,'GT')
	target_hazy_path=os.path.join(target_path,'hazy')

	# os.makedirs(save_gt_path, exist_ok=True)
	# os.makedirs(save_hazy_path, exist_ok=True)
	multi_makedirs(save_gt_path,save_hazy_path)

	batch_process_Dense_Haze_NTIRE19(target_gt_path,save_gt_path,
									start_index=start_index,file_ext=file_ext,preview=preview)
	batch_process_Dense_Haze_NTIRE19(target_hazy_path,save_hazy_path,
									start_index=start_index,file_ext=file_ext,preview=preview)

RS-Hazy

下载地址:data - Google Drive(百度云:RS-Hazy)

这是一个带有云雾的遥感图像,因为这部分很早之前就下载下来了,数据处理的部分已经找不到了,因为实在是太大了(40G左右),这里大家就慢慢下载吧。

实际上这个也是合成图像,原理应该还是用的是大气散射模型生成的(没怎么注意看)应该是根据这个遥感的内参生成的(不了解我自己猜测的)。但我其实有一套比他这个更好的生成云雾的方法。

RESIDE-standard

下载地址:李博义 - 对单张图像去雾及其他进行基准测试

RESIDE 突出显示了不同的数据源和图像内容,并分为五个子集,每个子集用于不同的训练或评估目的。

请一定一定注意,如果下方百度云链接打不开,请新开一个网页复制到地址栏再试试。

ITS (Indoor Training Set)

(Dropbox): https://bit.ly/3iwHmh0

(Baidu Yun):http://tinyurl.com/yaohd3yv  Passward: g0s6

建议大家用百度云下载,我挂上Dropbox,但又太大了下载不下来。

这个我发现问题有点多啊,它这个是1399张清晰图像,但又有13990张有雾图像,相当于是每张清晰图像对应了10张模糊图像,但不管是写dataset还是将清晰图像每张复制10份都相当的麻烦。

并且我发现这10张图像的雾度都差不多,所幸就直接随机10抽1。并且由于这里的数量还算充足,我们就划分一下训练验证测试集。

# ITS (Indoor Training Set)
# 下载的时候文件夹名为 ITS_v2
""" https://github.com/Auorui/img-processing-techniques
ITS_v2
    - clear
    - hazy
请注意,在去雾当中我个人习惯使用png格式的图片,如果要保留原来格式的,请注意修改格式是否正确
hazy: 1_1_0.90179.png -----> 1_1.png

clear 是按照我们的目标格式来的
"""
# 先修改 ./ITS_v2/hazy下文件的命名格式, 直接在原有基础上修改
import os
from pathlib import Path
from natsort import natsorted
import shutil
from utils import multi_makedirs
from math import ceil
import random

def SearchFileName(target_path, file_ext='.png'):
    """该函数将会放入在
    https://github.com/Auorui/img-processing-techniques
    下的 utils 文件夹当中, 以后将会多次使用
    仅仅搜索目标文件夹下合适格式的文件名
    """
    all_files = os.listdir(target_path)
    png_files = [file for file in all_files if file.lower().endswith(file_ext)]
    sorted_png_files = natsorted(png_files)
    return sorted_png_files

def batch_process_ITS_v2_hazy(
    target_path,
    file_ext=None,
    preview=True,
):
    file_name_list = SearchFileName(target_path)
    nums_file = len(file_name_list)
    for i in range(nums_file):
        file_extension = Path(file_name_list[i]).suffix if file_ext is None else file_ext
        # 1399_8_0.74031  ----->  1399_8
        file_name_no_suffix = os.path.splitext(file_name_list[i])[0].split('_')
        new_name = file_name_no_suffix[0] + "_" + file_name_no_suffix[1]
        new_file_name = f"{new_name}{file_extension}"
        old_file_path=os.path.join(target_path, file_name_list[i])
        new_file_path=os.path.join(target_path, new_file_name)
        if not preview:
            os.rename(old_file_path, new_file_path)
        print(f"Renamed: {file_name_list[i]} -> {new_file_name}")


def divide_ITS_v2_dataset(
    target_path,
    save_path,
    train_ratio,
    val_ratio,
    shuffle=True,
    preview=True,
) :
    original_gt_path = os.path.join(target_path, 'clear')
    original_hazy_path = os.path.join(target_path, 'hazy')

    save_train_path = os.path.join(save_path, "train")
    save_val_path = os.path.join(save_path, "val")
    save_test_path = os.path.join(save_path, "test")

    train_txt_path = os.path.join(save_path, "train.txt")
    val_txt_path = os.path.join(save_path, "val.txt")
    test_txt_path = os.path.join(save_path, "test.txt")

    multi_makedirs(os.path.join(save_train_path, "GT"), os.path.join(save_train_path, 'hazy'),
                   os.path.join(save_val_path, "GT"), os.path.join(save_val_path, 'hazy'),
                   os.path.join(save_test_path, "GT"), os.path.join(save_test_path, 'hazy'),)

    file_name_list = SearchFileName(original_gt_path)
    if shuffle:
        random.shuffle(file_name_list)

    nums_file = len(file_name_list)

    train_nums = ceil(nums_file * train_ratio)
    if train_ratio + val_ratio == 1.:
        val_nums = nums_file - train_nums
        test_nums = 0
    else:
        val_nums = ceil(nums_file * val_ratio)
        test_nums = nums_file-(train_nums+val_nums)

    print(f"划分数据集数量, 总数{nums_file}, train:{train_nums}, test:{val_nums}, test:{test_nums}")
    total = total1 = total2 = 1
    for i in range(train_nums):
        image_gt_name = file_name_list[i]
        image_hazy_name = f"{image_gt_name.split('.')[0]}_{random.randint(1, 10)}.{image_gt_name.split('.')[1]}"

        a_gt_path = os.path.join(original_gt_path, image_gt_name)
        a_hazy_path = os.path.join(original_hazy_path, image_hazy_name)
        save_new_path_gt = os.path.join(save_train_path, "GT", image_gt_name)
        save_new_path_hazy = os.path.join(save_train_path, "hazy", image_gt_name)

        if not preview:
            shutil.copy(a_gt_path, save_new_path_gt)
            shutil.copy(a_hazy_path, save_new_path_hazy)

            with open(train_txt_path, 'a') as train_txt_file:
                train_txt_file.write(image_gt_name.split('.')[0] +'\n')

        print(f"{total} train: {i + 1}\n"
              f"{a_gt_path} ----> {save_new_path_gt}\n"
              f"{a_hazy_path} ----> {save_new_path_hazy}")
        total += 1

    for i in range(train_nums, nums_file):
        if i < train_nums + val_nums:
            image_gt_name = file_name_list[i]
            image_hazy_name = f"{image_gt_name.split('.')[0]}_{random.randint(1,10)}.{image_gt_name.split('.')[1]}"
            a_gt_path = os.path.join(original_gt_path,image_gt_name)
            a_hazy_path = os.path.join(original_hazy_path,image_hazy_name)
            save_new_path_gt = os.path.join(save_train_path,"GT",image_gt_name)
            save_new_path_hazy = os.path.join(save_train_path,"hazy",image_gt_name)
            if not preview:
                shutil.copy(a_gt_path, save_new_path_gt)
                shutil.copy(a_hazy_path, save_new_path_hazy)

                with open(val_txt_path, 'a') as val_txt_file :
                    val_txt_file.write(image_gt_name.split('.')[0]+'\n')
            print(f"{total} val: {i+1}\n"
                  f"{a_gt_path} ----> {save_new_path_gt}\n"
                  f"{a_hazy_path} ----> {save_new_path_hazy}")
            total1 += 1
        else:
            image_gt_name = file_name_list[i]
            image_hazy_name = f"{image_gt_name.split('.')[0]}_{random.randint(1,10)}.{image_gt_name.split('.')[1]}"
            a_gt_path = os.path.join(original_gt_path,image_gt_name)
            a_hazy_path = os.path.join(original_hazy_path,image_hazy_name)
            save_new_path_gt = os.path.join(save_train_path,"GT",image_gt_name)
            save_new_path_hazy = os.path.join(save_train_path,"hazy",image_gt_name)
            if not preview:
                shutil.copy(a_gt_path, save_new_path_gt)
                shutil.copy(a_hazy_path, save_new_path_hazy)

                with open(test_txt_path, 'a') as test_txt_file :
                    test_txt_file.write(image_gt_name.split('.')[0]+'\n')
            print(f"{total2} test: {i+1}\n"
                  f"{a_gt_path} ----> {save_new_path_gt}\n"
                  f"{a_hazy_path} ----> {save_new_path_hazy}")
            total2 += 1


if __name__=="__main__":

    def rename_ITS_v2_hazy() :
        # 建议先进行预览 True, 避免出错, 确定没问题后改为False
        preview=True
        # 目标文件夹路径
        original_hazy_path=r'F:\dataset\Dehazy\ITS_v2\hazy'
        # 后缀名, 如果为None, 就使用原来的后缀
        file_ext='.png'
        batch_process_ITS_v2_hazy(original_hazy_path,file_ext,preview)

    # 先运行这个代码, 完了之后注释掉, 再运行下面代码, 参数直接在函数内部修改
    # rename_ITS_v2_hazy()

    # 建议先进行预览 True, 避免出错, 确定没问题后改为False
    preview = False
    # 训练集比例
    train_ratio = 0.7
    # 验证集比例,剩下的就是测试集比例,如果train_ratio + val_ratio = 1. ,则不划分测试集
    val_ratio = 0.2
    # 是否打乱数据集划分顺序
    shuffle = True
    original_path = r'F:\dataset\Dehazy\ITS_v2'
    save_path = r'F:\dataset\Dehazy\ITS_v2\cache'
    divide_ITS_v2_dataset(original_path, save_path, train_ratio, val_ratio,
                          shuffle=shuffle, preview=preview)

HSTS(Hybrid Subjective Testing Set)

(Dropbox) https://bit.ly/394pcAm

(Baidu Yun)https://pan.baidu.com/s/1cl1exWnaFXe3T5-Hr7TJIg Passward: vzeq

这个我简单的看了一下,只有十张图片而已,我感觉没必要单独弄,这里可以讲其放到室外场景当中去。

SOTS-indoor

(Dropbox): https://bit.ly/2XZH498

(Baidu Yun): https://pan.baidu.com/share/init?surl=SSVzR058DX5ar5WL5oBTLg Passward: s6tu

这个就又跟上面的十选一是一样的。但因为gt图像只有50张,对应的合成雾图总计500张,所以,这里我们就直接扩充一下(太让人头疼了)。

# SOTS 的 indoor, gt图像50张, hazy图像500张, 跟ITS一样, 一张 gt 对应十张合成 hazy
""" https://github.com/Auorui/img-processing-techniques
SOTS/indoor
    - gt
    - hazy
请注意,在去雾当中我个人习惯使用png格式的图片,如果要保留原来格式的,请注意修改格式是否正确
hazy: 1400.png -----> 1400_1.png、1400_2.png、1400_3.png...
"""
import os
from pathlib import Path
import shutil
from utils import multi_makedirs, SearchFileName

def batch_process_SOTS_indoor(
    target_path,
	save_path,
    file_ext=None,
    preview=True,
):
	file_name_list = SearchFileName(target_path)
	nums_file = len(file_name_list)

	for i in range(nums_file):
		file_extension = Path(file_name_list[i]).suffix if file_ext is None else file_ext
		image_file_name = file_name_list[i]

		original_file_path = os.path.join(target_path, image_file_name)

		for j in range(1, 11):  # 复制10份,从1到10
			new_file_name = f"{file_name_list[i].split('.')[0]}_{j}{file_extension}"
			new_file_path = os.path.join(save_path, new_file_name)

			if not preview:
				shutil.copy2(original_file_path, new_file_path)
			print(f"Copying {original_file_path} to {new_file_path}")



if __name__=="__main__":
	# 后缀名, 如果为None, 就使用原来的后缀
	file_ext = '.png'
	# 建议先进行预览 True, 避免出错, 确定没问题后改为False
	preview = False

	original_path = r'F:\dataset\Dehazy\SOTS\indoor\gt'
	save_path = r'F:\dataset\Dehazy\SOTS\indoor\GT'
	multi_makedirs(save_path)
	batch_process_SOTS_indoor(original_path, save_path, file_ext=file_ext, preview=preview)

SOTS-outdoor

下载地址同上。数据集中清晰图共492张,合成图共500张,合成图中有一些重合的,我一张一张找出来的。所以修正过后共计492对。

""" 数据集中清晰图共492张,合成图共500张,合成图中有一些重合的,我一张一张找出来的。所以修正过后共计492对。
SOTS/indoor
    - GT
    - hazy
"""
import os
from pathlib import Path
import shutil
from utils import multi_makedirs, SearchFileName


def batch_process_SOTS_outdoor(
    target_path,
	save_path,
	start_index=1,
    file_ext=None,
	search='.jpg',
    preview=True,
):
	file_name_list = SearchFileName(target_path, search)
	nums_file = len(file_name_list)
	start_index=start_index if start_index is not None else 1
	for i in range(nums_file):
		file_extension = Path(file_name_list[i]).suffix if file_ext is None else file_ext
		image_file_name = file_name_list[i]
		original_file_path = os.path.join(target_path, image_file_name)
		new_file_name = f"{start_index}{file_extension}"
		new_file_path = os.path.join(save_path, new_file_name)
		if not preview :
			shutil.copy(original_file_path, new_file_path)
		print(f"Copied: {original_file_path} -> {new_file_path}")
		start_index += 1


if __name__=="__main__":
	# 建议先进行预览 True, 避免出错, 确定没问题后改为False
	preview = False

	target_path = r"F:\dataset\Dehazy\SOTS\outdoor"
	save_path = r'F:\dataset\Dehazy\SOTS\outdoor\cache'
	save_gt_path = os.path.join(save_path, 'GT')
	save_hazy_path = os.path.join(save_path, 'hazy')
	multi_makedirs(save_hazy_path, save_gt_path)

	target_gt_path=os.path.join(target_path, 'gt')
	target_hazy_path = os.path.join(target_path, 'hazy')
	batch_process_SOTS_outdoor(target_gt_path, save_gt_path, file_ext='.png',
							   search='.png', preview=preview)
	batch_process_SOTS_outdoor(target_hazy_path, save_hazy_path, file_ext='.png',
							   search='.jpg', preview=preview)

RESIDE-β

下载地址:RESIDE-β

这里面,只有OST可以使用,另外两个一个是下载不下来,一个是没有对比的标准图。所以这里只做了OST。

OTS (Outdoor Training Set)

(Dropbox): https://bit.ly/3k8a0Gf 

(Baidu Yun): https://pan.baidu.com/s/1YMYUp5P6FpX_5b7emjgrvA Passward: w54h

这个更是重量级,一张清晰图对应35张,简直...

还有它hazy文件夹下不是放的全部,分成了4个文件夹,数据清洗真麻烦。

这里我将4个part文件夹都归到了hazy当中,clear每隔35命名一次

# 一张清晰图对应35张, hazy文件夹下不是放的全部,分成了4个part文件夹, 清洗数据很麻烦
"""
OTS_BETA
	- clear
	- hazy
		- part1
		- part2
		- part3
		- part4
4个part文件夹都归到hazy当中, 总计72135, clear每隔三十五进行一次命名, 若是每张扩充到35就太大了,
所以我准备还是将其写到dataset会更好
"""
import os
from pathlib import Path
from natsort import natsorted
import shutil
from utils import multi_makedirs, SearchFileName

def batch_rename_hazy_file(
	target_path,
	save_path,
	start_index=None,
	file_ext=None,
	search='.jpg',
	preview=True,
):
	file_name_list = []
	for i in range(1, 5):
		target_part_path = os.path.join(target_path, f"part{i}")
		file_name_list.append(SearchFileName(target_part_path, search))
	# print(flattened_list, nums_file)
	start_index = start_index if start_index is not None else 1
	for i in range(1, 5):
		target_part_path = os.path.join(target_path, f"part{i}")
		flattened_list = file_name_list[i - 1]
		nums_file = len(flattened_list)
		for j in range(nums_file):
			file_extension = Path(flattened_list[j]).suffix if file_ext is None else file_ext
			image_file_name = flattened_list[j]
			original_file_path = os.path.join(target_part_path, image_file_name)
			new_file_name = f"{start_index}{file_extension}"
			new_file_path = os.path.join(save_path, new_file_name)
			if not preview:
				shutil.copy(original_file_path, new_file_path)
			print(f"Copied: {original_file_path} -> {new_file_path}")
			start_index += 1

def batch_rename_GT_file(
	target_path,
	save_path,
	start_index=None,
	file_ext=None,
	search='.jpg',
	preview=True,
):
	file_name_list = SearchFileName(target_path, search)
	nums_file=len(file_name_list)
	print(nums_file)
	start_index=start_index if start_index is not None else 1
	for i in range(nums_file):
		file_extension=Path(file_name_list[i]).suffix if file_ext is None else file_ext
		original_file_path = os.path.join(target_path, file_name_list[i])
		new_file_name=f"{start_index}{file_extension}"
		new_file_path=os.path.join(save_path, new_file_name)
		if not preview :
			shutil.copy(original_file_path,new_file_path)
		print(f"{i+1} Copied: {original_file_path} -> {new_file_path}")
		start_index+=35

if __name__=="__main__":
	def process_hazy():
		preview = True
		file_ext = '.png'
		search='.jpg'
		target_hazy_path = r'F:\dataset\Dehazy\OTS_BETA\haze'
		save_hazy_path = r'F:\dataset\Dehazy\OTS_BETA\hazy'

		multi_makedirs(save_hazy_path)
		batch_rename_hazy_file(target_hazy_path, save_hazy_path,
							   file_ext=file_ext, search=search, preview=preview)


	def process_GT():
		preview = False
		file_ext = '.png'
		search='.jpg'
		target_gt_path = r'F:\dataset\Dehazy\OTS_BETA\clear'
		save_gt_path = r'F:\dataset\Dehazy\OTS_BETA\GT'

		multi_makedirs(save_gt_path)
		batch_rename_GT_file(target_gt_path, save_gt_path,
							   file_ext=file_ext, search=search, preview=preview)
	# process_hazy()
	process_GT()

 后面还有再更。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956556.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中json的一点理解

一、Java中json字符串与json对象 1、json本质 json是一种数据交换格式。 常说的json格式的字符串 > 发送和接收时都只是一个字符串&#xff0c;它遵循json这种格式。 2、前后端交互传输的json是什么&#xff1f; 前后端交互传输的json都是json字符串 比如&#xff1a;…

React实现拖拽特效

前言 最近&#xff0c;我看到一个工程师的个人网站上&#xff0c;采用了拖拽作品集的互动特效&#xff0c;既有趣又吸引眼球。经过一些研究&#xff0c;我发现其实借助一些现成的套件&#xff0c;就能轻松实现这样的效果。今天就带大家一起看看&#xff0c;如何通过 Framer Mo…

leetcode904-水果成篮

leetcode 904 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(1) 之前发布了一个滑动窗口的题目解答思路&#xff0c;参考博文&#xff1a;长度最小的子数组 本题也是基于滑动窗口的一个扩展题&#xff0c;主要解决方法是利用滑动窗口哈希表 var totalFruit function…

线性代数概述

矩阵与线性代数的关系 矩阵是线性代数的研究对象之一&#xff1a; 矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集合&#xff0c;是线性代数中的核心概念之一。矩阵的定义和性质构成了线性代数中矩阵理论的基础&#xff0c;而矩阵运算则简洁地表示和…

李宏毅机器学习HW1: COVID-19 Cases Prediction

Kaggle数据集和提交链接 特征选择&#xff08;主要修改地方&#xff09; 在sample code的基础上主要修改了Select_feat选择特征函数。 首先&#xff0c;因为数据集中的第一列是id&#xff0c;先在raw_x_train&#xff0c;raw_x_valid&#xff0c;raw_x_test中都去掉这一列。其…

owasp SQL 注入-03 (原理)

1: 先看一下注入界面: 点submit 后&#xff0c;可以看到有语法报错&#xff0c;说明已经起作用了: 报如下的错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 2:…

VD:生成a2l文件

目录 前言Simulink合并地址 ASAP2 editor 前言 我之前的方法都是通过Simulink模型生成代码的过程中顺便就把a2l文件生成出来了&#xff0c;这时的a2l文件还没有地址&#xff0c;所以紧接着会去通过elf文件更新地址&#xff0c;一直以为这是固定的流程和方法&#xff0c;今天无…

Navicat Premium 数据可视化

工作区&#xff0c;数据源以及图表 数据可视化是使用可视化组件&#xff08;例如图表&#xff0c;图形和地图&#xff09;的信息和数据的图形表示。 数据可视化工具提供了一种可访问的方式&#xff0c;用于查看和理解数据中的趋势&#xff0c;异常值和其他模式。 在Navicat中&…

设置 Git 默认推送不需要输入账号和密码【Ubuntu、SSH】

如何设置 Git 默认推送不需要输入账号和密码 在使用 Git 管理代码时&#xff0c;许多开发者会遇到每次推送&#xff08;push&#xff09;或拉取&#xff08;fetch&#xff09;代码时都需要输入 GitHub 或 GitLab 等远程仓库的账号和密码的情况。虽然设置了用户名和电子邮件信息…

TCP Window Full是怎么来的

wireshark查看包时&#xff0c;会看到TCP Window Full&#xff0c;总结下它的特点&#xff1a; 1. Sender会显示 TCP Window Full 2. “Sender已发出&#xff0c;但&#xff0c;Receiver尚未ack的字节”&#xff0c;即Sender的 bytes in flights 3. Sender的 bytes in fligh…

PyTorch框架——基于WebUI:Gradio深度学习ShuffleNetv2神经网络蔬菜图像识别分类系统

第一步&#xff1a;准备数据 蔬菜数据集&#xff0c;英文为Vegetable。 train 目录下有15000 张图片。 共十五种植物的幼苗图片集&#xff0c;分别为classes [Bean, Bitter_Gourd, Bottle_Gourd, Brinjal, Broccoli, Cabbage, Capsicum, Carrot, Cauliflower, Cucumber, Pa…

WPS数据分析000001

目录 一、表格的新建、保存、协作和分享 新建 保存 协作 二、认识WPS表格界面 三、认识WPS表格选项卡 开始选项卡 插入选项卡 页面布局选项卡 公式选项卡 数据选项卡 审阅选项卡 视图选项卡 会员专享选项卡 一、表格的新建、保存、协作和分享 新建 ctrlN------…

网络安全 | 什么是正向代理和反向代理?

关注&#xff1a;CodingTechWork 引言 在现代网络架构中&#xff0c;代理服务器扮演着重要的角色。它们在客户端和服务器之间充当中介&#xff0c;帮助管理、保护和优化数据流。根据代理的工作方向和用途&#xff0c;代理服务器可分为正向代理和反向代理。本文将深入探讨这两种…

某讯一面,感觉问Redis的难度不是很大

前不久&#xff0c;有位朋友去某讯面试&#xff0c;他说被问到了很多关于 Redis 的问题&#xff0c;比如为什么用 Redis 作为 MySQL 的缓存&#xff1f;Redis 中大量 key 集中过期怎么办&#xff1f;如何保证缓存和数据库数据的一致性&#xff1f;我将它们整理出来&#xff0c;…

基于机器学习的用户健康风险分类及预测分析

完整源码项目包获取→点击文章末尾名片&#xff01; 背景描述 在这个日益注重健康与体能的时代&#xff0c;健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息&#xff0c;包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…

TCP TIME-WAIT 状态为什么要坚持 2MSL

经常有人问这个问题&#xff0c;这种问题问我就对了。我准备了下面的一幅时序图来解释这个问题&#xff1a; 简单点说就是两个目的&#xff1a; 正常处理被动关闭方的重传 FIN&#xff1b;确保当前连接的所有报文全部消失。 也就是说&#xff0c;无论任何情况下&#xff0c;…

Ubuntu升级Linux内核教程

本文作者CVE-柠檬i: CVE-柠檬i-CSDN博客 本文使用的方法是dpkg安装&#xff0c;目前版本为5.4.0-204&#xff0c;要升级成5.8.5版本 下载 下载网站&#xff1a;https://kernel.ubuntu.com/mainline/ 在该网站下载deb包&#xff0c;选择自己想要升级的版本&#xff0c;这里是5…

Java算法 数据结构 栈 单调栈实战 模版题 [洛谷-P5788]

目录 题目地址 题目描述 输入输出样例 代码 题目地址 【模板】单调栈 - 洛谷 题目描述 输入输出样例 代码 static void solve() throws Exception {int nsc.nextInt();int[] arrnew int[n1];int[] result new int[n1];for(int i1;i<n1;i) {arr[i]sc.nextInt();}Stack …

web前端1--基础

&#xff08;时隔数月我又来写笔记啦~&#xff09; 1、下载vscode 1、官网下载&#xff1a;Visual Studio Code - Code Editing. Redefined 2、步骤&#xff1a; 1、点击同意 一直下一步 勾一个创建桌面快捷方式 在一直下一步 2、在桌面新建文件夹 拖到vscode图标上 打开v…

Api网关Zuul

网关分类与开放API 开放API (OpenAPI) 企业需要将自身数据、能力等作为开发平台向外开放&#xff0c;通常会以REST的方式向外提供&#xff0c;最好的例子就是淘宝开放平台、腾讯公司的QQ开发平台、微信开放平台。开放API平台必然涉及到客户应用的接入、API权限的管理、调用次数…