目标检测任务 - 数据增强
目标检测任务 - DETR : 数据预处理/数据增强 算法源码实例
import datasets.transforms as Tnormalize = T.Compose([T.ToTensor(),T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])scales = [480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800]if image_set == 'train':return T.Compose([T.RandomHorizontalFlip(),T.RandomSelect(T.RandomResize(scales, max_size=1333),T.Compose([T.RandomResize([400, 500, 600]),T.RandomSizeCrop(384, 600),T.RandomResize(scales, max_size=1333),])),normalize,])if image_set == 'val':return T.Compose([T.RandomResize([800], max_size=1333),normalize,])
以下为 datasets/transforms.py
文件
# datasets/transforms.py
import randomimport PIL
import torch
import torchvision.transforms as T
import torchvision.transforms.functional as Ffrom util.box_ops import box_xyxy_to_cxcywh
from util.misc import interpolatedef crop(image, target, region):cropped_image = F.crop(image, *region)target = target.copy()i, j, h, w = region# should we do something wrt the original size?target["size"] = torch.tensor([h, w])fields = ["labels", "area", "iscrowd"]if "boxes" in target:boxes = target["boxes"]max_size = torch.as_tensor([w, h], dtype=torch.float32)cropped_boxes = boxes - torch.as_tensor([j, i, j, i])cropped_boxes = torch.min(cropped_boxes.reshape(-1, 2, 2), max_size)cropped_boxes = cropped_boxes.clamp(min=0)area = (cropped_boxes[:, 1, :] - cropped_boxes[:, 0, :]).prod(dim=1)target["boxes"] = cropped_boxes.reshape(-1, 4)target["area"] = areafields.append("boxes")if "masks" in target:# FIXME should we update the area here if there are no boxes?target['masks'] = target['masks'][:, i:i + h, j:j + w]fields.append("masks")# remove elements for which the boxes or masks that have zero areaif "boxes" in target or "masks" in target:# favor boxes selection when defining which elements to keep# this is compatible with previous implementationif "boxes" in target:cropped_boxes = target['boxes'].reshape(-1, 2, 2)keep = torch.all(cropped_boxes[:, 1, :] > cropped_boxes[:, 0, :], dim=1)else:keep = target['masks'].flatten(1).any(1)for field in fields:target[field] = target[field][keep]return cropped_image, targetdef hflip(image, target):flipped_image = F.hflip(image)w, h = image.sizetarget = target.copy()if "boxes" in target:boxes = target["boxes"]boxes = boxes[:, [2, 1, 0, 3]] * torch.as_tensor([-1, 1, -1, 1]) + torch.as_tensor([w, 0, w, 0])target["boxes"] = boxesif "masks" in target:target['masks'] = target['masks'].flip(-1)return flipped_image, targetdef resize(image, target, size, max_size=None):# size can be min_size (scalar) or (w, h) tupledef get_size_with_aspect_ratio(image_size, size, max_size=None):w, h = image_sizeif max_size is not None:min_original_size = float(min((w, h)))max_original_size = float(max((w, h)))if max_original_size / min_original_size * size > max_size:size = int(round(max_size * min_original_size / max_original_size))if (w <= h and w == size) or (h <= w and h == size):return (h, w)if w < h:ow = sizeoh = int(size * h / w)else:oh = sizeow = int(size * w / h)return (oh, ow)def get_size(image_size, size, max_size=None):if isinstance(size, (list, tuple)):return size[::-1]else:return get_size_with_aspect_ratio(image_size, size, max_size)size = get_size(image.size, size, max_size)rescaled_image = F.resize(image, size)if target is None:return rescaled_image, Noneratios = tuple(float(s) / float(s_orig) for s, s_orig in zip(rescaled_image.size, image.size))ratio_width, ratio_height = ratiostarget = target.copy()if "boxes" in target:boxes = target["boxes"]scaled_boxes = boxes * torch.as_tensor([ratio_width, ratio_height, ratio_width, ratio_height])target["boxes"] = scaled_boxesif "area" in target:area = target["area"]scaled_area = area * (ratio_width * ratio_height)target["area"] = scaled_areah, w = sizetarget["size"] = torch.tensor([h, w])if "masks" in target:target['masks'] = interpolate(target['masks'][:, None].float(), size, mode="nearest")[:, 0] > 0.5return rescaled_image, targetdef pad(image, target, padding):# assumes that we only pad on the bottom right cornerspadded_image = F.pad(image, (0, 0, padding[0], padding[1]))if target is None:return padded_image, Nonetarget = target.copy()# should we do something wrt the original size?target["size"] = torch.tensor(padded_image.size[::-1])if "masks" in target:target['masks'] = torch.nn.functional.pad(target['masks'], (0, padding[0], 0, padding[1]))return padded_image, targetclass ResizeDebug(object):def __init__(self, size):self.size = sizedef __call__(self, img, target):return resize(img, target, self.size)class RandomCrop(object):def __init__(self, size):self.size = sizedef __call__(self, img, target):region = T.RandomCrop.get_params(img, self.size)return crop(img, target, region)class RandomSizeCrop(object):def __init__(self, min_size: int, max_size: int):self.min_size = min_sizeself.max_size = max_sizedef __call__(self, img: PIL.Image.Image, target: dict):w = random.randint(self.min_size, min(img.width, self.max_size))h = random.randint(self.min_size, min(img.height, self.max_size))region = T.RandomCrop.get_params(img, [h, w])return crop(img, target, region)class CenterCrop(object):def __init__(self, size):self.size = sizedef __call__(self, img, target):image_width, image_height = img.sizecrop_height, crop_width = self.sizecrop_top = int(round((image_height - crop_height) / 2.))crop_left = int(round((image_width - crop_width) / 2.))return crop(img, target, (crop_top, crop_left, crop_height, crop_width))class RandomHorizontalFlip(object):def __init__(self, p=0.5):self.p = pdef __call__(self, img, target):if random.random() < self.p:return hflip(img, target)return img, targetclass RandomResize(object):def __init__(self, sizes, max_size=None):assert isinstance(sizes, (list, tuple))self.sizes = sizesself.max_size = max_sizedef __call__(self, img, target=None):size = random.choice(self.sizes)return resize(img, target, size, self.max_size)class RandomPad(object):def __init__(self, max_pad):self.max_pad = max_paddef __call__(self, img, target):pad_x = random.randint(0, self.max_pad)pad_y = random.randint(0, self.max_pad)return pad(img, target, (pad_x, pad_y))class RandomSelect(object):"""Randomly selects between transforms1 and transforms2,with probability p for transforms1 and (1 - p) for transforms2"""def __init__(self, transforms1, transforms2, p=0.5):self.transforms1 = transforms1self.transforms2 = transforms2self.p = pdef __call__(self, img, target):if random.random() < self.p:return self.transforms1(img, target)return self.transforms2(img, target)class ToTensor(object):def __call__(self, img, target):return F.to_tensor(img), targetclass RandomErasing(object):def __init__(self, *args, **kwargs):self.eraser = T.RandomErasing(*args, **kwargs)def __call__(self, img, target):return self.eraser(img), targetclass Normalize(object):def __init__(self, mean, std):self.mean = meanself.std = stddef __call__(self, image, target=None):image = F.normalize(image, mean=self.mean, std=self.std)if target is None:return image, Nonetarget = target.copy()h, w = image.shape[-2:]if "boxes" in target:boxes = target["boxes"]boxes = box_xyxy_to_cxcywh(boxes)boxes = boxes / torch.tensor([w, h, w, h], dtype=torch.float32)target["boxes"] = boxesreturn image, targetclass Compose(object):def __init__(self, transforms):self.transforms = transformsdef __call__(self, image, target):for t in self.transforms:image, target = t(image, target)return image, targetdef __repr__(self):format_string = self.__class__.__name__ + "("for t in self.transforms:format_string += "\n"format_string += " {0}".format(t)format_string += "\n)"return format_string
1)按概率随机选择做数据增强操作
class RandomSelect(object):"""Randomly selects between transforms1 and transforms2,with probability p for transforms1 and (1 - p) for transforms2"""def __init__(self, transforms1, transforms2, p=0.5):self.transforms1 = transforms1self.transforms2 = transforms2self.p = pdef __call__(self, img, target):if random.random() < self.p:return self.transforms1(img, target)return self.transforms2(img, target)T.RandomSelect( # 按概率随机选择做数据增强操作T.RandomResize(scales, max_size=1333),T.Compose([T.RandomResize([400, 500, 600]),T.RandomSizeCrop(384, 600),T.RandomResize(scales, max_size=1333),])
)
代码解读 :
-
指定概率 p=0.5
-
若 p < 0.5,执行
T.RandomResize(scales, max_size=1333)
-
若 p > 0.5 ,执行 如下3个 数据增强操作
-
T.Compose([T.RandomResize([400, 500, 600]),T.RandomSizeCrop(384, 600),T.RandomResize(scales, max_size=1333),])
-
2)Compose
class Compose(object):def __init__(self, transforms):self.transforms = transformsdef __call__(self, image, target):for t in self.transforms:image, target = t(image, target)return image, target
3)随机水平翻转 RandomHorizontalFlip
boxes 的形式为 (xmin, ymin, xmax, ymax)
import torchvision.transforms.functional as Fclass RandomHorizontalFlip(object):def __init__(self, p=0.5):self.p = pdef __call__(self, img, target):if random.random() < self.p:return hflip(img, target)return img, targetdef hflip(image, target):flipped_image = F.hflip(image)w, h = image.sizetarget = target.copy()if "boxes" in target:boxes = target["boxes"]boxes = boxes[:, [2, 1, 0, 3]] * torch.as_tensor([-1, 1, -1, 1]) + torch.as_tensor([w, 0, w, 0])target["boxes"] = boxesreturn flipped_image, targetimg, target = RandomHorizontalFlip()(img, target)
4)随机缩放 RandomResize
boxes 的形式为 (xmin, ymin, xmax, ymax)
class RandomResize(object):def __init__(self, sizes, max_size=None):assert isinstance(sizes, (list, tuple))self.sizes = sizesself.max_size = max_sizedef __call__(self, img, target=None):size = random.choice(self.sizes)return resize(img, target, size, self.max_size)def resize(image, target, size, max_size=None):# 获取缩放后的图像尺寸size = get_size(image.size, size, max_size)# 对图像进行缩放rescaled_image = F.resize(image, size)if target is None:return rescaled_image, None# 计算 高的缩放比例 和 宽的缩放比例ratios = tuple(float(s) / float(s_orig) for s, s_orig in zip(rescaled_image.size, image.size))ratio_width, ratio_height = ratiostarget = target.copy()if "boxes" in target:boxes = target["boxes"]# 将 bbox 的高宽分别按照 高的缩放比例 和 宽的缩放比例 进行调整scaled_boxes = boxes * torch.as_tensor([ratio_width, ratio_height, ratio_width, ratio_height])target["boxes"] = scaled_boxes# 重新计算 bbox 的面积if "area" in target:area = target["area"]scaled_area = area * (ratio_width * ratio_height)target["area"] = scaled_area# 保存缩放后的高和宽h, w = sizetarget["size"] = torch.tensor([h, w])if "masks" in target:target['masks'] = interpolate(target['masks'][:, None].float(), size, mode="nearest")[:, 0] > 0.5return rescaled_image, targetdef get_size(image_size, size, max_size=None):if isinstance(size, (list, tuple)):return size[::-1]else:return get_size_with_aspect_ratio(image_size, size, max_size)def get_size_with_aspect_ratio(image_size, size, max_size=None):w, h = image_sizeif max_size is not None:# 将size定为较短边长度,按照原始图像的长短比例(高宽比/宽高比),缩放图像较长边# 若缩放后图像的较长边大于最大尺寸 max_size, 则将较长边的长度定为 max_size,将# 较短边按照按照原始图像的比例进行调整min_original_size = float(min((w, h)))max_original_size = float(max((w, h)))if max_original_size / min_original_size * size > max_size:size = int(round(max_size * min_original_size / max_original_size))if (w <= h and w == size) or (h <= w and h == size):return (h, w)# 计算缩放后的图像高宽尺寸if w < h:ow = sizeoh = int(size * h / w)else:oh = sizeow = int(size * w / h)return (oh, ow)scales = [480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800]
img, target = RandomResize(scales, max_size=1333)(img, target)
5)随机尺寸裁剪 RandomSizeCrop
boxes 的形式为 (xmin, ymin, xmax, ymax)
class RandomSizeCrop(object):def __init__(self, min_size: int, max_size: int):self.min_size = min_sizeself.max_size = max_sizedef __call__(self, img: PIL.Image.Image, target: dict):# 在指定范围内,分别随机出 高/宽尺寸,用于裁剪w = random.randint(self.min_size, min(img.width, self.max_size))h = random.randint(self.min_size, min(img.height, self.max_size))# 返回的region为裁剪的尺寸,形为:(top, left, height, width)region = T.RandomCrop.get_params(img, [h, w])return crop(img, target, region)def crop(image, target, region):# 将图像按照region 指定的尺寸进行裁剪cropped_image = F.crop(image, *region)target = target.copy()i, j, h, w = region# 保存裁剪后的尺寸target["size"] = torch.tensor([h, w])# 保存字段名,方便后面用于检查fields = ["labels", "area", "iscrowd"]if "boxes" in target:boxes = target["boxes"]# 将裁剪后的图像宽高转换为 tensormax_size = torch.as_tensor([w, h], dtype=torch.float32)# 调整bbox的坐标,将bbox的(xmin, ymin, xmax, ymax) 分别减去(left, top, left, top)cropped_boxes = boxes - torch.as_tensor([j, i, j, i])# 处理边界情况,若bbox的坐标落在裁剪区域外,则将bbox的坐标进行截断cropped_boxes = torch.min(cropped_boxes.reshape(-1, 2, 2), max_size) # 处理bbox的xmax和ymaxcropped_boxes = cropped_boxes.clamp(min=0) # 处理bbox的xmin和ymin# 求出裁剪后的图像面积,代码等价于 :area =(xmax - xmin)*(ymax - ymin)area = (cropped_boxes[:, 1, :] - cropped_boxes[:, 0, :]).prod(dim=1) target["boxes"] = cropped_boxes.reshape(-1, 4)target["area"] = areafields.append("boxes")if "masks" in target:# FIXME should we update the area here if there are no boxes?target['masks'] = target['masks'][:, i:i + h, j:j + w]fields.append("masks")if "boxes" in target or "masks" in target:# 删除落在裁剪区域外的bbox,这部分bbox经过上面的处理之后: xmin=xmax, ymin=ymaxif "boxes" in target:cropped_boxes = target['boxes'].reshape(-1, 2, 2)keep = torch.all(cropped_boxes[:, 1, :] > cropped_boxes[:, 0, :], dim=1)else:keep = target['masks'].flatten(1).any(1)# 删除无效的bboxfor field in fields:target[field] = target[field][keep]return cropped_image, target
torchvision.RandomCrop.get_params
用法:
region = torchvision.RandomCrop.get_params(img, output_size)
参数:
-
img
: 要裁剪的图像,可以是 PIL Image 或 Tensor 对象。 -
output_size
: 裁剪区域的大小,必须是元组,包含两个元素,表示裁剪区域的高度和宽度 [h, w] 。
返回值:
-
一个元组,包含四个元素:
-
top
: 裁剪区域的顶部坐标。 -
left
: 裁剪区域的左侧坐标。 -
height
: 裁剪区域的高度。 -
width
: 裁剪区域的宽度。
-
6)ToTensor
class ToTensor(object):def __call__(self, img, target):return F.to_tensor(img), targetimg, target = ToTensor()(img, target)
7)Normalize
class Normalize(object):def __init__(self, mean, std):self.mean = meanself.std = stddef __call__(self, image, target=None):image = F.normalize(image, mean=self.mean, std=self.std)if target is None:return image, Nonetarget = target.copy()h, w = image.shape[-2:]if "boxes" in target:boxes = target["boxes"]boxes = box_xyxy_to_cxcywh(boxes)boxes = boxes / torch.tensor([w, h, w, h], dtype=torch.float32)target["boxes"] = boxesreturn image, targetdef box_xyxy_to_cxcywh(x):x0, y0, x1, y1 = x.unbind(-1)b = [(x0 + x1) / 2, (y0 + y1) / 2,(x1 - x0), (y1 - y0)]return torch.stack(b, dim=-1)img, target = Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])(img, target)
代码解读 :
-
将图像的像素值进行归一化
-
将 bbox 坐标由 (xmin, ymin, xmax, ymax) 转换为 (cx, cy, w, h)的形式
-
将 (cx, cy, w, h)的取值分别除以 w, h, w, h,将坐标值都归一化到 0 ~1 之间,
即,相对于 图像尺寸的 相对坐标
相关文章:
目标检测任务 - 数据增强
目标检测任务 - DETR : 数据预处理/数据增强 算法源码实例 import datasets.transforms as Tnormalize T.Compose([T.ToTensor(),T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])scales [480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800]…...
java的switch case
import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int type in.nextInt();switch(type){case 1:case 2:System.out.println("你好");break;case 3:System.out.println("晚上好"…...
基于亚博K210开发板——LCD触摸屏读取坐标数据测试
开发板 亚博K210开发板 实验目的 主要学习 K210 通过 I2C 读取触摸屏的坐标,并打印出来,显示在 LCD上。 实验准备 实验元件 LCD 显示屏触摸板 元件特性 K210 开发板自带 2.0 寸触摸屏,其实是 LCD 显示屏上贴一个触摸板组成…...
coze平台实现文生视频和图生视频(阿里云版)工作流
工作流全貌 开始 首先从入参开始: api_key:来自阿里云百炼平台,自行去申请 prompt:生成视频的文本提示词。支持中英文,长度不超过800个字符,每个汉字/字母占一个字符,超过部分会自动截断。 …...
python酒店健身俱乐部管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
QtGUI模块功能详细说明,图标和光标(七)
目录 一.窗口和屏幕管理 二. 绘图和渲染 三. 图像处理 四. 字体和文本 五. 事件和输入处理 六. OpenGL 和硬件加速 七. 颜色和外观 八. 图标和光标 1、QIcon: 图标管理 1.1、QIcon 简介 1.2、图标的来源与创建 1.3、多分辨率与 DPI 支持 1.4、图标的状态管理 2、…...
【图像处理基石】如何入门OCR技术?
入门OCR(Optical Character Recognition,光学字符识别)技术需要结合理论学习、工具实践和项目实战,以下是分步骤的学习指南,适合零基础学习者: 一、明确OCR技术的核心概念 OCR的基本原理 核心流程…...
数据库知识沉浸式游戏化学习设计研究
数据库知识沉浸式游戏化学习设计研究 摘要: 本研究旨在设计一款以数据库知识为主题的沉浸式游戏化学习系统。通过对数据库知识体系的深入剖析,结合游戏化学习理论,构建了一个多层次、多任务的游戏架构。玩家在游戏过程中需完成构建数据库结构、编写 SQL 查询等任务来解锁关…...
大疆无人机
在大疆上云API中,DRC 链路通常指 Device-Cloud Remote Control Link(设备-云端远程控制链路),它是无人机(或设备)与云端服务之间建立的实时控制与数据传输通道,用于实现…...
撤回不了一点 v1.0.2,支持微信QQ钉钉飞书等消息防撤回
如今生活节奏快得飞起,社交软件和工作通讯软件成了咱日常交流的核心阵地。大家肯定都有过这些闹心事儿:和朋友聊得正嗨,对方突然撤回一条消息,好奇心瞬间爆棚,却怎么也看不到撤回的内容;工作群里关键信息刚…...
什么是Git?
“Git”是目前非常火、广泛使用的版本控制系统,尤其在软件开发领域中扮演着核心角色。 一、什么是Git?它到底是什么? Git 是一种版本控制系统(Version Control System, VCS)。它的主要作用是帮助开发者管理“代码的不…...
微信小程序 自定义图片分享-绘制数据图片以及信息文字
一 、需求 从数据库中读取头像,姓名电话等信息,当分享给女朋友时,每个信息不一样 二、实现方案 1、先将数据库中需要的头像姓名信息读取出来加载到data 数据项中 data:{firstName:, // 姓名img:, // 头像shareImage:,// 存储临时图片 } 2…...
langchain提示词的使用
一、概述 提示词是指向人工智能大模型提供的输入信息,通常包含关键词、问题或指令,可以引导大模型生成与用户期望相符的回应。我们在豆包,DeepSeek等大模型中输入的问题都可以认为一个简单的提示词,不过为了真正得到我们需要的结…...
C语言| extern的用法作用
C语言| 局部变量、全局变量 extern定义的变量,只对全局变量有用。 掌握extern的用法及其作用。extern主要用于在不同.c文件间扩展全局变量的作用范围。 扩展全局变量的使用范围,操作方法: 1 在一个文件内扩展全局变量的使用范围 全局变量…...
Rust 环境变量管理秘籍:从菜鸟到老鸟都爱的 dotenv 教程
前言 写代码的你,是否遭遇过这些灵魂拷问: “我现在在哪个环境?开发?测试?还是直接在生产线上裸奔?”“少写一个 .env,测试脚本在数据库里上演清空大法,客户当场破防。”“每次手动设置 RUST_ENV,命令敲到一半就开始怀疑人生,还怕输错一个字符引发灭世级事故。”别慌…...
Leetcode (力扣)做题记录 hot100(49,136,169,20)
力扣第49题:字母异位词分组 49. 字母异位词分组 - 力扣(LeetCode) 遍历数组,将每一个字符串变成char数组 然后排序,如果map里面有则将他的值返回来(key是排序好的字符串) class Solution {pu…...
Slitaz 系统深度解析
Slitaz 系统深度解析:从系统架构到设计哲学 一、系统定位与核心目标 Slitaz(Simplified Lightweight IT Automatic Zen)是一个基于 Linux 的超轻量级发行版,设计目标是极致轻量化、快速启动、低资源消耗,专为老旧硬件…...
Deepseek+Xmind:秒速生成思维导图与流程图
deepseekxmind,快速生成思维导图和流程图 文章目录 思维导图deepseek笔记本 txt文件xmind 流程图deepseekdraw.io 思维导图 deepseek 笔记本 txt文件 将deep seek的东西复制到文本文件中,然后将txt文件拓展名改成md xmind 新建思维导图----左上角三…...
理解计算机系统_并发编程(5)_基于线程的并发(二):线程api和基于线程的并发服务器
前言 以<深入理解计算机系统>(以下称“本书”)内容为基础,对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 接续上一篇理解计算机系统_并发编程(4)_基于线程的并发(一…...
java刷题基础知识
List<int[]> merged new ArrayList<int[]>(); return merged.toArray(new int[merged.size()][]); 表示一个存储 int[] 类型元素的列表,list灵活支持扩展,因为不知道最后有几个区间,所以用list,最后toArray返回成数组…...
MATLAB语音情感识别神经网络方法
在MATLAB中使用神经网络进行语音情感识别通常涉及以下步骤:数据准备、特征提取、神经网络模型构建、训练与评估。以下是详细说明和示例代码: 1. 数据准备 数据集:推荐使用公开情感语音数据集(如RAVDESS、CREMA-D、EMODB等&#x…...
PostgreSQL 服务器信号函数
PostgreSQL 服务器信号函数 PostgreSQL 提供了一组服务器信号函数(Server Signaling Functions),允许数据库管理员向 PostgreSQL 服务器进程发送特定信号以控制服务器行为。这些函数提供了对数据库服务器的精细控制能力。 一、核心信号函数…...
流动式起重机Q2的培训内容有哪些?
流动式起重机 Q2 的培训内容主要分为理论知识和实际操作两部分,具体如下: 理论知识 基础理论知识:涵盖机械原理、液压原理、电气原理等内容,帮助学员理解起重机的基本工作原理。例如,通过机械原理知识,学员…...
虹科应用 | 探索PCAN卡与医疗机器人的革命性结合
随着医疗技术的不断进步,医疗机器人在提高手术精度、减少感染风险以及提升患者护理质量方面发挥着越来越重要的作用。医疗机器人的精确操作依赖于稳定且高效的数据通信系统,虹科提供的PCAN四通道mini PCIe转CAN FD卡,正是为了满足这一需求而设…...
Linux系统编程---Signal信号集
0、前言 在上一篇博客笔记文章中,对Linux进程间通信的信号进行了讲解,本章将接着上一篇文章的内容,继续对Linux进程间通信中信号部分的信号集这个小知识点进行梳理。 如果有对Linux系统编程有不了解的地方,欢迎查阅博主的Linux系统…...
上电单次复位触发电路
SA1相当于是另外一个触发信号,S2A是手动触发信号,当S1A和S2A开关都断开时,示波器A入口所连接线路为上拉状态,高电平为3V。 当S2A闭合,相当于手动拉低,可以用于唤醒单片机之类的。 当S1A闭合,模拟电源接入&…...
talk-linux 不同用户之间终端通信
好的!下面是一个完整的指南和脚本,用于在两台 Linux 主机上配置并使用 talk 聊天功能(假设它们在同一个局域网内)。 ⸻ 🧾 一、需求说明 我们需要在两台主机上: 1. 安装 talk 和 talkd 2. 启用 talkd 服…...
QGIS 将 Shapefile 导入 PostGIS 数据库
一、背景介绍:QGIS、PostgreSQL 和 PostGIS 的关系和用途 在开始动手操作之前,我们先简单了解一下 QGIS、PostgreSQL 和 PostGIS 之间的关系及其用途。 QGIS(Quantum GIS):一款开源免费的桌面地理信息系统࿰…...
《内网渗透测试:绕过最新防火墙策略》
内网渗透测试是检验企业网络安全防御体系有效性的核心手段,而现代防火墙策略的持续演进(如零信任架构、AI流量分析、深度包检测)对攻击者提出了更高挑战。本文系统解析2024年新型防火墙的防护机制,聚焦协议隐蔽隧道、上下文感知绕…...
CSS结构性伪类、UI伪类与动态伪类全解析:从文档结构到交互状态的精准选择
一、结构性伪类选择器:文档树中的位置导航器 结构性伪类选择器是CSS中基于元素在HTML文档树中的层级关系、位置索引或结构特征进行匹配的一类选择器。它们无需依赖具体的类名或ID,仅通过文档结构即可精准定位元素,是实现响应式布局和复杂文档…...
【大模型LLM学习】MiniCPM的注意力机制学习
【大模型LLM学习】MiniCPM的注意力机制学习 前言1 Preliminary1.1 MHA1.2 KV-cache 2 GQAGQA的MiniCPM实现 3 MLAMLA的MiniCPM-3-4b的实现 TODO 前言 之前MiniCPM3-4B是最早达到gpt-3.5能力的端侧小模型,其注意力机制使用了MLA。本来想借着MiniCPM从MHA过到MLA的&am…...
stm32之PWR、WDG
目录 1.PWR1.1 简介1.2 电源框图1.3 上电复位和掉电复位1.4 可编程电压监测器1.5 低功耗模式1.5.1 模式选择1.5.2 睡眠模式1.5.3 停止模式1.5.4 待机模式 1.6 实验1.6.1 修改主频1.6.2 睡眠模式串口发送接收1.6.3 停止模式对射式红外传感器计次1.6.4 待机模式实时时钟 2.看门狗…...
分布式任务调度XXL-Job
XXL-Job 是一款轻量级、分布式的任务调度平台,其核心设计解决了传统任务调度(如Quartz)在分布式场景下的任务分片、高可用、可视化管控等痛点。以下从原理、核心架构、应用场景、代码示例及关联中间件展开详解 一、主流任务…...
内存泄漏与OOM崩溃根治方案:JVM与原生内存池差异化排查手册
内存泄漏与OOM崩溃根治方案:JVM与原生内存池差异化排查手册 一、问题描述与快速解决方案 1. 核心问题分类 内存泄漏(Memory Leak) 现象:应用运行时间越长,内存占用持续攀升,GC回收效率下降,最…...
火山引擎发展初始
火山引擎是字节跳动旗下的云计算服务品牌,其云服务业务的启动和正式商业化时间线如下: 1. **初期探索(2020年之前)** 字节跳动在早期为支持自身业务(如抖音、今日头条等)构建了强大的基础设施和技术中…...
使用光标测量,使用 TDR 测量 pH 和 fF
时域反射计 (TDR) 是一种通常用于测量印刷电路板 (PCB) 测试试样和电缆阻抗的仪器。TDR 对于测量过孔和元件焊盘的电感和电容、探针尖端电容和电感,甚至寄生电感收发器耦合电容器也非常有用。这也是验证仿真或提取您自…...
mybatisplus 集成逻辑删除
一开始,没去查资料,后面要被AI气死了,先看它的的话 一开始,看ai的描述,我还以为,不需要改数据库,mybatis-puls自动拦截集成就可以实现逻辑删除,c,最后还是要给数据库加一…...
ABAP+旧数据接管的会计年度未确定
导资产主数据时,报错旧数据接管的会计年度未确定 是因为程序里面使用了下列函数AISCO_CALCULATE_FIRST_DAY,输入公司代码,获取会计年度,这个数据是在后台表T093C表中取数的,通过SE16N可以看到后台表数据没有数…...
KT148A语音芯片发码很难播放_将4脚对地一下再发正常,什么原因?
问题描述如下:您好,遇到一点问题请帮忙支持一下: KT148A 这颗芯片, 我们上电后发码很难触发播放, 但用镊子将4pin PB0对地短接触发一下,再发码就很正常,这是什么原因? 根据现象来看…...
【大模型】DeepResearcher:通用智能体通过强化学习探索优化
DeepResearcher:通过强化学习在真实环境中扩展深度研究 一、引言二、技术原理(一)强化学习与深度研究代理(二)认知行为的出现(三)模型架构 三、实战运行方式(一)环境搭建…...
SpringBoot 3.X 开发自己的 Spring Boot Starter 和 SpringBoot 2.x 的区别
SpringBoot 2.x 在模块中创建 src/main/resources/META-INF/spring.factories 文件 文件内容如下: org.springframework.boot.autoconfigure.EnableAutoConfiguration\com.xxx.xxx.yourfilejava1,\com.xxx.xxx.yourfilejava2 SpringBoot 3.x 在模块中创建 src/m…...
NY164NY165美光固态闪存NY166NY172
美光NY系列固态闪存深度解析:技术、体验与行业洞察 一、技术架构与核心特性解析 美光NY系列(NY164/NY165/NY166/NY172)作为面向企业级市场的固态闪存产品,其技术设计聚焦高可靠性与性能优化。从架构上看,该系列可能采…...
Spring Boot中HTTP连接池的配置与优化实践
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、HTTP连接池的核心价值 在微服务架构和分布式系统场景中,HTTP客户端频繁创建/断开连接会产生显著的性能损耗。通过连接池技术可以实现&#x…...
【docker】--镜像管理
文章目录 拉取镜像启动镜像为容器连接容器法一法二 保存镜像加载镜像镜像打标签移除镜像 拉取镜像 docker pull mysql:8.0.42启动镜像为容器 docker run -dp 8080:8080 --name container_mysql8.0.42 -e MYSQL_ROOT_PASSWORD123123123 mysql:8.0.42 连接容器 法一 docker e…...
Logisim实验--华科计算机组成原理(保姆级教程) 头歌-存储系统设计实验(汉字库存储芯片扩展实验、MIPS寄存器文件设计)
汉字库存储芯片扩展实验 电路一: 电路二:电路和译码器设置。 两个电路的分线器设计: 只要把电路正确连接就能提交了,但要看到正确的实验结果就想要进行如下操作: 打开参考电路,我要做的就是将每个存储器内…...
Hapi.js知识框架
一、Hapi.js 基础 1. 核心概念 企业级Node.js框架:由Walmart团队创建,现由社区维护 配置驱动:强调声明式配置而非中间件 插件架构:高度模块化设计 安全优先:内置安全最佳实践 丰富的生态系统:官方维护…...
Baklib知识中台架构与智能引擎实践
知识中台架构设计实践 在数字化转型进程中,Baklib基于企业级知识管理需求,构建了模块化分层架构的知识中台体系。该架构采用数据湖仓融合技术,通过统一元数据管理打通业务系统间的信息壁垒,形成覆盖数据采集、清洗、标注的全链路…...
传输层协议UDP
传输层 负责数据能够从发送端传输接收端 . 再谈端口号 端口号 (Port) 标识了一个主机上进行通信的不同的应用程序 ; 在 TCP/IP 协议中 , 用 " 源 IP", " 源端口号 ", " 目的 IP", " 目的端口号 ", " 协议号 " 这样一…...
在Java中实现Parcelable接口和Serializable接口有什么区别?
在 Java 中,Parcelable 和 Serializable 接口都用于对象的序列化和反序列化,但它们的实现方式、性能和使用场景有很大区别。以下是它们的核心对比: 1. 实现方式 Serializable 是 Java 原生接口,只需声明 implements Serializable…...
MinIO WebUI 页面使用
上传文件到桶,选择Share 如果桶是pulic权限,则可以有以下两种方式访问到该对象文件: http://ip:9001/api/v1/download-shared-object/aHR0cDovLzEyNy4wLjAuMTo5MDAwL3dhcmVob3VzZS9wYWltb24vRmxpbmstTG9nby5wbmc_WC1BbXotQWxnb3JpdGhtPUFXU…...