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

【扒代码】data.py

数据增强函数 

import torch
from torchvision.transforms import functional as TVFdef tiling_augmentation(img, bboxes, density_map, resize, jitter, tile_size, hflip_p):# 定义一个辅助函数,用于根据给定的概率水平翻转张量def apply_hflip(tensor, apply):return TVF.hflip(tensor) if apply else tensor# 定义一个辅助函数,用于生成平铺的图像或密度图def make_tile(x, num_tiles, hflip, hflip_p, jitter=None):result = list()for j in range(num_tiles):row = list()for k in range(num_tiles):t = jitter(x) if jitter is not None else xif hflip[j, k] < hflip_p:  # 根据给定的概率水平翻转t = apply_hflip(t, True)row.append(t)result.append(torch.cat(row, dim=-1))  # 按列连接return torch.cat(result, dim=-2)  # 按行连接x_tile, y_tile = tile_size  # 获取平铺的尺寸y_target, x_target = resize.size  # 获取目标尺寸num_tiles = max(int(x_tile.ceil()), int(y_tile.ceil()))  # 计算平铺的数量hflip = torch.rand(num_tiles, num_tiles)  # 随机生成水平翻转的决策矩阵# 对图像进行平铺增强img = make_tile(img, num_tiles, hflip, hflip_p, jitter)img = resize(img[..., :int(y_tile*y_target), :int(x_tile*x_target)])# 对密度图进行平铺增强density_map = make_tile(density_map, num_tiles, hflip, hflip_p)density_map = density_map[..., :int(y_tile*y_target), :int(x_tile*x_target)]original_sum = density_map.sum()  # 保存原始密度图的总和density_map = resize(density_map)  # 应用缩放density_map = density_map / density_map.sum() * original_sum  # 归一化并恢复原始总和# 根据第一个平铺的翻转状态调整边界框if hflip[0, 0] < hflip_p:bboxes[:, [0, 2]] = x_target - bboxes[:, [2, 0]]  # 更新边界框的左右边界bboxes = bboxes / torch.tensor([x_tile, y_tile, x_tile, y_tile])  # 调整边界框的大小return img, bboxes, density_map

这段代码定义了一个名为 tiling_augmentation 的函数,它用于对图像、边界框和密度图进行平铺增强处理。平铺增强是一种数据增强技术,通过将图像分割成小块(平铺),对每个小块进行随机变换(如水平翻转、缩放等),然后将它们重新组合,以增加数据集的多样性,提高模型的泛化能力。

功能解释

  • tiling_augmentation 函数接收图像 img、边界框 bboxes、密度图 density_map,以及其他几个参数,包括 resize(缩放函数)、jitter(抖动函数,用于增加图像的多样性)、tile_size(平铺的尺寸),以及 hflip_p(水平翻转的概率)
  • 函数首先定义了两个辅助函数:apply_hflip 用于水平翻转张量,make_tile 用于生成平铺的图像或密度图
  • make_tile 函数通过迭代每个平铺块,应用随机的水平翻转和(如果提供)抖动变换,然后将块按行列连接起来。
  • 图像和密度图使用 make_tile 函数进行增强,然后使用 resize 函数调整大小。
  • 密度图在缩放后进行归一化,以保持对象数量的一致性。
  • 边界框根据平铺的翻转状态进行调整,以确保它们在增强后的图像中保持正确。
  • 函数返回增强后的图像、调整后的边界框和密度图。

整体而言,tiling_augmentation 函数通过平铺增强技术,为图像和相关数据提供了一种有效的数据增强方法,有助于提高模型在面对不同图像变换时的鲁棒性。

FSC147Dataset 类

import os
import json
from PIL import Image
import torch
from torch.utils.data import Dataset
from torchvision import transforms as T
from torchvision.transforms import functional as TVFclass FSC147Dataset(Dataset):def __init__(self, data_path, img_size, split='train', num_objects=3,tiling_p=0.5, zero_shot=False):# 初始化数据集的属性self.split = split  # 数据集的分割类型(训练、验证或测试)self.data_path = data_path  # 数据集的根目录路径self.horizontal_flip_p = 0.5  # 水平翻转的概率self.tiling_p = tiling_p  # 平铺增强的概率self.img_size = img_size  # 图像的尺寸self.resize = T.Resize((img_size, img_size))  # 定义图像的缩放操作self.jitter = T.RandomApply([T.ColorJitter(0.4, 0.4, 0.4, 0.1)], p=0.8)  # 定义颜色抖动增强self.num_objects = num_objects  # 每个图像中对象的数量self.zero_shot = zero_shot  # 是否为零样本学习场景# 加载数据集的分割信息和注释信息with open(os.path.join(self.data_path, 'Train_Test_Val_FSC_147.json'), 'rb') as file:splits = json.load(file)self.image_names = splits[split]with open(os.path.join(self.data_path, 'annotation_FSC147_384.json'), 'rb') as file:self.annotations = json.load(file)def __getitem__(self, idx: int):# 根据索引 idx 获取一个数据样本img = Image.open(os.path.join(self.data_path,'images_384_VarV2',self.image_names[idx])).convert("RGB")  # 加载图像并转换为RGB格式# 根据数据集的分割类型进行不同的预处理if self.split != 'train':img = T.Compose([T.ToTensor(),  # 将图像转换为张量self.resize,  # 缩放图像T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # 标准化])(img)else:img = T.Compose([T.ToTensor(),  # 将图像转换为张量self.resize,  # 缩放图像])(img)# 加载并处理边界框bboxes = torch.tensor(self.annotations[self.image_names[idx]]['box_examples_coordinates'],dtype=torch.float32)[:3, [0, 2], :].reshape(-1, 4)[:self.num_objects, ...]bboxes = bboxes / torch.tensor([w, h, w, h]) * self.img_size# 加载并处理密度图density_map = torch.from_numpy(np.load(os.path.join(self.data_path,'gt_density_map_adaptive_512_512_object_VarV2',os.path.splitext(self.image_names[idx])[0] + '.npy',))).unsqueeze(0)# 如果图像尺寸不是512,则调整密度图的大小if self.img_size != 512:original_sum = density_map.sum()density_map = self.resize(density_map)density_map = density_map / density_map.sum() * original_sum# 数据增强tiled = Falseif self.split == 'train' and torch.rand(1) < self.tiling_p:tiled = Truetile_size = (torch.rand(1) + 1, torch.rand(1) + 1)img, bboxes, density_map = tiling_augmentation(img, bboxes, density_map, self.resize,self.jitter, tile_size, self.horizontal_flip_p)# 如果是训练集且没有进行平铺增强,则应用颜色抖动if self.split == 'train':if not tiled:img = self.jitter(img)img = T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])(img)# 如果是训练集且没有进行平铺增强且随机数小于水平翻转概率,则水平翻转图像if self.split == 'train' and not tiled and torch.rand(1) < self.horizontal_flip_p:img = TVF.hflip(img)density_map = TVF.hflip(density_map)bboxes[:, [0, 2]] = self.img_size - bboxes[:, [2, 0]]return img, bboxes, density_mapdef __len__(self):# 返回数据集中样本的数量return len(self.image_names)

功能解释

  • FSC147Dataset 类用于创建一个可以用于 PyTorch 数据加载器的对象,它加载 FSC-147 数据集中的图像、边界框和密度图,并可以对它们进行预处理和增强
  • 在初始化方法 __init__ 中,加载了数据集的分割信息和注释信息,并设置了图像的预处理和增强操作。
  • __getitem__ 方法根据索引 idx 加载并返回一个数据样本,包括图像、边界框和密度图。根据数据集的分割类型,应用了不同的预处理操作。对于训练集,还应用了平铺增强和颜色抖动等数据增强技术。
  • tiling_augmentation 函数用于执行平铺增强,它将图像分割成小块,对每个小块进行随机变换,然后重新组合。
  • Normalize 用于将图像的像素值标准化,以便于神经网络处理。
  • ColorJitter 用于颜色抖动增强,它可以随机改变图像的亮度、对比度、饱和度和色调
  • RandomApply 用于以一定概率应用变换序列。
  • __len__ 方法返回数据集中样本的数量,它被用于 PyTorch 数据加载器来确定迭代次数。

整体而言,FSC147Dataset 类提供了一个灵活的方式来加载和处理 FSC-147 数据集,支持多种预处理和数据增强技术,有助于提高模型的性能和泛化能力。

generate_density_maps

这段代码定义了一个名为 generate_density_maps 的函数,它用于生成密度图,这些密度图可以用于对象计数任务。此外,代码中还包含了一个命令行参数解析器,用于指定数据路径和图像尺寸。

import os
import torch
import numpy as np
from PIL import Image
from torchvision import transforms as T
from torchvision.ops import box_convert
from scipy.ndimage import gaussian_filter
from tqdm import tqdm
import argparsedef generate_density_maps(data_path, target_size=(512, 512)):# 计算密度图的保存路径density_map_path = os.path.join(data_path,f'gt_density_map_adaptive_{target_size[0]}_{target_size[1]}_object_VarV2')# 如果路径不存在,则创建目录if not os.path.isdir(density_map_path):os.makedirs(density_map_path)# 加载注释信息with open(os.path.join(data_path, 'annotation_FSC147_384.json'), 'rb') as file:annotations = json.load(file)# 设置设备为GPU或CPUdevice = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')# 遍历注释中的所有图像for i, (image_name, ann) in enumerate(tqdm(annotations.items())):# 加载图像并获取高度和宽度img = Image.open(os.path.join(data_path,'images_384_VarV2',image_name))_, h, w = T.ToTensor()(img).size()# 计算缩放比例h_ratio, w_ratio = target_size[0] / h, target_size[1] / w# 调整点的坐标points = (torch.tensor(ann['points'], device=device) *torch.tensor([w_ratio, h_ratio], device=device)).long()# 限制点的坐标在目标尺寸内points[:, 0] = points[:, 0].clip(0, target_size[1] - 1)points[:, 1] = points[:, 1].clip(0, target_size[0] - 1)# 调整边界框的坐标bboxes = box_convert(torch.tensor(ann['box_examples_coordinates'],dtype=torch.float32,device=device)[:3, [0, 2], :].reshape(-1, 4), in_fmt='xyxy', out_fmt='xywh')bboxes = bboxes * torch.tensor([w_ratio, h_ratio, w_ratio, h_ratio], device=device)# 计算窗口大小window_size = bboxes.mean(dim=0)[2:].cpu().numpy()[::-1]# 初始化密度图dmap = torch.zeros(*target_size)# 根据点的坐标在密度图中增加计数for p in range(points.size(0)):dmap[points[p, 1], points[p, 0]] += 1# 应用高斯滤波器平滑密度图dmap = gaussian_filter(dmap.cpu().numpy(), window_size / 8)# 保存密度图np.save(os.path.join(density_map_path, os.path.splitext(image_name)[0] + '.npy'), dmap)if __name__ == '__main__':# 创建命令行参数解析器parser = argparse.ArgumentParser("Density map generator", add_help=False)parser.add_argument('--data_path',default='/home/nikola/master-thesis/data/fsc147/',type=str)parser.add_argument('--image_size', default=512, type=int)# 解析命令行参数args = parser.parse_args()# 调用函数生成密度图generate_density_maps(args.data_path, (args.image_size, args.image_size))

功能解释

  • generate_density_maps 函数接收数据路径和目标尺寸作为参数,用于生成和保存密度图。
  • 首先,它计算密度图的保存路径,并创建必要的目录。
  • 然后,它加载注释信息,并遍历每张图像及其注释。
  • 对于每张图像,它调整点和边界框的坐标,以适应目标尺寸。
  • 使用 box_convert 函数将边界框的格式从 xyxy 转换为 xywh
  • 根据点的坐标在密度图中增加计数,并应用高斯滤波器进行平滑处理。
  • 最后,它将生成的密度图保存为 .npy 文件。

if __name__ == '__main__': 部分,代码使用 argparse 库处理命令行参数,允许用户指定数据路径和图像尺寸。然后调用 generate_density_maps 函数执行密度图的生成。

整体而言,这段代码提供了一个自动化的工具,用于生成和保存密度图,这些密度图可以用于训练和评估对象计数模型。通过调整点和边界框的坐标以及应用高斯滤波器,生成的密度图为模型提供了丰富的空间信息,有助于提高计数任务的性能。

完整代码

import os
import json
import argparsefrom PIL import Image
import numpy as np
from scipy.ndimage import gaussian_filterimport torch
from torch.utils.data import Dataset
from torchvision.ops import box_convert
from torchvision import transforms as T
from torchvision.transforms import functional as TVFfrom tqdm import tqdmdef tiling_augmentation(img, bboxes, density_map, resize, jitter, tile_size, hflip_p):# 定义一个辅助函数,用于根据给定的概率水平翻转张量def apply_hflip(tensor, apply):return TVF.hflip(tensor) if apply else tensor# 定义一个辅助函数,用于生成平铺的图像或密度图def make_tile(x, num_tiles, hflip, hflip_p, jitter=None):result = list()for j in range(num_tiles):row = list()for k in range(num_tiles):t = jitter(x) if jitter is not None else xif hflip[j, k] < hflip_p:# 根据给定的概率水平翻转t = TVF.hflip(t)row.append(t)result.append(torch.cat(row, dim=-1))# 按列连接return torch.cat(result, dim=-2)# 按行连接x_tile, y_tile = tile_size# 获取平铺的尺寸y_target, x_target = resize.size# 获取目标尺寸num_tiles = max(int(x_tile.ceil()), int(y_tile.ceil()))# 计算平铺的数量# whether to horizontally flip each tilehflip = torch.rand(num_tiles, num_tiles)# 随机生成水平翻转的决策矩阵img = make_tile(img, num_tiles, hflip, hflip_p, jitter)# 对图像进行平铺增强img = resize(img[..., :int(y_tile*y_target), :int(x_tile*x_target)])density_map = make_tile(density_map, num_tiles, hflip, hflip_p)# 对密度图进行平铺增强density_map = density_map[..., :int(y_tile*y_target), :int(x_tile*x_target)]original_sum = density_map.sum()# 保存原始密度图的总和density_map = resize(density_map)# 应用缩放density_map = density_map / density_map.sum() * original_sum# 归一化并恢复原始总和# 根据第一个平铺的翻转状态调整边界框if hflip[0, 0] < hflip_p:# 更新边界框的左右边界bboxes[:, [0, 2]] = x_target - bboxes[:, [2, 0]]  # TODO change# 调整边界框的大小bboxes = bboxes / torch.tensor([x_tile, y_tile, x_tile, y_tile])return img, bboxes, density_mapclass FSC147Dataset(Dataset):def __init__(self, data_path, img_size, split='train', num_objects=3,tiling_p=0.5, zero_shot=False):# 初始化数据集的属性self.split = split  # 数据集的分割类型(训练、验证或测试)self.data_path = data_path  # 数据集的根目录路径self.horizontal_flip_p = 0.5    # 水平翻转的概率self.tiling_p = tiling_p    # 平铺增强的概率 self.img_size = img_size    # 图像的尺寸self.resize = T.Resize((img_size, img_size))    # 定义图像的缩放操作self.jitter = T.RandomApply([T.ColorJitter(0.4, 0.4, 0.4, 0.1)], p=0.8) # 定义颜色抖动增强self.num_objects = num_objects  # 每个图像中对象的数量self.zero_shot = zero_shot  # 是否为零样本学习场景# 加载数据集的分割信息和注释信息with open(os.path.join(self.data_path, 'Train_Test_Val_FSC_147.json'), 'rb') as file:splits = json.load(file)self.image_names = splits[split]with open(os.path.join(self.data_path, 'annotation_FSC147_384.json'), 'rb') as file:self.annotations = json.load(file)def __getitem__(self, idx: int):# 根据索引 idx 获取一个数据样本# 加载图像并转换为RGB格式img = Image.open(os.path.join(self.data_path,'images_384_VarV2',self.image_names[idx])).convert("RGB")w, h = img.size# 根据数据集的分割类型进行不同的预处理if self.split != 'train':img = T.Compose([T.ToTensor(),   # 将图像转换为张量self.resize,    # 缩放图像# 标准化T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])(img)else:img = T.Compose([T.ToTensor(),   # 将图像转换为张量self.resize,    # 缩放图像])(img)# 加载并处理边界框bboxes = torch.tensor(self.annotations[self.image_names[idx]]['box_examples_coordinates'],dtype=torch.float32)[:3, [0, 2], :].reshape(-1, 4)[:self.num_objects, ...]bboxes = bboxes / torch.tensor([w, h, w, h]) * self.img_size# 加载并处理密度图density_map = torch.from_numpy(np.load(os.path.join(self.data_path,'gt_density_map_adaptive_512_512_object_VarV2',os.path.splitext(self.image_names[idx])[0] + '.npy',))).unsqueeze(0)# 如果图像尺寸不是512,则调整密度图的大小if self.img_size != 512:original_sum = density_map.sum()density_map = self.resize(density_map)density_map = density_map / density_map.sum() * original_sum# data augmentation  数据增强tiled = Falseif self.split == 'train' and torch.rand(1) < self.tiling_p:tiled = Truetile_size = (torch.rand(1) + 1, torch.rand(1) + 1)img, bboxes, density_map = tiling_augmentation(img, bboxes, density_map, self.resize,self.jitter, tile_size, self.horizontal_flip_p)# 如果是训练集且没有进行平铺增强,则应用颜色抖动if self.split == 'train':if not tiled:img = self.jitter(img)img = T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])(img)# 如果是训练集且没有进行平铺增强且随机数小于水平翻转概率,则水平翻转图像if self.split == 'train' and not tiled and torch.rand(1) < self.horizontal_flip_p:img = TVF.hflip(img)density_map = TVF.hflip(density_map)bboxes[:, [0, 2]] = self.img_size - bboxes[:, [2, 0]]return img, bboxes, density_mapdef __len__(self):# 返回数据集中样本的数量return len(self.image_names)def generate_density_maps(data_path, target_size=(512, 512)):# 计算密度图的保存路径density_map_path = os.path.join(data_path,f'gt_density_map_adaptive_{target_size[0]}_{target_size[1]}_object_VarV2')# 如果路径不存在,则创建目录if not os.path.isdir(density_map_path):os.makedirs(density_map_path)# 加载注释信息with open(os.path.join(data_path, 'annotation_FSC147_384.json'), 'rb') as file:annotations = json.load(file)# 设置设备为GPU或CPUdevice = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')# 遍历注释中的所有图像# 加载图像并获取高度和宽度for i, (image_name, ann) in enumerate(tqdm(annotations.items())):_, h, w = T.ToTensor()(Image.open(os.path.join(data_path,'images_384_VarV2',image_name))).size()# 计算缩放比例h_ratio, w_ratio = target_size[0] / h, target_size[1] / w# 调整点的坐标points = (torch.tensor(ann['points'], device=device) *torch.tensor([w_ratio, h_ratio], device=device)).long()# 限制点的坐标在目标尺寸内points[:, 0] = points[:, 0].clip(0, target_size[1] - 1)points[:, 1] = points[:, 1].clip(0, target_size[0] - 1)# 调整边界框的坐标bboxes = box_convert(torch.tensor(ann['box_examples_coordinates'],dtype=torch.float32,device=device)[:3, [0, 2], :].reshape(-1, 4), in_fmt='xyxy', out_fmt='xywh')bboxes = bboxes * torch.tensor([w_ratio, h_ratio, w_ratio, h_ratio], device=device)# 计算窗口大小window_size = bboxes.mean(dim=0)[2:].cpu().numpy()[::-1]# 初始化密度图dmap = torch.zeros(*target_size)# 根据点的坐标在密度图中增加计数for p in range(points.size(0)):dmap[points[p, 1], points[p, 0]] += 1# 应用高斯滤波器平滑密度图dmap = gaussian_filter(dmap.cpu().numpy(), window_size / 8)# 保存密度图np.save(os.path.join(density_map_path, os.path.splitext(image_name)[0] + '.npy'), dmap)if __name__ == '__main__':# 创建命令行参数解析器parser = argparse.ArgumentParser("Density map generator", add_help=False)parser.add_argument('--data_path',default='/home/nikola/master-thesis/data/fsc147/',type=str)parser.add_argument('--image_size', default=512, type=int)# 解析命令行参数args = parser.parse_args()# 调用函数生成密度图generate_density_maps(args.data_path, (args.image_size, args.image_size))

相关文章:

【扒代码】data.py

数据增强函数 import torch from torchvision.transforms import functional as TVFdef tiling_augmentation(img, bboxes, density_map, resize, jitter, tile_size, hflip_p):# 定义一个辅助函数&#xff0c;用于根据给定的概率水平翻转张量def apply_hflip(tensor, apply)…...

【时时三省】unity test 测试框架 介绍(适用于C语言进行测试的)

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 目录 1,关于 unity test 测试框架的介绍 2,测试框架关于源码的介绍 3,使用unity test测试C代码 4,常用断言举例 1,关于 unity test 测试框架的介绍 unity test 是 ThrowTheSwitch.org 的一个主要工程。它…...

那些你应该掌握的linux命令

一、路径授权 要给 a 用户 b 路径的所有操作权限,可以使用以下命令&#xff1a; sudo chown -R a:a /b sudo chmod -R 770 /b1.sudo chown -R a:a /b chown 命令用于更改文件或目录的所有者和所属组。-R 选项表示递归地应用于目录及其内部的所有文件和子目录。a:a 表示将所有…...

系统出现高CPU可能风险因素整理

文章目录 死循环无限递归序列化加解密正则表达式计算密集型任务大流量Full GC资源竞争/死锁I/O阻塞外部接口调用 死循环 死循环是最常见的原因之一。当代码中存在无穷循环&#xff08;例如在多线程环境下的HashMap线程不安全问题或分页查询条件不明确导致的无限循环&#xff0…...

前端技术 -- 动画效果之GSAP作用与使用示例

GSAP&#xff08;GreenSock Animation Platform&#xff09;简介 GSAP 是一个高性能、跨平台的 JavaScript 动画库&#xff0c;广泛用于网页动画的制作。它提供了丰富的 API&#xff0c;使得开发者可以轻松创建复杂的动画效果&#xff0c;并且在不同浏览器和设备上都能获得一致…...

C口一拖二数据线:解锁数字生活的便捷新篇章LDR6020

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 在科技日新月异的今天&#xff0c;我们的电子设备如同生活中的伴侣&#xff0c;无论是工作、学习还是娱乐&#xff0c;都离不开它们的陪伴。随着Type-C接口逐渐成为众多高端智能手机、平板电脑、笔记本电脑…...

CH07_数据绑定

第7章&#xff1a;数据绑定 本章目标 理解路由事件 掌握键盘输入事件 掌握鼠标输入事件 掌握多点触控输入事件 数据绑定概述 什么是数据绑定 ​ 将WPF中的至少一个带有依赖项属性的两个对象的两个属性进行绑定&#xff0c;使某一个依赖项属性可以更新和它绑定的属性的功…...

24.python基础(8.8)

python基础 1.搭建环境python3 1.查看是否有安装python [rootpython1 ~]# yum list installed |grep python 2.安装python3 [rootpython1 ~]#yum -y install python3 [rootpython1 ~]#python --version #查看版本信息 最新安装3.12&#xff0c;可以使用源码安装 开…...

【论文阅读】MobileNetV4 - Universal Models for the Mobile Ecosystem

文章目录 摘要一、介绍二、相关工作三、与硬件无关的帕累托效率四、通用倒置瓶颈五、移动MQA六、MNv4模型的设计6.1 为增强的体系结构改进NAS6.2 MNv4模型的优化 7. 结果7.1 ImageNet分类7.2 COCO目标检测 8. 强化蒸馏配方9. 结论 MobileNetV4 - 移动生态系统的通用模型 摘要 …...

大模型日报 2024-08-07

大模型日报 2024-08-07 大模型资讯 [Figure AI 把「终结者」造出来了] 简介&#xff1a;Figure 发布新一代人形机器人 Figure 02&#xff0c;具多种功能&#xff0c;能实时对话、自主执行任务&#xff0c;导航用 VLM&#xff0c;电池续航提升&#xff0c;机械手先进&#xff0c…...

区块链ddos防护怎么做

区块链ddos防护怎么做?在区块链这一新兴技术的浪潮中&#xff0c;我们见证了无数创新应用的诞生与繁荣。然而&#xff0c;在这片充满机遇的蓝海中&#xff0c;也潜藏着不容忽视的暗流——分布式拒绝服务攻击&#xff08;DDoS&#xff09;。DDoS攻击&#xff0c;如同网络世界的…...

在Linux中认识pthread库

int *pnullptr; pnullptr; *pnullptr; 指针变量做右值也是变量拥有空间。去承装数据。 *p代表指针所指向的空间&#xff0c;及0号地址&#xff0c;及往虚拟地址的0号地址处写8个字节的数据&#xff0c;全部写为0. &#xff08;此操作不允许&#xff09; 进程和线程的关系如…...

LVS 负载均衡

目录 LVS 体系结构 LVS 相关概念术语 lvs 集群常见类型 实验一&#xff1a; LVS NAT模式 LVS NAT特性 实验二&#xff1a; LVS DR模式 LVS DR特性 LVS是Linux virtual server的缩写&#xff0c;是一个高性能的、开源的负载均衡器&#xff0c;它运行于Linux操作系统之上…...

在Excel中启用宏 (~ ̄▽ ̄)~

一、启用宏 打开任意Excel&#xff0c;点击屏幕左上角的文件选项&#xff0c;然后选择Excel选项窗口。在Excel选项窗口中&#xff0c;选择信任中心按钮&#xff1b;在信任中心设置窗口中&#xff0c;选择宏设置&#xff0c;启用所有宏&#xff08;不推荐&#xff0c;潜在风险&a…...

连接投影仪/显示器只能扩展不能复制的解决方案

原文章&#xff1a;https://iknow.lenovo.com.cn/detail/121481 故障现象&#xff1a; 笔记本外接投影仪/显示器后&#xff0c;笔记本屏幕有显示&#xff0c;但投影仪却只有背景或没有显示&#xff1b; 原因分析&#xff1a; 此现象多发生在双显卡机型上&#xff0c;笔记本屏…...

数据库基础知识

数据库基础知识 主流的数据库连接MySQL理解mysql和mysqld和数据库简单对数据库操作MySQL构架SQL分类存储引擎总结 主流的数据库 SQL Sever&#xff1a; 微软的产品&#xff0c;.Net程序员的最爱&#xff0c;中大型项目。Oracle&#xff1a; 甲骨文产品&#xff0c;适合大型项目…...

java JVM 锁消除

Java虚拟机 (JVM) 中的锁消除 (Lock Elimination) 是一种编译时优化技术&#xff0c;用于减少或完全去除不必要的同步操作。锁消除可以显著提高程序的性能&#xff0c;尤其是在多线程环境中。下面详细介绍锁消除的工作原理和技术细节。 锁消除的目的 锁消除的目标是在编译阶段…...

基于 Java Supplier与Predicate 封装自动重试机制通用接口

核心逻辑就是把重试的业务与重试中断条件抽象出来函数化&#xff0c;内部重试业务具体化。 关键需要理解Java的函数式接口编程 Supplier 与 Predicate作用。 import lombok.Data; import lombok.extern.slf4j.Slf4j;import java.util.Random; import java.util.function.Predi…...

Java面试题(基础篇)②

目录 一&#xff0c;float f3.4 是否正确&#xff1f; 二&#xff0c;重写和重载的区别是什么 三&#xff0c;this和super的应用场景是什么 四&#xff0c;throw和throws的区别是什么 五&#xff0c;应该使用什么数据类型来计算价格 一&#xff0c;float f3.4 是否正确&am…...

【docker快捷部署系列二】用docker-compose快速配置多个容器,docker部署Springboot+Vue项目和mysql数据库

1、思路 docker部署项目是将项目的不同程序放入不同容器中运行&#xff0c;这样可以方便管理不同程序。我的项目有Springboot、Vue、mysql三部分&#xff0c;Vue用nginx代理&#xff0c;因为nodejs太占空间了。一开始我是用Dockerfile创建镜像再运行容器的&#xff0c;但发现它…...

当前用户的Git全局配置情况:git config --global --list

通过config命令可以查询当前用户的全局配置情况。这些配置项定义了 Git 在全局范围内的行为&#xff0c;包括如何处理大文件、SSL 证书验证以及提交时的用户信息。 git config --global --list http.sslVerifyfalse 这个配置项禁用了 SSL 证书验证。这在与自签名证书的 Git 服…...

Android 异步编程中协程的完整实战示例

一、全链路数据加载&#xff1a;网络请求 数据库缓存 在实际开发中&#xff0c;数据加载通常需要先检查本地缓存&#xff0c;若缓存失效则从网络获取&#xff0c;并将结果更新到本地。以下是完整的 MVVM 架构示例&#xff1a; 1. 项目结构 app/ ├── data/ …...

图像卷积OpenCV C/C++ 核心操作

图像卷积&#xff1a;OpenCV C 核心操作 图像卷积是图像处理和计算机视觉领域最基本且最重要的操作之一。它通过一个称为卷积核&#xff08;或滤波器&#xff09;的小矩阵&#xff0c;在输入图像上滑动&#xff0c;并对核覆盖的图像区域执行元素对应相乘后求和的运算&#xff…...

点云识别模型汇总整理

点云识别模型主要分类&#xff1a; 目前主流的点云识别模型主要分为 基于点直接处理的方法&#xff1a;PointNet、PointNet 、DGCNN、 PointCNN、 Point Transformer、 RandLA-Net、 PointMLP、 PointNeXt &#xff1b;基于体素化的方法&#xff1a;VoxelNet、SECOND、PV-RCN…...

性能测试-jmeter实战1

课程&#xff1a;B站大学 记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师 性能测试-jmeter实战1 为什么需要性能测试呢&#xff1f;性能测试的作用&#xff1f;性能测试体系性能测试基础性能测试工具性能监控…...

【C++】C++面向对象设计的核心思想之一: 接口抽象、解耦和可扩展性

1. 什么是虚函数&#xff1f; 虚函数&#xff08;virtual&#xff09;是C里实现“多态”的关键机制。 在基类中声明虚函数&#xff0c;在子类中可以**覆盖&#xff08;override&#xff09;**它们。通过基类指针/引用操作时&#xff0c;自动调用实际对象&#xff08;子类&…...

某乎x-zse-96 破解(补环境版本)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、总体概述二、请求分析分析请求流程三、逆向分析总结一、总体概述 本文主要实现某乎x-zse-96 破解(补环境版本),相关的链接: https://www.zhihu.com/search?type=content&q=%25E7%258…...

GitHub开源|AI顶会论文中文翻译PDF合集(gpt-translated-pdf-zh)

项目核心特点 该项目专注于提供计算机科学与人工智能领域的高质量中文翻译资源&#xff0c;以下为关键特性&#xff1a; 主题覆盖广泛&#xff1a;包含算法、数据结构、概率统计等基础内容&#xff0c;以及深度学习、强化学习等前沿研究方向。格式统一便捷&#xff1a;所有文…...

接口性能优化

一、耗时统计 在做接口的性能优化时&#xff0c;最重要的是知道时间消耗在哪里。 可以用StopWatch&#xff0c;进行耗时统计。 详情见&#xff1a; https://blog.csdn.net/sinat_32502451/article/details/148350451 二、链路追踪 如果团队使用了Skywalking&#xff0c;可以…...

构建多模型协同的Ollama智能对话系统

构建多模型协同的Ollama智能对话系统 在人工智能应用中&#xff0c;单一模型往往难以满足复杂场景的需求。本文将介绍如何整合多个Ollama模型&#xff0c;构建一个智能对话系统&#xff0c;实现情感分析、危机评估和智能回复的协同功能。 系统架构 该系统采用多模型pipeline…...