让大模型帮我设计crnn网络及可运行demo,gpt4o豆包qwendeepseek-r1
prompt
使用 crnn 提取图像特征,给出图像好坏的二分类结果,写清楚代码备注,注释清楚向量维度大小,并给出一个可运行的 demo
1、GPT-4o
以下是一个使用 CRNN(Convolutional Recurrent Neural Network)提取图像特征并进行二分类的完整代码示例。我们将使用 PyTorch 框架来实现。代码中会包含详细的注释,解释每一步的操作和向量维度变化。
1. 安装依赖
首先,确保你已经安装了 PyTorch 和 torchvision。如果没有安装,可以使用以下命令安装:
pip install torch torchvision
2. 代码实现
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms, datasets
import numpy as np
import matplotlib.pyplot as plt# 设置随机种子,确保结果可复现
torch.manual_seed(42)# 定义一个简单的自定义数据集(用于演示)
class SimpleImageDataset(Dataset):def __init__(self, num_samples=1000, img_size=(32, 32)):self.num_samples = num_samplesself.img_size = img_sizeself.data = []self.labels = []# 生成随机图像数据for _ in range(num_samples):# 随机生成图像(0-1之间的浮点数)img = np.random.rand(*img_size).astype(np.float32)# 随机生成标签(0 或 1)label = np.random.randint(0, 2)self.data.append(img)self.labels.append(label)def __len__(self):return self.num_samplesdef __getitem__(self, idx):# 返回图像和标签img = self.data[idx]label = self.labels[idx]# 将图像转换为 PyTorch 张量,并添加通道维度 (1, H, W)img = torch.tensor(img).unsqueeze(0) # (1, H, W)label = torch.tensor(label).long() # 标签为整数return img, label# 定义 CRNN 模型
class CRNN(nn.Module):def __init__(self, input_channels=1, num_classes=2):super(CRNN, self).__init__()# 卷积层self.conv = nn.Sequential(nn.Conv2d(input_channels, 16, kernel_size=3, stride=1, padding=1), # (B, 16, H, W)nn.ReLU(),nn.MaxPool2d(2, 2), # (B, 16, H/2, W/2)nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), # (B, 32, H/2, W/2)nn.ReLU(),nn.MaxPool2d(2, 2) # (B, 32, H/4, W/4))# RNN 层self.rnn_input_size = 32 * (img_size[1] // 4) # RNN 输入大小 = 通道数 * 宽度self.rnn = nn.LSTM(self.rnn_input_size, 128, batch_first=True, bidirectional=True) # 双向 LSTM# 全连接层self.fc = nn.Linear(128 * 2, num_classes) # 双向 LSTM 输出大小为 128 * 2def forward(self, x):# 输入 x 的形状: (B, C, H, W)batch_size = x.size(0)# 卷积层x = self.conv(x) # (B, 32, H/4, W/4)# 调整形状以适配 RNN 输入x = x.permute(0, 2, 3, 1) # (B, H/4, W/4, 32)x = x.view(batch_size, -1, self.rnn_input_size) # (B, H/4, 32 * W/4)# RNN 层x, _ = self.rnn(x) # (B, H/4, 128 * 2)# 取最后一个时间步的输出x = x[:, -1, :] # (B, 128 * 2)# 全连接层x = self.fc(x) # (B, num_classes)return x# 设置超参数
img_size = (32, 32) # 图像大小
batch_size = 16
num_epochs = 5
learning_rate = 0.001# 创建数据集和数据加载器
dataset = SimpleImageDataset(num_samples=1000, img_size=img_size)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)# 初始化模型、损失函数和优化器
model = CRNN(input_channels=1, num_classes=2)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 训练模型
for epoch in range(num_epochs):model.train()total_loss = 0for images, labels in dataloader:# 前向传播outputs = model(images)loss = criterion(outputs, labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item()print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {total_loss/len(dataloader):.4f}")# 测试模型
model.eval()
with torch.no_grad():# 从数据集中取一个样本进行测试test_img, test_label = dataset[0]test_img = test_img.unsqueeze(0) # 添加 batch 维度 (1, 1, H, W)output = model(test_img)predicted_label = torch.argmax(output, dim=1).item()print(f"True Label: {test_label}, Predicted Label: {predicted_label}")# 可视化测试图像plt.imshow(test_img.squeeze(0).squeeze(0), cmap="gray")plt.title(f"Predicted: {predicted_label}, True: {test_label}")plt.show()
3. 代码说明
-
数据集:
- 使用了一个简单的自定义数据集
SimpleImageDataset,生成随机图像和二分类标签。 - 图像大小为
(32, 32),标签为0或1。
- 使用了一个简单的自定义数据集
-
CRNN 模型:
- 卷积层提取图像的空间特征。
- RNN 层(LSTM)处理序列特征,输入为卷积层输出的特征序列。
- 全连接层将 RNN 的输出映射到二分类结果。
-
训练:
- 使用交叉熵损失函数
CrossEntropyLoss。 - 优化器为 Adam。
- 使用交叉熵损失函数
-
测试:
- 从数据集中取一个样本,使用训练好的模型进行预测,并可视化结果。
4. 运行结果
运行代码后,你会看到训练过程中的损失值,以及测试样本的预测结果和真实标签。测试图像会以灰度图形式显示。
如果你有任何问题或需要进一步的帮助,请随时告诉我! 😊
2、豆包-1.5pro
下面是一个基于PyTorch框架实现的使用CRNN(Convolutional Recurrent Neural Network)进行图像二分类的示例代码。这个示例假设输入图像为正方形且为灰度图。对于彩色图像,可以简单修改卷积层以便处理3通道数据。
1. 引入必要的库
import torch
import torch.nn as nn
import torchvision.transforms as transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader
import torch.optim as optim
from PIL import Image# 用于图像预处理
transform = transforms.Compose([transforms.Resize((32, 32)),transforms.Grayscale(),transforms.ToTensor(),# 将图像数据标准化到[-1, 1]transforms.Normalize((0.5,), (0.5,))
])
2. 定义CRNN模型
class CRNN(nn.Module):def __init__(self):super(CRNN, self).__init__()# 卷积层1,输入通道数1(灰度图),输出通道数16,卷积核大小3x3,步长1,填充1self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1)self.relu1 = nn.ReLU()# 最大池化层1,窗口大小2x2,步长2self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)# 卷积层2,输入通道数16,输出通道数32,卷积核大小3x3,步长1,填充1self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)self.relu2 = nn.ReLU()# 最大池化层2,窗口大小2x2,步长2self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)# 展平层,将多维张量展平为一维self.flatten = nn.Flatten()# RNN层,这里使用GRU,输入特征维度32 * 8 * 8 ,隐藏层维度64,1层self.gru = nn.GRU(input_size=32 * 8 * 8, hidden_size=64, num_layers=1, batch_first=True)# 全连接层,将GRU输出的64维向量映射到2维(2个类别)self.fc = nn.Linear(64, 2)def forward(self, x):x = self.pool1(self.relu1(self.conv1(x)))x = self.pool2(self.relu2(self.conv2(x)))x = self.flatten(x)x = x.unsqueeze(1)x, _ = self.gru(x)# 只取GRU最后一个时刻的输出x = x[:, -1, :]x = self.fc(x)return x
3. 定义训练过程
# 创建数据加载器,假设数据按类别存放在data/train目录下
train_dataset = ImageFolder(root='data/train', transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)# 创建模型实例
model = CRNN()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
num_epochs = 10
for epoch in range(num_epochs):running_loss = 0.0correct = 0total = 0for i, data in enumerate(train_loader, 0):inputs, labels = dataoptimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Epoch {epoch + 1}, Loss: {running_loss / len(train_loader)}, 'f'Accuracy: {correct / total * 100}%')
4. 定义预测过程
# 创建测试集数据加载器,假设数据按类别存放在data/test目录下
test_dataset = ImageFolder(root='data/test', transform=transform)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)# 评估模型
correct = 0
total = 0
with torch.no_grad():for data in test_loader:images, labels = dataoutputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Accuracy of the network on the test images: {correct / total * 100}%')def predict_single_image(image_path, model):img = Image.open(image_path).convert('L')img = transform(img).unsqueeze(0)with torch.no_grad():output = model(img)_, predicted = torch.max(output.data, 1)return predicted.item()
5. 运行预测
# 预测单个图像,这里假设image.jpg是需要预测的图像
predicted_class = predict_single_image('image.jpg', model)
print(f'Predicted class for single image: {predicted_class}')
代码说明
- 图像预处理:使用
transforms.Compose将图像调整大小为32x32,转换为灰度图,然后转换为张量并进行标准化。 - CRNN模型:
- 卷积层部分:使用了两个
Conv2d层和对应的ReLU激活函数以及MaxPool2d池化层进行特征提取。Conv2d层用于学习图像的局部特征,池化层用于降低数据维度。 - RNN层部分:将卷积层输出的数据展平后输入到
GRU层,学习序列特征(此处将图像数据看成一个序列)。 - 全连接层:将GRU层的输出映射到2个类别,输出最终的分类结果。
- 卷积层部分:使用了两个
- 训练过程:
- 加载训练数据集,使用
ImageFolder和DataLoader按批次加载数据。 - 定义损失函数(
CrossEntropyLoss)和优化器(Adam)。 - 在每个epoch中,前向传播计算损失,反向传播更新模型参数,并打印每个epoch的损失和准确率。
- 加载训练数据集,使用
- 预测过程:
- 加载测试数据集,对测试集进行评估并打印准确率。
predict_single_image函数用于对单个图像进行预测,返回预测的类别。
请确保安装了torch、torchvision和Pillow库,可以使用以下命令安装:
pip install torch torchvision pillow
测试和训练数据集的目录结构应如下:
data/
├── train/
│ ├── good_images/
│ │ ├── image1.jpg
│ │ ├── image2.jpg
│ │ └──...
│ └── bad_images/
│ ├── image3.jpg
│ ├── image4.jpg
│ └──...
└── test/├── good_images/│ ├── image5.jpg│ ├── image6.jpg│ └──...└── bad_images/├── image7.jpg├── image8.jpg└──...
在实际应用中,你可以根据具体的数据集和任务需求调整模型架构、超参数等。
3、Qwen-2.5
好的,下面是一个使用CRNN(卷积循环神经网络)提取图像特征并用于二分类任务的PyTorch示例代码。我们将使用一个简单的CRNN模型来实现这个任务。代码中会包含详细的注释说明每一步的操作和向量维度的变化。
首先,确保你已经安装了必要的库:
pip install torch torchvision
以下是完整的代码示例:
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import transforms, datasets
from torch.utils.data import DataLoader# 定义CRNN模型
class CRNN(nn.Module):def __init__(self, num_classes=2, input_size=1024, hidden_size=512, num_layers=2):super(CRNN, self).__0__init__()self.num_classes = num_classesself.hidden_size = hidden_sizeself.num_layers = num_layers# 卷积层self.conv = nn.Sequential(nn.Conv2d(3, 64, kernel_size=(3, 3), padding=(1, 1)),nn.ReLU(),nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2)), # (B, 64, H/2, W/2)nn.Conv2d(64, 128, kernel_size=(3, 3), padding=(1, 1)),nn.ReLU(),nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2)), # (B, 128, H/4, W/4)nn.Conv2d(128, 256, kernel_size=(3, 3), padding=(1, 1)),nn.ReLU(),nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2)), # (B, 256, H/8, W/8)nn.Conv2d(256, 512, kernel_size=(3, 3), padding=(1, 1)),nn.ReLU(),nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2)) # (B, 512, H/16, W/16))# 计算经过卷积层后的输出尺寸self.fc_input_size = 512 * (32 // 16) * (32 // 16) # 假设输入图像大小为 (B, 3, 32, 32)# 全连接层self.fc = nn.Linear(self.fc_input_size, input_size)# 循环层self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)# 输出层self.fc_out = nn.Linear(hidden_size, num_classes)def forward(self, x):# 卷积层conv_out = self.conv(x) # (B, 512, H/16, W/16)batch_size, channels, height, width = conv_out.size()# 展平conv_out = conv_out.view(batch_size, channels * height, width) # (B, 512*(H/16), W/16)# 全连接层conv_out = conv_out.permute(0, 2, 1) # (B, W/16, 512*(H/16))fc_out = self.fc(conv_out) # (B, W/16, input_size)# 循环层out, _ = self.lstm(fc_out) # (B, W/16, hidden_size)# 取最后一个时间步的输出out = out[:, -1, :] # (B, hidden_size)# 输出层out = self.fc_out(out) # (B, num_classes)return out# 数据预处理
transform = transforms.Compose([transforms.Resize((32, 32)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 加载数据集
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)# 初始化模型、损失函数和优化器
model = CRNN(num_classes=2, input_size=1024, hidden_size=512, num_layers=2)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
num_epochs = 10
for epoch in range(num_epochs):model.train()for i, (images, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()if (i + 1) % 100 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')# 验证模型model.eval()with torch.no_grad():correct = 0total = 0for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Epoch [{epoch+1}/{num_epochs}], Accuracy: {100 * correct / total:.2f}%')# 保存模型
torch.save(model.state_dict(), 'crnn_model.pth')
代码说明
-
CRNN模型定义:
- 卷积层:使用四个卷积层,每个卷积层后跟着一个ReLU激活函数和一个最大池化层。
- 全连接层:将卷积层的输出展平后通过一个全连接层。
- 循环层:使用LSTM层处理时间序列数据。
- 输出层:将LSTM的输出通过一个全连接层得到最终的分类结果。
-
数据预处理:
- 使用
transforms对图像进行标准化和resize操作。
- 使用
-
数据加载:
- 使用
datasets.CIFAR10加载CIFAR-10数据集,并创建数据加载器。
- 使用
-
训练和验证:
- 在每个epoch中,先对模型进行训练,然后在测试集上进行验证,计算分类准确率。
-
保存模型:
- 训练完成后,保存模型的参数到文件。
希望这个示例对你有帮助!如果有任何问题,欢迎随时提问。
4、deepseek-r1:
以下是一个使用CRNN(卷积递归神经网络)进行图像分类的完整代码示例,包括详细的注释和可运行的demo。代码使用PyTorch框架实现。
1. 环境要求
- Python 3.x
- PyTorch 1.x
- torchvision
- matplotlib(可选,用于可视化)
2. 代码实现
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, datasets
import numpy as np
import matplotlib.pyplot as plt# 定义CRNN模型
class CRNN(nn.Module):def __init__(self, num_classes):super(CRNN, self).__init__()# CNN部分self.cnn = nn.Sequential(# 第一层卷积nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=1, padding=1),# 输出维度:(32, 224, 224)nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2),# 输出维度:(32, 112, 112)# 第二层卷积nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1),# 输出维度:(64, 112, 112)nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2)# 输出维度:(64, 56, 56))# RNN部分self.rnn = nn.Sequential(# LSTM层nn.LSTM(input_size=64*56, hidden_size=128, num_layers=2, batch_first=True))# 分类器self.fc = nn.Linear(128, num_classes)def forward(self, x):# CNN特征提取x = self.cnn(x) # 输出维度:(batch_size, 64, 56, 56)# 将CNN输出展平并调整维度以适应RNNbatch_size = x.size(0)x = x.view(batch_size, -1, 64*56) # 输出维度:(batch_size, 56, 64*56)# RNN处理x, _ = self.rnn(x) # 输出维度:(batch_size, 56, 128)# 取最后一个时间步的输出x = x[:, -1, :] # 输出维度:(batch_size, 128)# 分类x = self.fc(x) # 输出维度:(batch_size, num_classes)return x# 定义数据预处理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])
])# 自定义数据集(假设数据分为good和bad两类)
class ImageDataset(Dataset):def __init__(self, root_dir, transform=None):self.root_dir = root_dirself.transform = transformself.images = []self.labels = []# 加载good图像good_dir = f"{root_dir}/good"for img_name in os.listdir(good_dir):if img_name.endswith('.jpg'):self.images.append(f"{good_dir}/{img_name}")self.labels.append(0) # good为0# 加载bad图像bad_dir = f"{root_dir}/bad"for img_name in os.listdir(bad_dir):if img_name.endswith('.jpg'):self.images.append(f"{bad_dir}/{img_name}")self.labels.append(1) # bad为1def __len__(self):return len(self.images)def __getitem__(self, idx):img_path = self.images[idx]label = self.labels[idx]image = Image.open(img_path).convert('RGB')if self.transform:image = self.transform(image)return image, label# 数据加载
train_dataset = ImageDataset(root_dir="path_to_train_data", transform=transform)
val_dataset = ImageDataset(root_dir="path_to_val_data", transform=transform)
test_dataset = ImageDataset(root_dir="path_to_test_data", transform=transform)train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)# 初始化模型
model = CRNN(num_classes=2)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练循环
num_epochs = 10for epoch in range(num_epochs):model.train()running_loss = 0.0for images, labels in train_loader:# 前向传播outputs = model(images)loss = criterion(outputs, labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()# 打印训练损失print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader)}")# 验证model.eval()val_loss = 0.0val_correct = 0with torch.no_grad():for images, labels in val_loader:outputs = model(images)loss = criterion(outputs, labels)val_loss += loss.item()_, predicted = torch.max(outputs.data, 1)val_correct += (predicted == labels).sum().item()val_accuracy = val_correct / len(val_dataset)print(f"Validation Loss: {val_loss/len(val_loader)}, Accuracy: {val_accuracy}")# 测试
model.eval()
test_correct = 0
with torch.no_grad():for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)test_correct += (predicted == labels).sum().item()test_accuracy = test_correct / len(test_dataset)
print(f"Test Accuracy: {test_accuracy}")# 可视化示例
def visualize_example():# 加载测试图像test_images, test_labels = next(iter(test_loader))outputs = model(test_images)_, predicted = torch.max(outputs.data, 1)plt.figure(figsize=(16, 8))for i in range(4):plt.subplot(2, 4, i+1)img = test_images[i].numpy().transpose(1, 2, 0)img = (img * [0.229, 0.224, 0.225]) + [0.485, 0.456, 0.406]plt.imshow(img)plt.title(f"Predicted: {predicted[i].item()}, Actual: {test_labels[i].item()}")plt.axis('off')plt.show()visualize_example()
3. 代码说明
1. 模型结构
- CNN部分:用于提取图像特征,包含两个卷积层和两个最大池化层。
- RNN部分:使用LSTM处理序列特征,提取时序信息。
- 分类器:全连接层用于最终分类。
2. 数据预处理
- 图像resize到224x224
- 转换为Tensor
- 标准化处理
3. 数据集
- 自定义数据集类
ImageDataset,支持自定义数据路径。 - 数据分为
good和bad两类,分别对应标签0和1。
4. 训练与验证
- 使用交叉熵损失函数
CrossEntropyLoss - 优化器选择Adam
- 每个epoch进行训练和验证,打印损失和准确率。
5. 测试与可视化
- 在测试集上评估模型性能。
- 随机选择4张测试图像进行可视化,显示预测结果与真实标签。
4. 使用说明
- 替换
path_to_train_data、path_to_val_data和path_to_test_data为实际数据路径。 - 确保数据目录结构如下:
train_data/good/img1.jpgimg2.jpg...bad/imgA.jpgimgB.jpg... val_data/good/...bad/... test_data/good/...bad/... - 运行代码,训练模型并查看结果。
5. 依赖安装
pip install torch torchvision matplotlib
希望这段代码对您有所帮助!如果需要进一步调整或优化,可以根据具体需求修改网络结构、优化器参数或数据预处理步骤。
相关文章:
让大模型帮我设计crnn网络及可运行demo,gpt4o豆包qwendeepseek-r1
prompt 使用 crnn 提取图像特征,给出图像好坏的二分类结果,写清楚代码备注,注释清楚向量维度大小,并给出一个可运行的 demo1、GPT-4o 以下是一个使用 CRNN(Convolutional Recurrent Neural Network)提取图…...
代码随想录-- 第一天图论 --- 岛屿的数量
99 统计岛屿的数量 c 99. 岛屿数量 #include <iostream> #include <vector> #include <queue>using namespace std;struct MGraph {int numVertices, numEdges;vector<vector<int>> Edge; };int dir[4][2] {{1, 0}, {0, 1}, {-1, 0}, {0, -1}…...
Mybatis MyBatis框架的缓存 一级缓存
1. 缓存的概念 缓存的概念 在内存中临时存储数据,速度快,可以减少数据库的访问次数。经常需要查询,不经常修改的数据,不是特别重要的数据都适合于存储到缓存中。 2.Mybatis缓存 mybatis包含了一个非常强大的查询缓存特性&#…...
Weboffice在线Word权限控制:限制编辑,只读、修订、禁止复制等
在现代企业办公中,文档编辑是一项常见且重要的任务。尤其是在线办公环境中,员工需要在网页中打开和编辑文档,但如何确保这些文档只能进行预览而无法被编辑或复制,成为许多企业面临的一个痛点。尤其是在处理涉密文档时,…...
RT-Thread+STM32L475VET6实现呼吸灯
文章目录 前言一、板载资源资源说明二、具体步骤1.新建rt_thread项目2. 打开PWM设备驱动3. 在Stm32CubeMX配置定时器3.1打开Stm32CubeMX3.2 使用外部高速时钟,并修改时钟树3.3打开定时器1,并配置通道一为PWM输出模式(定时器根据自己需求调整)3.4 打开串口…...
【Web前端开发精品课 HTML CSS JavaScript基础教程】第二十四章课后题答案
文章目录 问题1:问题2:问题3: 问题1: 在HTML中嵌入JavaScript,应该使用的标签是( )。 选项: A. <style></style> B. <script></script> C. <js><…...
记录 pycharm 无法识别提示导入已有的模块解决方案 No module named ‘xxx‘
在windows下,使用pycharm开发项目,每个项目都有自己独立的虚拟环境,有时候就会出现,在该项目中明明已经安装了某个模块,但是在写代码的时候就是导入不了,无法识别导入,在运行的时候却又是正常的…...
网工项目实践2.6 广域网需求分析及方案制定
本专栏持续更新,整一个专栏为一个大型复杂网络工程项目。阅读本文章之前务必先看《本专栏必读》。 全网拓扑展示 一.广域网互联方式 1.专线 优点 稳定 独享。绝对安全。可靠性高,带宽高,完全取决于终端接口。 缺点: 费用高。建设时间长。难…...
【架构】分层架构 (Layered Architecture)
一、分层模型基础理论 模型是一种常见的软件设计架构,它将软件系统按照功能划分为不同的层次,每个层次都有特定的职责和功能…...
玩客云 IP查找
1.玩客云使用静态IP在不同网段路由器下不能使用,动态不好找IP地址 1.1使用python3 实现自动获取发送 import requests import os import socket# 从环境变量获取 PushPlus 的 token 和群组编码 PUSH_PLUS_TOKEN os.getenv("PUSH_PLUS_TOKEN") PUSH_PLU…...
Android - Handler使用post之后,Runnable没有执行
问题:子线程创建的Handler。如果 post 之后,在Handler.removeCallbacks(run)移除了,下次再使用Handler.postDelayed(Runnable)接口或者使用post时,Runnable是没有执行。导致没有收到消息。 解决办法:只有主线程创建的…...
MyBatis-Plus之通用枚举
MyBatis-Plus之通用枚举 前言 MyBatis-Plus中提供了通用枚举,简单来说就是将数据库中的某一字段的代替的含义转换成真实的含义将数据展示给用户,用户在存储时也会将真实值转换成代替的数字存入到数据库中。举个例子:用户性别在数据库中存储…...
基于Spring Boot的图书管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
如何在 VS Code 中快速使用 Copilot 来辅助开发
在日常开发中,编写代码往往是最耗时的环节之一。而 GitHub Copilot,作为一款 AI 编码助手,可以帮助开发者 自动补全代码、生成代码片段,甚至直接编写完整的函数,大幅提升编码效率。那么,如何在 VS Code 中快…...
12.1 Android中协程的基本使用
文章目录 前言1、导入依赖2、使用协程获取服务器中的数据2.1 定义请求回调结果的数据类2.2 网络请求 3、网络回调结构4、通过ViewModel处理网络请求数据 前言 在使用协程的时候一直没有一个具体的概念,只知道协程能够使得异步操作等同于同步操作,且不会…...
【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步
【黑马点评优化】2-Canel实现多级缓存(RedisCaffeine)同步 0 背景1 配置MySQL1.1 开启MySQL的binlog功能1.1.1 找到mysql配置文件my.ini的位置1.1.2 开启binlog 1.2 创建canal用户 2 下载配置canal2.1 canal 1.1.5下载2.2 配置canal2.3 启动canal2.4 测试…...
php-fpm
摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器,管理PHP的FastCGI进程,提升PHP应用的性能和稳定性 php-fpm是一个高性能的php FastCGI管理器,提供了更好的php进程管理方式,可以有效的控制内存和进程,支…...
Python3测试开发面试题2
python的内存池机制 在Python中,内存管理是通过Python的内存管理器和C语言实现的,特别是依赖于CPython的实现。CPython使用一种名为“内存池”(memory pool)的技术来优化小对象(如小整数、短字符串等)的内…...
qt + opengl 给立方体增加阴影
在前几篇文章里面学会了通过opengl实现一个立方体,那么这篇我们来学习光照。 风氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子: 1 环境光照(Ambient …...
Webpack,Vite打包的理解
Webpack 和 Vite 都是现代前端开发中常用的构建工具,用于打包和优化项目代码。尽管它们的目标相似,但在设计理念、工作方式和适用场景上存在显著差异。 Webpack Webpack 是一个模块打包工具,主要用于将多个模块(如 JavaScript、…...
ngx_free_connection
1 定义 ngx_free_connection 函数 定义在 ./nginx-1.24.0/src/core/ngx_connection.cvoid ngx_free_connection(ngx_connection_t *c) { c->data ngx_cycle->free_connections;ngx_cycle->free_connections c;ngx_cycle->free_connection_n;if (ngx_cycle->fi…...
终极指南:Black Python代码格式化工具的国际化与多语言适配策略
终极指南:Black Python代码格式化工具的国际化与多语言适配策略 【免费下载链接】black The uncompromising Python code formatter 项目地址: https://gitcode.com/GitHub_Trending/bl/black Black是一款不妥协的Python代码格式化工具,它通过自动…...
PitchDetect:基于Web Audio API的实时音高检测完整解决方案
PitchDetect:基于Web Audio API的实时音高检测完整解决方案 【免费下载链接】PitchDetect Pitch detection in Web Audio using autocorrelation 项目地址: https://gitcode.com/gh_mirrors/pi/PitchDetect PitchDetect是一款基于Web Audio API的开源音高检测…...
轻松驾驭AI专著写作:选对工具,20万字专著瞬间生成!
撰写学术专著是一项挑战,尤其在“内容深度”和“覆盖广度”之间找到合适的平衡,对许多研究人员而言,这是一个难以逾越的障碍。从深度来看,AI写专著的过程中,核心观点需要具备较强的学术性,不单要明确“是什…...
NI硬件平台在结构健康监测中的技术选型与应用
1. NI硬件平台在结构健康监测中的技术选型结构健康监测系统的核心挑战在于如何将物理世界的振动、应变等机械信号转化为可分析的数字化数据。NI的硬件平台之所以成为行业首选,关键在于其模块化设计理念完美匹配了监测系统对灵活性、精度和可靠性的严苛要求。1.1 Com…...
从‘能用’到‘好用’:一个V2X协议栈开发者的自白与避坑清单
从‘能用’到‘好用’:一个V2X协议栈开发者的自白与避坑清单 第一次接触V2X协议栈开发是在三年前的一个雨天。当时团队接到了一个紧急需求:要在三个月内完成某车企V2V预警功能的原型验证。我们手忙脚乱地拼凑出一个勉强能运行的版本,却在现场…...
Ubuntu 20.04.5 安装 ROS Noetic 保姆级避坑指南(附国内镜像加速全流程)
Ubuntu 20.04.5 安装 ROS Noetic 全流程优化指南 作为一名长期在机器人领域工作的开发者,我深知第一次接触ROS时的兴奋与困惑。特别是在国内网络环境下,官方文档中的安装步骤常常会因为各种网络问题而中断。本文将分享一套经过实战验证的ROS Noetic安装方…...
3分钟掌握!Monaco Editor运行时信息实时监控终极指南
3分钟掌握!Monaco Editor运行时信息实时监控终极指南 【免费下载链接】monaco-editor A browser based code editor 项目地址: https://gitcode.com/gh_mirrors/mo/monaco-editor Monaco Editor作为一款功能强大的浏览器端代码编辑器,不仅提供了卓…...
一维生成对抗网络(1D-GAN)实战:从原理到工业应用
1. 从零构建一维生成对抗网络的核心挑战在金融时序预测、医疗信号处理和工业传感器数据分析等领域,一维数据建模正变得愈发重要。传统方法如ARIMA或RNN虽然有效,但难以捕捉复杂的数据分布。2014年Goodfellow提出的生成对抗网络(GAN)为这个问题提供了全新…...
迁移学习在计算机视觉中的实践与优化
1. 迁移学习在计算机视觉中的应用价值在计算机视觉领域,迁移学习已经成为解决实际问题的标准方法。想象一下你正在训练一个识别特定品种猫狗的模型,如果从零开始训练,可能需要数万张标注图片和几十小时的GPU时间。但借助迁移学习,…...
