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

3D-resnet 50 医学3D图像二分类python代码

离上次发布3D-resnet代码时隔两年,最近让AI推荐3D-resnet的文章给我,AI推荐了三篇
其中两篇是我两年前发的,另一篇在这里Resnet3D预训练网络......
于是决定更新之前代码,供诸位参考1. 可以用cpu或gpu(推荐8G以上,已设置好CUDA参看)
2. 代码参考的腾讯的MedicalNet,预训练模型可以在腾讯微云下载(文件里有很多模型,选用resnet_50.pth这个)
3. 文件格式为常见的nii

文件夹格式如下

文件夹结构如下  |--data/:|   |--images/:# 原始图像|   |    |--1.nii.gz|   |    |--......|   |    |--n.nii.gz|	|--rois/: # ROI|   |    |--1.nii.gz|   |    |--......|   |    |--n.nii.gz|   |--test.txt # 外部验证数据列表|   |--train.txt# 训练数据列表|   |--val.txt  # 内部验证数据列表|--pretrain/:# 预训练模型|   |--resnet_50.pth|--trails/:  # 训练(finturn)后最好的模型|   |--best.pth|--train.py: train.txt等格式如下,三列分别为原始图像(绝对路径),ROI(绝对路径),以及标签(数字),空格分隔
E:\...\1.nrrd E:\...\1.nrrd 0
E:\...\2.nrrd E:\...\2.nrrd 1

代码

import torch
from torch import nn
import torchio as tio
import os
import numpy as np
from torch.utils.data import Dataset
from scipy import ndimage
from torch import optim
from torch.utils.data import DataLoader
import time
import nibabel
from sklearn.metrics import roc_curve, auc
'''
以下是可修改的参数部分
'''
no_cuda = True # 这里设置为True是使用cpu训练和验证,设置为False是使用gpu。action='store_true', help='If true, cuda is not used.
train_img_list = r'E:\project\3Dresnet\data\train.txt'  # type=str, help='Path of image list file for train'
val_img_list = r'E:\project\3Dresnet\data\val.txt'  # type=str, help='Path of image list file for validation
test_img_list = r'E:\project\3Dresnet\data\test.txt'  # type=str, help='Path of image list file for test'
pretrain_path = r'E:\project\3Dresnet\pretrain\resnet_50.pth'  # type=str, help='Path for pretrained model.'
save_folder = r'E:\project\3Dresnet\trails'  # type=str, help='Path for saving model.'
best_model_path = r'E:\project\3Dresnet\trails\best.pth' # type=str, help='the best trained model for test.'
total_epochs = 2  # type=int, help='Number of total epochs to run'
save_intervals = 10  # type=int, help='Interation for saving model'
learning_rate = 0.001  # set to 0.001 when finetune, type=float, help= 'Initial learning rate (divided by 10 while training by lr scheduler)'
new_layer_names = ['conv_cls'] # type=list, help='New layer except for backbone, used for transforlearn'
batch_size = 1  # type=int, help='Batch Size'
input_D = 56; input_H = 56; input_W = 56  # type=int, help='Input size of depth,height,width'
torch.manual_seed(1)
'''
以下不可修改
'''
class Bottleneck(nn.Module): # 瓶颈模块expansion = 4def __init__(self, inplanes, planes, stride=1, dilation=1, downsample=None):super(Bottleneck, self).__init__()self.conv1 = nn.Conv3d(inplanes, planes, kernel_size=1, bias=False)self.bn1 = nn.BatchNorm3d(planes)self.conv2 = nn.Conv3d(planes, planes, kernel_size=3, stride=stride, dilation=dilation, padding=dilation, bias=False)self.bn2 = nn.BatchNorm3d(planes)self.conv3 = nn.Conv3d(planes, planes * 4, kernel_size=1, bias=False)self.bn3 = nn.BatchNorm3d(planes * 4)self.relu = nn.ReLU(inplace=True)self.downsample = downsampleself.stride = strideself.dilation = dilationdef forward(self, x):residual = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out = self.relu(out)out = self.conv3(out)out = self.bn3(out)if self.downsample is not None:residual = self.downsample(x)out += residualout = self.relu(out)return out #
class ResNet(nn.Module):def __init__(self, block, layers, input_D, input_H, input_W):self.inplanes = 64super(ResNet, self).__init__()self.conv1 = nn.Conv3d(1, 64, kernel_size=7, stride=(2, 2, 2), padding=(3, 3, 3), bias=False)self.bn1 = nn.BatchNorm3d(64) # conv1的输出维度self.relu = nn.ReLU(inplace=True)self.maxpool = nn.MaxPool3d(kernel_size=(3, 3, 3), stride=2, padding=1) # H/2,W/2。C不变self.layer1 = self._make_layer(block, 64, layers[0]) # H,W不变。downsample控制的shortcut,out_channel=64x4=256self.layer2 = self._make_layer(block, 128, layers[1], stride=2) # H/2, W/2。downsample控制的shortcut,out_channel=128x4=512self.layer3 = self._make_layer(block, 256, layers[2], stride=1, dilation=2) # H/2, W/2。downsample控制的shortcut,out_channel=256x4=1024self.layer4 = self._make_layer(block, 512, layers[3], stride=1, dilation=4) # H/2, W/2。downsample控制的shortcut,out_channel=512x4=2048# 最后的分类层--------------------------------------------------------------------------------------self.conv_cls = nn.Sequential(nn.AdaptiveAvgPool3d((1, 1, 1)), nn.Flatten(),nn.Dropout(0.1),nn.Linear(in_features=512 * block.expansion, out_features=1, bias=True))for m in self.modules():if isinstance(m, nn.Conv3d):m.weight = nn.init.kaiming_normal_(m.weight, mode='fan_out')elif isinstance(m, nn.BatchNorm3d):m.weight.data.fill_(1)m.bias.data.zero_()def _make_layer(self, block, planes, blocks, stride=1, dilation=1):downsample = Noneif stride != 1 or self.inplanes != planes * block.expansion:downsample = nn.Sequential(nn.Conv3d(self.inplanes, planes * block.expansion, kernel_size=1, stride=stride, bias=False),nn.BatchNorm3d(planes * block.expansion))layers = []layers.append(block(self.inplanes, planes, stride=stride, dilation=dilation, downsample=downsample))self.inplanes = planes * block.expansion # 在下一次调用_make_layer函数的时候,self.in_channel已经x4for i in range(1, blocks):layers.append(block(self.inplanes, planes, dilation=dilation))return nn.Sequential(*layers) # '*'的作用是将list转换为非关键字参数传入def forward(self, x):x = self.conv1(x)x = self.bn1(x)x = self.relu(x)x = self.maxpool(x)x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)x = self.conv_cls(x)return x
def generate_model(input_D, input_H, input_W, pretrain_path, best_model_path, train):model = ResNet(Bottleneck, [3, 4, 6, 3], input_W=input_W, input_H=input_H, input_D=input_D)if not no_cuda:model = model.cuda()net_dict = model.state_dict()if train:print('loading pretrained model {}'.format(pretrain_path))if not no_cuda:model_weights = torch.load(pretrain_path, weights_only=True)model_weights = torch.load(pretrain_path, map_location=torch.device('cpu'), weights_only=True)else:print('loading best model {}'.format(best_model_path))if not no_cuda:model_weights = torch.load(best_model_path, weights_only=True)model_weights = torch.load(best_model_path, map_location=torch.device('cpu'), weights_only=True)model_dict = {k.replace("module.", ""): v for k, v in model_weights['state_dict'].items() if k.replace("module.", "") in net_dict.keys()}net_dict.update(model_dict) # 字典 dict2 的键/值对更新到 dict 里。model.load_state_dict(net_dict) # model.load_state_dict()函数把加载的权重复制到模型的权重中去new_parameters = [] #---这里设置base_parameters(低学习率用于finetune)和new_parameters(高学习率用于训练最后的分类层)使用不同的学习率for pname, p in model.named_parameters():for layer_name in new_layer_names:if pname.find(layer_name) >= 0:new_parameters.append(p)breaknew_parameters_id = list(map(id, new_parameters))base_parameters = list(filter(lambda p: id(p) not in new_parameters_id, model.parameters()))parameters = {'base_parameters': base_parameters, 'new_parameters': new_parameters}return model, parametersmodel, parameters = generate_model(input_D, input_H, input_W, pretrain_path, best_model_path, train = True)
params = [{'params': parameters['base_parameters'], 'lr': learning_rate },{'params': parameters['new_parameters'], 'lr': learning_rate*100}]
optimizer = torch.optim.SGD(params, momentum=0.9, weight_decay=1e-3) #--使用SGD优化学习率,也可以使用下面的Adam
# optimizer = torch.optim.Adam(params, weight_decay=1e-3)
scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99)
# 定义 3D 数据增强的变换操作
transform = tio.Compose([# 随机旋转图像,旋转角度范围为 -15 到 15 度,保持纵横比一致 以50%的概率进行旋转tio.RandomAffine(degrees=15,isotropic=True, p=0.5),# 随机裁剪(在指定区域内裁剪图像)# 裁剪到128x128x128的大小# 以50%的概率裁剪# tio.RandomCrop(subject_size=(128, 128, 128), p=0.5),# 随机改变亮度,调整亮度的范围# 强度范围# 以20%的概率进行亮度调整tio.RandomBiasField(coefficients=0.5, p=0.2 ),# 随机进行仿射变换,变换范围为一个小区间# X, Y, Z方向的平移范围 # 缩放比例tio.RandomAffine( translation=(5, 5, 5), scales=(0.8, 1.2), p=0.5),# 随机噪声,添加噪声# 噪声标准差tio.RandomNoise(mean=0, std=0.05, p=0.2),# 随机镜像翻转# 如果有多个键值,则对对应的键进行翻转# 在左右(LR), 前后(AP), 上下(SI)三个方向上随机翻转tio.RandomFlip( keys=["image"], axes=("LR", "AP", "SI"),p=0.5),# 随机缩放tio.RandomElasticDeformation(num_control_points=5, max_displacement=3, locked_borders=2, p=0.2)
])
class Dataset(Dataset):def __init__(self, img_list, input_D, input_H, input_W, train):with open(img_list, 'r') as f:self.img_list = [line.strip() for line in f]print("Processing {} datas".format(len(self.img_list)))self.input_D = input_Dself.input_H = input_Hself.input_W = input_Wdef __nii2tensorarray__(self, data):[z, y, x] = data.shapenew_data = np.reshape(data, [1, z, y, x])new_data = new_data.astype("float32")return new_datadef __len__(self):return len(self.img_list)def __getitem__(self, idx):ith_info = self.img_list[idx].split(" ")img_name = ith_info[0]mask_name = ith_info[1]label_name = ith_info[2]# print(img_name, mask_name, label_name)img = nibabel.load(img_name)assert img is not Nonemask = nibabel.load(mask_name)assert mask is not Noneassert img.get_fdata().shape == mask.get_fdata().shape, "img shape:{} is not equal to mask shape:{}".format(img.get_fdata().shape, mask.get_fdata().shape) # 判断 img和mask是否大小一致label = label_nameassert label is not Noneimg_array = self.__data_process__(img, mask)img_array = self.__nii2tensorarray__(img_array) # img to tensor arrayif train: # 训练集需要进行数据增强img_array = transform(img_array)label_array = torch.tensor([float(label)], dtype=torch.float32) # label to tensor arrayreturn img_array, label_arraydef __drop_invalid_range__(self, volume, mask):"""Cut off the invalid area,then get volume from mask"""masked_volume = np.zeros_like(volume)masked_volume[mask > 0] = volume[mask > 0]  # 将掩膜内部区域的图像数据复制到新数组中non_zeros_idx = np.where(volume == masked_volume)[max_z, max_h, max_w] = np.max(np.array(non_zeros_idx), axis=1)[min_z, min_h, min_w] = np.min(np.array(non_zeros_idx), axis=1)volume_dropped = masked_volume[min_z:max_z, min_h:max_h, min_w:max_w]return volume_droppeddef __itensity_normalize_one_volume__(self, volume):"""normalize the itensity of an nd volume based on the mean and std of nonzeor region"""pixels = volume[volume > 0]mean = pixels.mean()std = pixels.std()out = (volume - mean) / stdout_random = np.random.normal(0, 1, size=volume.shape)out[volume == 0] = out_random[volume == 0]return outdef __resize_data__(self, data):"""Resize the data to the input size"""[depth, height, width] = data.shapescale = [self.input_D * 1.0 / depth, self.input_H * 1.0 / height, self.input_W * 1.0 / width]data = ndimage.zoom(data, scale, order=0)return datadef __data_process__(self, data, mask):  # ------------------data = data.get_fdata()mask = mask.get_fdata()data = self.__drop_invalid_range__(data, mask)data = self.__resize_data__(data)data = self.__itensity_normalize_one_volume__(data)return data
def train(train_data_loader, model, optimizer, scheduler, total_epochs, save_interval, save_folder):# settingsbatches_per_epoch = len(train_data_loader)# log.info()print('{} epochs in total, {} batches per epoch'.format(total_epochs, batches_per_epoch))loss_seg = nn.BCEWithLogitsLoss() # ----分类任务使用if not no_cuda:loss_seg = loss_seg.cuda()train_time_sp = time.time()for epoch in range(total_epochs):# log.info('Start epoch {}'.format(epoch))print('Start epoch {}'.format(epoch))model.train()num_correct = 0val_num_correct = 0for batch_id, batch_data in enumerate(train_data_loader):# getting data batchbatch_id_sp = epoch * batches_per_epochvolumes, labels = batch_dataif not no_cuda:volumes = volumes.cuda()# Backward and optimizeoptimizer.zero_grad()out_labels = model(volumes)loss_value_seg = loss_seg(out_labels, labels)loss = loss_value_segloss.backward()optimizer.step()pred_labels = out_labels.argmax(dim=1)num_correct += torch.eq(pred_labels, labels).sum().float().item()avg_batch_time = (time.time() - train_time_sp) / (1 + batch_id_sp)print('Train Epoch: {}-{} ({}), loss = {:.3f}, loss_seg = {:.3f}, avg_batch_time = {:.3f}' \.format(epoch, batch_id, batch_id_sp, loss.item(), loss_value_seg.item(), avg_batch_time))print('acc: {}' \.format(num_correct / len(train_data_loader.dataset)))# save modelif batch_id == 0 and batch_id_sp != 0 and batch_id_sp % save_interval == 0:model_save_path = '{}_epoch_{}_batch_{}.pth.tar'.format(save_folder, epoch, batch_id)model_save_dir = os.path.dirname(model_save_path)if not os.path.exists(model_save_dir):os.makedirs(model_save_dir)print('Save checkpoints: epoch = {}, batch_id = {}'.format(epoch, batch_id))torch.save({'ecpoch': epoch,'batch_id': batch_id,'state_dict': model.state_dict(),'optimizer': optimizer.state_dict()},model_save_path)model.eval()for batch_id, batch_data in enumerate(val_data_loader):volumes, labels = batch_dataif not no_cuda:volumes = volumes.cuda()with torch.no_grad():out_labels = model(volumes)pred_labels = out_labels.argmax(dim=1)val_num_correct += torch.eq(pred_labels, labels).sum().float().item()print('acc: {}' \.format(val_num_correct / len(val_data_loader.dataset)))scheduler.step()print('lr = {}'.format(scheduler.get_last_lr()))print('Finished training')
def test(test_data_loader, model):out_labels = []labels = []model.eval() # for testingfor batch_id, batch_data in enumerate(test_data_loader):volumes, label = batch_dataif not no_cuda:volumes = volumes.cuda()with torch.no_grad():out_label = model(volumes)out_labels.append(out_label.cpu().item())labels.append(label.cpu().item())return labels, out_labelstraining_dataset = Dataset(train_img_list, input_D, input_H, input_W, train=True)
val_dataset = Dataset(val_img_list, input_D, input_H, input_W, train=False)
test_dataset = Dataset(test_img_list, input_D, input_H, input_W, train=False)
train_data_loader = DataLoader(training_dataset, batch_size, shuffle=True, pin_memory=True)
val_data_loader = DataLoader(val_dataset, batch_size, shuffle=True, pin_memory=True)
test_data_loader = DataLoader(test_dataset, batch_size, shuffle=True, pin_memory=True)#------------start train-------------------------
train(train_data_loader, model, optimizer, scheduler, total_epochs, save_interval=save_intervals, save_folder=save_folder)
#------------start test-------------------------
best_model, parameters = generate_model(input_D, input_H, input_W, pretrain_path, best_model_path, train = False)
labels, out_labels = test(test_data_loader, best_model)
fpr, tpr, thresholds = roc_curve(labels, out_labels)
roc_auc = auc(fpr, tpr)
print(roc_auc)

相关文章:

3D-resnet 50 医学3D图像二分类python代码

离上次发布3D-resnet代码时隔两年,最近让AI推荐3D-resnet的文章给我,AI推荐了三篇 其中两篇是我两年前发的,另一篇在这里Resnet3D预训练网络...... 于是决定更新之前代码,供诸位参考1. 可以用cpu或gpu(推荐8G以上&…...

android sqlite 数据库简单封装示例(java)

sqlite 数据库简单封装示例,使用记事本数据库表进行示例。 首先继承SQLiteOpenHelper 使用sql语句进行创建一张表。 public class noteDBHelper extends SQLiteOpenHelper {public noteDBHelper(Context context, String name, SQLiteDatabase.CursorFactory fact…...

项目练习:若依-前端项目的目录结构介绍

文章目录 一、目录截图二、目录讲解 一、目录截图 二、目录讲解 1、首先,我们可以看到,这个VUE项目,只有一个App.vue,所以,它是一个单页面系统。 这个App.vue是根组件,root组件。 2、public目录 在Vue 3.…...

Android 之 List 简述

一、简单创建方式 Android 开发中&#xff0c;列表有很多种类&#xff0c;如ArrayList、LinkedList、List、MutableList等&#xff0c;创建列表的方式如下所示&#xff1a; fun listDemo() {// 使用 listOf 创建不可变的空列表val list listOf<Int>()val list1 listOf…...

CV(6)-SIFT和Hash

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 SIFT:尺度不变特征变换&#xff1a; SIFT提取图像的局部特征&#xff0c;在尺度空间寻找极值点&#xff0c;并提取出其位置、尺度、方向信息。SIFT的应用范围包括物体辨别、机器人地图感知与导航、影像拼接、3D模型建立、手势…...

javax.net.ssl.SSLPeerUnverifiedException: Hostname 192.168.13.13 not verified:

javax.net.ssl.SSLPeerUnverifiedException: Hostname 192.168.13.13 not verified: 前言&#xff1a; 之前需求推送数据是采用http:192.168.13.13:8000 后面业务需求修改为 https:192.168.13.13:443 修改后推送数据到第三方报以下异常&#xff0c; https://192.168.13.13:443…...

用Unity做没有热更需求的单机游戏是否有必要使用AssetBundle?

在使用Unity开发没有热更需求的单机游戏时&#xff0c;是否使用AssetBundle&#xff08;AB包&#xff09;是一个值得探讨的问题。以下是对此问题的详细分析&#xff1a; 一、AssetBundle的概述 AssetBundle是Unity中用于存储和加载游戏资源的打包文件&#xff0c;可以包含各种…...

WebRTC Simulcast 大小流介绍与优化实践

Simulcast 是 WebRTC 中的一种标准化技术 &#xff0c;简称大小流。通过 Simulcast&#xff0c;客户端可以同时发送同一视频的多个版本。每个版本都以不同的分辨率和帧率独立编码&#xff0c;带宽较多的拉流端可以接收较高质量的视频流&#xff0c;带宽有限的拉流端则可以接收较…...

软件测试之测试用例

文章目录 测试用例测试用例的编写总结 测试用例 测试用例:描述测试点执行的文档(测试输入、执行条件、预期结果等) 作用 1.测试点能被精准执行 2.便于团队合作测试用例核心内容 用例编号、用例标题、所属模块、优先级、前置条件、测试步骤、测试数据、预期结果 测试用例的编写…...

Redis--通用命令学习

目录 一、引言 二、基础命令 1.set 2.get 3.keys 3.1 keys &#xff1f; 3.2 keys * 3.3 keys [abe] 3.4 keys [^] 3.5 keys [a-b] 4.exists 5.delete 6.expire 7.ttl 8.type 三、Redis中的过期策略&#xff08;面试题&#xff09; 1.惰性删除 2.定期删除 …...

自动控制系统综合与LabVIEW实现

自动控制系统综合是为了优化系统性能&#xff0c;确保其可靠性、稳定性和灵活性。常用方法包括动态性能优化、稳态误差分析、鲁棒性设计等。结合LabVIEW&#xff0c;可以通过图形化编程、高效数据采集与处理来实现系统综合。本文将阐述具体方法&#xff0c;并结合硬件选型提供实…...

一篇文章学会HTML

目录 页面结构 网页基本标签 图像标签 超链接标签 文本链接 图像链接 锚链接 功能链接 列表 有序列表 无序列表 自定义列表 表格 跨列/跨行 表头 媒体元素 视频 音频 网站的嵌套 表单 表单元素 文本框 单选框 多选框 按钮 下拉框 文本域和文件域 表…...

48页PPT|2024智慧仓储解决方案解读

本文概述了智慧物流仓储建设方案的行业洞察、业务蓝图及建设方案。首先&#xff0c;从政策层面分析了2012年至2020年间国家发布的促进仓储业、物流业转型升级的政策&#xff0c;这些政策强调了自动化、标准化、信息化水平的提升&#xff0c;以及智能化立体仓库的建设&#xff0…...

React Props 完整使用指南

React Props 完整使用指南 1. 类组件中的 Props 1.1 基本使用 // 父组件 class ParentComponent extends React.Component {render() {return (<ChildComponent name"John"age{25}isStudent{true}hobbies{[reading, swimming]}/>);} }// 子组件 class Child…...

金融数据可视化实现

一、设计题目 金融数据可视化 二、设计目的 使学生掌握用Pandas第三方库数据计算、数据分析的知识与能力。Pandas是专门用于数据分析的库&#xff0c;其提供的read_excel()方法可以方便的读取xlsx格式的文件中的数据到Pandas中的DataFrame中。 DataFrame.plot(kindline)&am…...

逆袭之路(6)——解析数据世界的灵动基石——变量

困厄铸剑心&#xff0c;逆袭展锋芒。 寒苦凝壮志&#xff0c;腾跃绘华章。 我要逆袭。 目录 一、引言 二、变量的定义 三、变量的性质 &#xff08;一&#xff09;可变性 &#xff08;二&#xff09;有界性 &#xff08;三&#xff09;关联性 四、变量的类型 &#xff…...

【云原生】kubeadm搭建的kubernetes1.28集群上自建ingress-nginx服务

1、查询兼容性 先确认下kubernetes版本与ingress-nginx版本兼容性 Ingress-NGINX 版本支持的 k8s 版本Alpine 版本Nginx 版本Helm Chart 版本v1.12.0-beta.01.31, 1.30, 1.29, 1.283.20.31.25.54.12.0-beta.0v1.11.31.30, 1.29, 1.28, 1.27, 1.263.20.31.25.54.11.3v1.11.21.3…...

分布式协同 - 分布式事务_TCC解决方案

文章目录 导图Pre流程图2PC VS 3PC VS TCC2PC&#xff08;Two-Phase Commit&#xff0c;二阶段提交&#xff09;3PC&#xff08;Three-Phase Commit&#xff0c;三阶段提交&#xff09;TCC&#xff08;Try-Confirm-Cancel&#xff09;2PC、3PC与TCC的区别2PC、3PC与TCC的联系 导…...

两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器

问题原因 remote-ssh还是有一些bug的&#xff0c;在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号&#xff0c;到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了...

SpringBoot3整合FastJSON2如何配置configureMessageConverters

在 Spring Boot 3 中整合 FastJSON 2 主要涉及到以下几个步骤&#xff0c;包括添加依赖、配置 FastJSON 作为 JSON 处理器等。下面是详细的步骤&#xff1a; 1. 添加依赖 首先&#xff0c;你需要在你的 pom.xml 文件中添加 FastJSON 2 的依赖。以下是 Maven 依赖的示例&#…...

数据库安全-redisCouchdb

1.redis未授权访问 默认端口:6379 1.1 Redis沙盒逃逸漏洞RCE-CVE-2022-0543 介绍&#xff1a;Redis 是一套开源的使用 ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库&#xff0c;并提供多种语言的API。Redis 如果在没有开启认证的情况下&#xff0c;…...

java如何使用poi-tl在word模板里渲染多张图片

1、poi-tl官网地址 http://deepoove.com/poi-tl/ 2、引入poi-tl的依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>3、定义word模板 释义&#xf…...

ASP.NET |日常开发中常见问题归纳讲解

ASP.NET &#xff5c;日常开发中常见问题归纳讲解 前言一、性能问题1.1 数据库访问性能1.2 视图状态&#xff08;在ASP.NET Web Forms 中&#xff09; 二、安全问题2.1 SQL 注入2.2 跨站脚本攻击&#xff08;XSS&#xff09; 三、状态管理问题3.1 会话状态&#xff08;Session …...

Jenkins安全部署规范及安全基线

Jenkins安全部署规范及安全基线 进入安全设置界面启用安全Disable remember me访问控制——安全域&#xff08;Security Realm&#xff09;servlet容器代理&#xff08;Delegate to servlet container&#xff09;Jenkins专有用户数据库&#xff08;Jenkins’ own user databas…...

stm32定时器输出比较----驱动步进电机

定时器输出比较理论 OC(Output Compare)输出比较输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出…...

文本文件和二进制文件

1.为什么使用文件 使用文件我们可以将数据直接存放在电脑的硬盘上&#xff0c;做到了数据的持久化。 2. 什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09…...

Linux 常见用例汇总

注&#xff1a;本文为 Linux 常见用例文章合辑。 部分内容已过时&#xff0c;未更新整理。 检查 Linux 上的 glibc 版本 译者&#xff1a;joeren | 2014-11-27 21:33 问&#xff1a;检查 Linux 系统上的 GNU C 库&#xff08;glibc&#xff09;的版本&#xff1f; GNU C 库&…...

R9000P键盘失灵解决办法

问题描述 突然&#xff0c;就是很突然&#xff0c;我买的R9000P 2024不到三个月&#xff0c;键盘突然都不能用了&#xff0c;是所有键盘按键都无效的那种。&#xff08;可以使用外接键盘&#xff09; 解决办法 我本科室友说的好哈&#xff0c;全坏全没坏。 &#xff08;该解…...

Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit

可以搭建属于公司内部或者个人的Git服务器&#xff0c;方便程序代码及文档版本管理。 官网&#xff1a;http://www.gitblit.com/ Windows环境下安装 提前已经安装好了JDK。 官网下载Windows版的GitBlit。 将zip包解压到自己想要放置的文件夹下。 建立版本库路径&#xff0c…...

《Web 应用项目开发:从构思到上线的全过程》

目录 一、引言 二、项目启动与需求分析 三、设计阶段 四、技术选型 五、开发阶段 六、测试阶段 七、部署与上线 八、维护与更新 九、总结 一、引言 在数字化浪潮席卷全球的当下&#xff0c;Web 应用如繁星般在互联网的苍穹中闪烁&#xff0c;它们形态各异&#xff0c…...

ctf相关总结

CTF比赛定义&#xff1a; CTF&#xff08;Capture The Flag&#xff09;是一种信息安全竞赛形式&#xff0c;参赛队伍通过破解题目获取flag来得分。 比赛流程&#xff1a; 参赛队伍在题目平台上登录&#xff0c;选择题目进行解答&#xff0c;提交flag后由系统自动评分。 三…...

v3s点RGB屏 40pin 800x480,不一样的点屏,不通过chosen。

一、背景、目的、简介。 一般来说&#xff0c;通过uboot将屏幕参数传给kernel&#xff0c;是通过修改设备树。 uboot和kernel都需要屏幕点亮。uboot侧重于显示一张图片。而kernel则多是动画。 在这里&#xff0c;我先是找到了一个裸机点屏的代码。将其编译成静态库后&#x…...

学习笔记(prism--视频【WPF-prism核心教程】)--待更新

《一》框架介绍 prism是一个用于WPF…和winUI中构建的松散耦合&#xff0c;可维护和可测试的应用程序框架。帮助WPF开发人员以简化编写&#xff0c;维护和扩展来设计应用程序。 优点&#xff1a;遵循特定的约定&#xff0c;可自动将view/ViewModel建立DataContext的关系&#…...

从AI换脸到篡改图像,合合信息如何提升视觉内容安全?

本文目录 引言一、AI“真假之战”下的发展现状与考验挑战1.1 视觉内容安全现状与技术分类1.2视觉内容安全企业1.3视觉内容安全领域挑战 二、开山之石&#xff1a;引领视觉内容安全的创新之路2.1合合内容安全系统2.2发起编制相关技术规范2.3参与篡改检测挑战赛 三、视觉内容安全…...

12.12【java exp4】react table全局搜索tailwindcss 布局 (Layout) css美化 3. (rowId: number

react table 创建一个下拉菜单&#xff0c;允许用户选择要搜索的列。创建一个输入框&#xff0c;用于输入搜索关键词。根据用户的选择&#xff0c;动态地应用过滤器到指定的列 全局搜索 import React from react; import { useTable, useFilters, useGlobalFilter, useSortBy…...

‘pnpm’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

‘pnpm’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 1.情况: npm -v 和 node -v的都正常就是 pnpm-v 无效 检查环境变量也没看出问题 2.分析 没有正确添加环境变量 3.解决 找到npm的全局安装目录 npm list -g --depth 0这里出现了npm的全局安装…...

频繁拿下定点,华玉高性能中间件迈入商业化新阶段

伴随着智能驾驶渗透率的快速增长&#xff0c;中国基础软件市场开始进入黄金窗口期。 近日&#xff0c;华玉通软&#xff08;下称“华玉”&#xff09;正式获得某国内头部轨道交通产业集团的智能化中间件平台定点项目。这将是华玉在基础软件领域深耕和商业化发展过程中的又一重…...

装饰者模式

代码详解&#xff1a;【设计模式】Java 设计模式之装饰者模式&#xff08;Decorator&#xff09;_java 装饰者模式-CSDN博客 // 抽象构件角色 public interface Component {void operation(); }// 具体构件角色 public class ConcreteComponent implements Component {Override…...

【河南新标】豫财预〔2024〕105号-《关于省级政务信息化建设项目支出预算标准的规定》-费用标准解读系列29

2024年12月3日&#xff0c;河南省财政厅发布了《关于省级政务信息化建设项目支出预算标准的规定》豫财预〔2024〕105号。《关于省级政务信息化建设项目支出预算标准的规定 &#xff08;试行&#xff09;》&#xff08;豫财预 〔2020〕81号&#xff09;同时废止。新的豫财预〔20…...

Android 蓝牙开发-传输数据

概述 传统蓝牙是通过建立REFCCOM sockect来进行通信的&#xff0c;类似于socket通信&#xff0c;一台设备需要开放服务器套接字并处于listen状态&#xff0c;而另一台设备使用服务器的MAC地址发起连接。连接建立后&#xff0c;服务器和客户端就都通过对BluetoothSocket进行读写…...

使用VSCode Debugger 调试 React项目

一般我们调试代码时&#xff0c;用的最多的应该就是console.log方式了&#xff0c;还有的是使用Chrome DevTools 通过在对应的 sourcemap代码位置打断点进行调试&#xff0c;除了上面两种方式外还有一种更好用的调试方式&#xff1a; VSCode Debugger。 VSCode Debugger可以直…...

ArcGIS Pro 3.4新功能3:空间统计新特性,基于森林和增强分类与回归,过滤空间自相关

目录 应用 1&#xff1a;它是相关性还是托布勒第一定律&#xff1f; 应用 2&#xff1a;将空间带入非空间模型 结论 在 ArcGIS Pro 3.4 中&#xff0c;我们在新的空间组件实用程序&#xff08;Moran 特征向量&#xff09;工具集中发布了一个新工具 - 从字段过滤空间自相关。…...

Flink SQL Cookbook on Zeppelin 部署使用

简介&#xff1a;对于初学者来说&#xff0c;学习 Flink 可能不是一件容易的事情。看文档是一种学习&#xff0c;更重要的是实践起来。但对于一个初学者来说要把一个 Flink SQL 跑起来还真不容易&#xff0c;要搭各种环境&#xff0c;真心累。很幸运的是&#xff0c;Flink 生态…...

用二进制方式向文件读写一组数据

【例10.4】从键盘输入10个学生的有关数据&#xff0c;然后把它们转存到磁盘文件上去。 #include<stdio.h> struct Student{char name[20];int number;int age; }; int main(){int i;struct Student stu;FILE *fp;fp fopen("1.txt","wb");if(fp N…...

WebChat——一个开源的聊天应用

Web Chat 是开源的聊天系统&#xff0c;支持一键免费部署私人Chat网页的应用程序。 开源地址&#xff1a;https://github.com/loks666/webchat 目录树 TOC ??? 开始使用 & 交流?? 开箱即用 [这里是代码001] 使用 Docker 部署[这里是代码002] 使用 Docker-compose …...

易语言 OCR 文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…...

12.19问答解析

概述 某中小型企业有四个部门&#xff0c;分别是市场部、行政部、研发部和工程部&#xff0c;请合理规划IP地址和VLAN&#xff0c;实现企业内部能够互联互通&#xff0c;同时要求市场部、行政部和工程部能够访问外网环境(要求使用OSPF协议)&#xff0c;研发部不能访问外网环境…...

重温设计模式--设计模式七大原则

文章目录 1、开闭原则&#xff08;Open - Closed Principle&#xff0c;OCP&#xff09;定义&#xff1a;示例&#xff1a;好处&#xff1a; 2、里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;定义&#xff1a;示例&#xff1a;好处&#…...

【Python-中级】Python中的线程池:ThreadPoolExecutor

Python中的线程池:from concurrent.futures import ThreadPoolExecutor 在Python中,实现多线程编程的方法有很多,而ThreadPoolExecutor 是一个简单且高效的线程池工具。它提供了高层次的接口,用于并发地运行任务,同时隐藏了许多复杂的底层细节,非常适合日常的多线程任务…...

【终端工具】FinalShell v4.5.12 官方版

1.下载地址 【终端工具】FinalShell v4.5.12 官方版 2.简介 FinalShell是一款免费的跨平台远程管理工具&#xff0c;专为开发者和运维人员设计。它支持通过 SSH、SFTP 等方式连接到 Linux 和 Windows 服务器&#xff0c;提供类似于终端的操作界面。除了常规的远程登录功能&a…...