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

news2025/1/19 12:16:04

前言

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

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

下面的代码均可以在此找到。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()

 后面还有再更。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32入门教程-示例程序(按键控制LED光敏传感器控制蜂鸣器)

1. LED Blink&#xff08;闪烁&#xff09; 代码主体包含&#xff1a;LED.c key.c main.c delay.c&#xff08;延时防按键抖动&#xff09; 程序代码如下&#xff08;涉及RCC与GPIO两个外设&#xff09;&#xff1a; 1.使用RCC使能GPIO时钟 RCC_APB2PeriphClockC…

一本书揭秘程序员如何培养架构思维!

在程序员的职业规划中&#xff0c;成为软件架构师是一个非常有吸引力的选择。但是对于如何才能成为一名架构师&#xff0c;不少同学认为只要代码写得好&#xff0c;就能得到公司提拔&#xff0c;晋升为架构师。 还真不是这样的&#xff0c;如果不具备架构思维&#xff0c;即使…

Flink(十):DataStream API (七) 状态

1. 状态的定义 在 Apache Flink 中&#xff0c;状态&#xff08;State&#xff09; 是指在数据流处理过程中需要持久化和追踪的中间数据&#xff0c;它允许 Flink 在处理事件时保持上下文信息&#xff0c;从而支持复杂的流式计算任务&#xff0c;如聚合、窗口计算、联接等。状…

Vue2+OpenLayers实现点位拖拽功能(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 3.1、初始化变量 3.2、创建一个点 3.3、将点添加到地图上 3.4、实现点位拖拽 3.5、完整代码 四、Gitee源码 一、案例截图 可以随意拖拽点位到你想要的位置 二、安装OpenLayers库 npm install ol 三、代码实现…

2024年博客之星年度评选—创作影响力评审入围名单公布

2024年博客之星活动地址https://www.csdn.net/blogstar2024 TOP 300 榜单排名 用户昵称博客主页 身份 认证 评分 原创 博文 评分 平均 质量分评分 互动数据评分 总分排名三掌柜666三掌柜666-CSDN博客1001002001005001wkd_007wkd_007-CSDN博客1001002001005002栗筝ihttps:/…

NVIDIA发布个人超算利器project digital,标志着ai元年的开启

上图NVIDIA公司创始人兼首席执行官 黄仁勋&#xff08;Jensen Huang&#xff09; 这些年被大家熟知的赛博朋克风格一直都是未来的代言词&#xff0c;可以承载人类记忆的芯片&#xff0c;甚至能独立思考的仿生人&#xff0c;现在&#xff0c;随着NVIDIA的project digital发布之后…

(一)afsim第三方库编译

注意&#xff1a;防止奇怪的问题&#xff0c;源码编译的路径最好不要有中文&#xff0c;请先检查各文件夹名 AFSIM版本 Version&#xff1a; 2.9 Plugin API Version&#xff1a; 11 软件环境 操作系统&#xff1a; Kylin V10 SP1 项目构建工具: cmake-3.26.0-linux-aarch6…

2025.1.17——三、SQLi regexp正则表达式|

题目来源&#xff1a;buuctf [NCTF2019]SQLi1 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;正常注入 step 2&#xff1a;弄清关键字黑名单 1.目录扫描 2.bp爆破 step 3&#xff1a;根据过滤名单构造payload step 4&#xff1a;regexp正则注…

docker的数据卷与dockerfile自定义镜像

docker的数据卷与dockerfile自定义镜像 一. docker的数据卷数据卷容器 二. dockerfile自定义镜像2.1 dockerfile的命令格式镜像的操作命令add和copy的区别 容器启动的命令 2.2 run命令2.3 其它端口映射 三. 练习 一. docker的数据卷 容器于宿主机之间&#xff0c;或者容器和容…

【python_钉钉群发图片】

需求&#xff1a; **在钉钉群发图片&#xff0c;需要以图片的形式展示&#xff0c;如图所示&#xff1a;**但是目前影刀里面没有符合条件的指令 解决方法&#xff1a; 1、在钉钉开发者后台新建一个自建应用&#xff0c;发版&#xff0c;然后获取里面的appkey和appsecret&am…

新星杯-ESP32智能硬件开发--ESP32的I/O组成-系统中断矩阵

本博文内容导读&#x1f4d5;&#x1f389;&#x1f525; ESP32开发板的中断矩阵、功能描述与实现、相关API和示例程序进行介绍 ESP32中断矩阵将任一外部中断源单独分配到每个CPU的任一外部中断上&#xff0c;提供了强大的灵活性&#xff0c;能适应不同的应用需求。 ESP32中断主…

软路由系统iStoreOS 一键安装 docker compose

一键安装命令 大家好&#xff01;今天我来分享一个快速安装 docker-compose 的方法。以下是我常用的命令&#xff0c;当前版本是 V2.32.4。如果你需要最新版本&#xff0c;可以查看获取docker compose最新版本号 部分&#xff0c;获取最新版本号后替换命令中的版本号即可。 w…

CSRF攻击XSS攻击

概述 ​在 HTML 中&#xff0c;<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址&#xff0c;而所谓的跨域请求就是指&#xff1a;当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指…

企业分类相似度筛选实战:基于规则与向量方法的对比分析

文章目录 企业表相似类别筛选实战项目背景介绍效果展示基于规则的效果基于向量相似的效果 说明相关文章推荐 企业表相似类别筛选实战 项目背景 在当下RAG&#xff08;检索增强生成&#xff09;技术应用不断发展的背景下&#xff0c;掌握文本相似算法不仅能够助力信息检索&…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测

角点检测&#xff08;Corner Detection&#xff09;是计算机视觉和图像处理中重要的步骤&#xff0c;主要用于提取图像中的关键特征&#xff0c;以便进行后续的任务&#xff0c;比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…

RC2在线加密工具

RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法&#xff0c;它可作为DES算法的建议替代算法。RC2是一种分组加密算法&#xff0c;RC2的密钥长度可变&#xff0c;可以从8字节到128字节&#xff0c;安全性选择更加灵活。 开发调试上&#xff0c;有时候需要进行对…

玩转大语言模型——使用graphRAG+Ollama构建知识图谱

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用graphRAGOllama构建知识图谱 文章目录 系列文章目录前言下载和安装用下载项目的方式下载并安装用pip方式下载并安装 生成知…

【王树森搜索引擎技术】相关性01:搜索相关性的定义与分档

工业界是怎么做的&#xff1f; 制定标注规则 -> 标注数据 -> 训练模型 -> 线上推理搜索产品和搜索算法团队定义相关性标注规则 认为地将 (q,d) 相关性划分为 4个 或 5个 档位相关性文档规则非常重要&#xff01;假如日后有大幅度变动&#xff0c;需要重新标注数据&am…

学习threejs,使用FlyControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.FlyControls 相机控制…

LabVIEW 程序中的 R6025 错误

R6025错误 通常是 运行时库 错误&#xff0c;特别是与 C 运行时库 相关。这种错误通常会在程序运行时出现&#xff0c;尤其是在使用 C 编译的程序或依赖 C 运行时库的程序时。 ​ 可能的原因&#xff1a; 内存访问冲突&#xff1a; R6025 错误通常是由于程序在运行时访问无效内…