当前位置: 首页 > news >正文

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

前言

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

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

下面的代码均可以在此找到。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 shutildef 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 1for i in range(nums_file):file_extension = Path(file_list[i]).suffix if file_ext is None else file_extnew_file_name = f"{start_index}{file_extension}"start_index += 1new_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, 避免出错, 确定没问题后改为Falsepreview = 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_makedirsdef 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 1for i in range(nums_file):file_extension = Path(file_list[i]).suffix if file_ext is None else file_extnew_file_name = f"{start_index}{file_extension}"start_index += 1new_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, 避免出错, 确定没问题后改为Falsepreview=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.pngclear 是按照我们的目标格式来的
"""
# 先修改 ./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 randomdef 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_filesdef 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_8file_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_numstest_nums = 0else: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 = 1for 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 += 1for 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 += 1else: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 += 1if __name__=="__main__":def rename_ITS_v2_hazy() :# 建议先进行预览 True, 避免出错, 确定没问题后改为Falsepreview=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, 避免出错, 确定没问题后改为Falsepreview = False# 训练集比例train_ratio = 0.7# 验证集比例,剩下的就是测试集比例,如果train_ratio + val_ratio = 1. ,则不划分测试集val_ratio = 0.2# 是否打乱数据集划分顺序shuffle = Trueoriginal_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, SearchFileNamedef 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_extimage_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到10new_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, 避免出错, 确定没问题后改为Falsepreview = Falseoriginal_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, SearchFileNamedef 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 1for i in range(nums_file):file_extension = Path(file_name_list[i]).suffix if file_ext is None else file_extimage_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 += 1if __name__=="__main__":# 建议先进行预览 True, 避免出错, 确定没问题后改为Falsepreview = Falsetarget_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, SearchFileNamedef 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 1for 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_extimage_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 += 1def 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 1for i in range(nums_file):file_extension=Path(file_name_list[i]).suffix if file_ext is None else file_extoriginal_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+=35if __name__=="__main__":def process_hazy():preview = Truefile_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 = Falsefile_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()

 后面还有再更。

相关文章:

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

前言 目前&#xff0c;因为要做对比实验&#xff0c;收集了一下去雾数据集&#xff0c;并且建立了一个数据集的预处理工程。 这是以前我写的一个小仓库&#xff0c;我决定还是把它用起来&#xff0c;下面将展示下载的路径和数据处理的方法。 下面的代码均可以在此找到。Auo…...

Vue3数据响应式原理

什么是数据响应式 当数据变化时&#xff0c;引用数据的函数&#xff08;副作用函数&#xff09;自动重新执行。 即数据触发了函数的响应&#xff0c;如&#xff1a;视图渲染中使用了某数据&#xff0c;数据改变后&#xff0c;视图跟着自动更新。 触发者&#xff1a;数据 响应者…...

5.最长回文子串--力扣

给你一个字符串 s&#xff0c;找到 s 中最长的 回文子串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同样是符合题意的答案。 示例 2&#xff1a; 输入&#xff1a;s “cbbd” 输出&#xff1a;“bb” 原题如上&…...

ChatGPT大模型极简应用开发-CH1-初识 GPT-4 和 ChatGPT

文章目录 1.1 LLM 概述1.1.1 语言模型和NLP基础1.1.2 Transformer及在LLM中的作用1.1.3 解密 GPT 模型的标记化和预测步骤 1.2 GPT 模型简史&#xff1a;从 GPT-1 到 GPT-41.2.1 GPT11.2.2 GPT21.2.3 GPT-31.2.4 从 GPT-3 到 InstructGPT1.2.5 GPT-3.5、Codex 和 ChatGPT1.2.6 …...

python学opencv|读取图像(三十九 )阈值处理Otsu方法

【1】引言 前序学习了5种阈值处理方法&#xff0c;包括(反)阈值处理、(反)零值处理和截断处理&#xff0c;还学习了一种自适应处理方法&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;三十三&#xff09;阈值处理-灰度图像-CSDN博客 python学o…...

统信V20 1070e X86系统编译安装mysql-5.7.44版本以及主从构建

设备信息 操作系统版本架构CPU内存备注统信UOS V20 1070eX864C8G此配置仅做编译安装验证&#xff0c;持续运行或数据量增长大请自行评估资源配置。统信UOS V20 1070eX864C8G 资源包 该包包含mysql-5.7.44源码包、boost资源包、统信编译mysql-5.7.44安装包 通过网盘分享的文件…...

麒麟LINUX V10SP3 2401安装ORACLE 12.2.1 runInstaller直接报UNZIP格式不对

好久没有安装ORACLE了&#xff0c;一般都是RHEL上安装得比较多&#xff0c;这不&#xff0c;现在大家都是选择国产操作系统来安装数据库了&#xff0c;以前在龙蜥&#xff0c;欧拉&#xff0c;麒麟上也安装过&#xff0c;都没有问题&#xff0c;想来在麒麟LINUX v10sp3 2401上面…...

10 为什么系统需要引入分布式、微服务架构

java技术的发展 在java开始流行起来之后&#xff0c;主要服务于企业家应用&#xff0c;例如ERP,CRM等等&#xff0c;这些项目是为企业内部员工使用&#xff0c;我们的思维是怎么用设计模式&#xff0c;如何封装代码。让开发人员关注到业务上去&#xff0c;系统也就那么几十几百…...

【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)

目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显&#xff0c;发现可以打SSTI 本地起一个服务&#xff0c;折半查找fuzz黑名单&#xff0c;不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…...

openharmony应用开发快速入门

开发准备 本文档适用于OpenHarmony应用开发的初学者。通过构建一个简单的具有页面跳转/返回功能的应用&#xff08;如下图所示&#xff09;&#xff0c;快速了解工程目录的主要文件&#xff0c;熟悉OpenHarmony应用开发流程。 在开始之前&#xff0c;您需要了解有关OpenHarmon…...

解决npm install安装出现packages are looking for funding run `npm fund` for details问题

当我们运行npm install时&#xff0c;可能会收到类似以下的提示信息&#xff1a;“x packages are looking for funding.” 这并不是错误提示&#xff0c;也不会影响项目的正常运行。其实实在提醒有一些软件包正在寻求资金支持。 根据提示输入npm fund可以查看详细的信息&#…...

python助力WRF自动化运行

对大部分人而言&#xff0c;特别是新用户&#xff0c;WRF模式的安装繁琐且不必要&#xff0c;可以作为后续进阶掌握的技能&#xff0c;本学习跳过繁琐的安装步骤&#xff0c;直接聚焦模式的运行部分&#xff0c;通过短平快的教学&#xff0c;快速掌握模式运行。进一步将python语…...

Go-知识 版本演进

Go-知识 版本演进 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具语言包工具小修订 r58(2011/06/29)语言包工具小修订 r59(2011/08/01)语言包工具 r60(2011/09/07)语言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…...

企业级NoSQL数据库Redis

1.浏览器缓存过期机制 1.1 最后修改时间 last-modified 浏览器缓存机制是优化网页加载速度和减少服务器负载的重要手段。以下是关于浏览器缓存过期机制、Last-Modified 和 ETag 的详细讲解&#xff1a; 一、Last-Modified 头部 定义&#xff1a;Last-Modified 表示服务器上资源…...

Android渲染Latex公式的开源框架比较

对比主流框架&#xff0c;介绍如下几款 1、AndroidMath 官网&#xff1a;https://github.com/gregcockroft/AndroidMath/tree/master 基于android原生view方式渲染 优点&#xff1a;速度快&#xff0c;开源协议 MIT license 缺点&#xff1a;不支持文字公式混合渲染 2、Ma…...

ARM学习(42)CortexM3/M4 MPU配置

笔者之前学习过CortexR5的MPU配置,现在学习一下CortexM3/M4 MPU配置 1、背景介绍 笔者在工作中遇到NXP MPU在访问异常地址时,就会出现总线挂死,所以需要MPU抓住异常,就需要配置MPU。具体背景情况可以参考ARM学习(41)NXP MCU总线挂死,CPU could not be halted以及无法连…...

Sam Altman亲自确认:o3-mini即将上线!GPT和o系列模型合并!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…...

数据结构-队列

目录 前言一、队列及其抽象数据类型1.1 队列的基本概念1.2 队列的抽象数据类型 二、队列的实现2.1 顺序表示2.1.1 结构定义2.1.2 基本操作的实现 2.2 链式表示2.2.1 结构定义2.2.2 基本操作的实现 总结 前言 本篇文章介绍队列的基础知识&#xff0c;包括队列的抽象数据类型以及…...

Go Map 源码分析(一)

Go语言中的map是通过哈希表实现的&#xff0c;其底层结构和实现机制如下&#xff1a; 一、hash 结构 hmap结构体&#xff1a;是map的头部结构&#xff0c;主要字段及含义如下&#xff1a; count&#xff1a;表示当前哈希表中的元素数量&#xff0c;与len()函数相对应。flags…...

天机学堂5-XxlJobRedis

文章目录 梳理前面的实现&#xff1a;Feign点赞改进 day07-积分系统bitmap相关命令签到增加签到记录计算本月已连续签到的天数查询签到记录 积分表设计签到-->发送RabbitMQ消息&#xff0c;保存积分对应的消费者&#xff1a;**消费消息 用于保存积分**增加积分查询个人今日积…...

SpringBoot整合junit

SpringBoot 整合 junit 特别简单&#xff0c;分为以下三步完成: 1在测试类上添加 SpringBootTest 注解2使用 Autowired 注入要测试的资源3定义测试方法进行测试 1.实验准备&#xff1a; 创建一个名为 springboot_junit_test 的 SpringBoot 工程&#xff0c;工程目录结构如下…...

Jenkins-pipeline Jenkinsfile说明

一. 简介&#xff1a; Jenkinsfile 是一个文本文件&#xff0c;通常保存在项目的源代码仓库中&#xff0c;用于定义 Jenkins Pipeline 的行为。使用 Jenkinsfile 可以使 CI/CD 流程版本化&#xff0c;并且易于共享和审核。 二. 关于jenkinsfile&#xff1a; jenkins的pipeline…...

SpringMVC 实战指南:打造高效 Web 应用的秘籍

第一章&#xff1a;三层架构和MVC 三层架构&#xff1a; 开发服务器端&#xff0c;一般基于两种形式&#xff0c;一种 C/S 架构程序&#xff0c;一种 B/S 架构程序使用 Java 语言基本上都是开发 B/S 架构的程序&#xff0c;B/S 架构又分成了三层架构三层架构&#xff1a; 表现…...

结合帧级边界检测和深度伪造检测,定位部分伪造音频攻击中的篡改区域

Integrating frame-level boundary detection and deepfake detection for locating manipulated regions in partially spoofed audio forgery 摘要&#xff1a; 部分伪造音频是一种深度伪造的变体&#xff0c;它通过引入伪造或外部来源的善意音频片段来操纵音频语句&#xf…...

人工智能之深度学习_[2]-PyTorch入门

文章目录 PyTorch1.PyTorch简介1.1 什么是PyTorch1.2 PyTorch特点1.3 PyTorch发展历史 2 张量创建2.1 什么是张量2.2 基本创建方式2.3 线性和随机张量2.4 0、1、指定值张量2.5 指定元素类型张量 3 张量类型转换3.1 张量转换为NumPy数组3.2 NumPy数组转换为张量3.3 提取标量张量…...

vue2与vue3的区别

目录 1. 性能 2. 组合式 API 3. 生命周期钩子 4. 片段&#xff08;Fragments&#xff09; 5. 递归组件 6. 自定义渲染器 7. 全局 API 8. 组件内部的 this 9. 模板语法 10. 兼容性 总结 Vue 2 和 Vue 3 是 Vue.js 框架的两个主要版本&#xff0c;它们在多个方面有所不…...

八股学习 Mysql

八股学习 Mysql 常见面试问题优化其他 定位慢查询方案一&#xff1a;开源工具方案二&#xff1a;MySQL自带慢日志 SQL执行计划示例场景名词解释 索引概念底层数据结构聚簇索引、二级索引&#xff08;非聚簇索引&#xff09;覆盖索引覆盖索引应用场景创建原则索引失效 SQL优化表…...

主从复制

简述mysql 主从复制原理及其工作过程&#xff0c;配置一主两从并验证。 主从原理&#xff1a;MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二…...

服务器数据恢复—Zfs文件系统数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台zfs文件系统的服务器&#xff0c;管理员误操作删除了服务器上的数据。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有硬盘做好标记后取出&#xff0c;硬件工程师检测后没有发现有硬盘存在硬件故障。以只读方式将所有硬盘…...

Linux安装docker,安装配置xrdp远程桌面

Linux安装docker&#xff0c;安装配置xrdp远程桌面。 1、卸载旧版本docker 卸载旧版本docker命令 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine现在就是没有旧版本的d…...

Windows11电脑总是一闪一闪的,黑一下亮一些怎么解决

Windows11电脑总是一闪一闪的&#xff0c;黑一下亮一些怎么解决 1. 打开设备管理器2. 点击显示适配器3. 更新下方两个选项的驱动3.1 更新驱动Inter(R) UHD Graphixs3.2 更新驱动NVIDIA GeForce RTX 4060 Laptop GPU 4. 其他文章快来试试吧&#x1f970; 1. 打开设备管理器 在电…...

Low-Level 大一统:如何使用Diffusion Models完成视频超分、去雨、去雾、降噪等所有Low-Level 任务?

Diffusion Models专栏文章汇总:入门与实战 前言:视频在传输过程中常常因为各种因素(如恶劣天气、噪声、压缩和传感器分辨率限制)而出现质量下降,这会严重影响计算机视觉任务(如目标检测和视频监控)的性能。现有的视频修复方法虽然取得了一些进展,但通常只能针对特定的退…...

使用 Blazor 和 Elsa Workflows 作为引擎的工作流系统开发

开发一个完整的工作流系统使用 Blazor 和 Elsa Workflows 作为引擎&#xff0c;可以实现一个功能强大的工作流管理和设计系统。下面将提供详细的步骤和代码实现&#xff0c;展示如何在 Blazor 中开发一个基于 Elsa Workflows 的工作流系统。 项目概述 我们的工作流系统将包含以…...

调试Hadoop源代码

个人博客地址&#xff1a;调试Hadoop源代码 | 一张假钞的真实世界 Hadoop版本 Hadoop 2.7.3 调试模式下启动Hadoop NameNode 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中设置NameNode启动的JVM参数&#xff0c;如下&#xff1a; export HADOOP_NAMENODE_OPTS"-Xdeb…...

mkv转码mp4(ffmpeg工具)

基于windows&#xff0c;Linux也可以用&#xff0c;都是命令行 下载路径&#xff08;https://github.com/BtbN/FFmpeg-Builds/releases&#xff09; 下载安装包&#xff1a;ffmpeg-n6.1-latest-win64-lgpl-6.1.zip&#xff0c;&#xff08;根据自己的平台选择下载&#xff09;并…...

前端项目搭建和基础配置

这个模块主要是介绍从零开始搭建项目的一些操作&#xff0c;包含一些前端常用的配置&#xff0c;这里只是一部分&#xff0c;会在后续的文章中逐步进行补充和完善 一、创建项目 在项目路径下使用以下命令生成前后端项目 npm create vite输入项目名称&#xff0c;框架选择Vue…...

计算机网络 (49)网络安全问题概述

前言 计算机网络安全问题是一个复杂且多维的领域&#xff0c;它涉及到网络系统的硬件、软件以及数据的安全保护&#xff0c;确保这些元素不因偶然的或恶意的原因而遭到破坏、更改或泄露。 一、计算机网络安全的定义 计算机网络安全是指利用网络管理控制和技术措施&#xff0c;保…...

【Qt】02-信号与槽函数

发生的原因与事件 前言一、什么是信号与槽&#xff08;Signals and Slots&#xff09;&#xff1f;1.1 信号&#xff08;Signals&#xff09;1.2 槽&#xff08;Slots&#xff09;1.3 连接方式 二、调用基本的信号与槽函数2.1 代码分析connect()的用法 2.2 结果展示 三、自定义…...

CVPR 2024 机器学习方向总汇(多任务、联邦学习、迁移学习和对抗等)

1、Machine Learning(机器学习)多任务、联邦学习、迁移学习和对抗等 Molecular Data Programming: Towards Molecule Pseudo-labeling with Systematic Weak Supervision &#x1f44d;摘要Improving Physics-Augmented Continuum Neural Radiance Field-Based Geometry-Agnos…...

spring中bean的循环依赖细节描述

首先&#xff0c;循环依赖不是一件好事&#xff0c;设计上几乎不会这么设计。但是总有时候要碰到一起奇怪的循环依赖。 spring bean循环依赖之所以能实现&#xff0c;也是有条件的&#xff0c;构造函数的依赖显然不行。而bean生命周期的实例化和属性设置是分阶段的&#xff0c…...

LeetCode - #187 Swift 实现重复的DNA序列

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

【gin】gin中使用protbuf消息传输go案例

在 Gin 中使用 Protobuf 进行高效消息传输 Protobuf&#xff08;Protocol Buffers&#xff09;是一种高效的二进制序列化协议&#xff0c;广泛用于高性能场景的数据传输。相比 JSON&#xff0c;Protobuf 具有更小的体积和更快的解析速度&#xff0c;非常适合服务间通信或前后端…...

Vue.js 动态设置表格最大高度的实现

概述 在现代 Web 开发中&#xff0c;响应式设计至关重要&#xff0c;尤其是在处理复杂的布局和数据表格时。表格通常会受到多种因素的影响&#xff0c;如分页、合计行或动态内容&#xff0c;这可能导致表格高度的变化。本文将介绍一个基于 Vue.js 的方法 setMaxHeight&#xf…...

Springboot 注解缓存使用教程

Spring Boot Cache 注解使用教程 Spring Boot 提供了强大的缓存抽象,开发者可以通过注解快速实现缓存功能,从而提高系统性能。本教程将全面介绍 Spring Boot 提供的缓存相关注解及其作用,并结合示例讲解实际应用。 1. 常用缓存注解概览 Spring Boot 缓存提供以下核心注解…...

TCP协议与TCP SYN Flood攻击

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网络安全从菜鸟到飞鸟的逆袭 目录 一&#xff0c; TCP握手二&#xf…...

Cloud Foundry,K8S,Mesos Marathon弹性扩缩容特性对比

一、Cloud Foundry 使用Scaling an Application Using App Autoscaler插件&#xff0c;基于资源使用情况触发简单扩缩容 CPU、内存、Http带宽、延时等 监控这些资源的使用情况决定扩缩容策略&#xff1a;实例是增加还是减少 Instance Limits 限制实例数量范围&#xff0c;定义…...

python轻量级框架-flask

简述 Flask 是 Python 生态圈中一个基于 Python 的Web 框架。其轻量、模块化和易于扩展的特点导致其被广泛使用&#xff0c;适合快速开发 Web 应用以及构建小型到中型项目。它提供了开发 Web 应用最基础的工具和组件。之所以称为微框架&#xff0c;是因为它与一些大型 Web 框架…...

Git实用指南:忽略文件、命令别名、版本控制、撤销修改与标签管理

目录 1.忽略特殊文件 1.1.那如何配置我们需要忽略的文件的呢&#xff1f; 1.2.如何检验效果&#xff1f; 2.给命令配置别名 3.基本操作之版本回退 3.1.使用场景&#xff1a; 3.2.使用方法&#xff1a; 4.撤销修改 情况一&#xff1a;对于工作区的代码&#xff0c;还没…...

神经网络常见面试题

梯度消失和梯度爆炸 1. 梯度消失&#xff08;Vanishing Gradient&#xff09; 定义&#xff1a; 梯度消失是指在反向传播过程中&#xff0c;梯度逐渐变得非常小&#xff0c;导致前面几层的权重更新非常缓慢&#xff0c;甚至几乎不更新&#xff0c;从而影响网络的学习过程。特…...

数据结构漫游记:动态实现栈(stack)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...