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

使用VGG-16模型来对海贼王中的角色进行图像分类

动漫角色识别是计算机视觉的典型应用场景,可用于周边商品分类、动画制作辅助等。

这个案例是一个经典的深度学习应用,用于图像分类任务,它使用了一个自定义的VGG-16模型来对《海贼王》中的七个角色进行分类,演示如何将经典CNN模型应用于小规模自定义数据集。

1. 数据集准备

数据集包含7个类别的图片,每个类别对应一个《海贼王》的角色:

  • 路飞(lufei)
  • 罗宾(luobin)
  • 娜美(namei)
  • 乔巴(qiaoba)
  • 山治(shanzhi)
  • 索隆(suolong)
  • 乌索普(wusuopu)

每个角色有不同数量的图片,总共621张图片。

(1)导入必要的库和设置随机种子

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, models
import pathlib
import matplotlib.pyplot as plt
import os, PILnp.random.seed(1)
tf.random.set_seed(1)
#导入所需的Python库,并设置随机种子以确保实验的可重复性。

(2)设置数据目录和参数

data_dir = r"D:\hzw_photos"
data_dir = pathlib.Path(data_dir)
image_count = len(list(data_dir.glob('*/*.png')))
print("图片总数为:", image_count)batch_size = 32
img_height = 224
img_width = 224#作用:指定数据集路径、统计图片总数,并定义批量大小和图片尺寸。
#运行结果:输出图片总数(621张)。

(3)加载训练集和验证集

train_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.2,subset="training",seed=123,image_size=(img_height, img_width),batch_size=batch_size
)val_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.2,subset="validation",seed=123,image_size=(img_height, img_width),batch_size=batch_size
)
#作用:从指定目录加载图像数据集,并将其分为训练集和验证集。validation_split=0.2表示20%的数据用于验证,其余80%用于训练。
#运行结果:打印出找到的文件数量和类别信息。

(4)获取类别名称

class_names = train_ds.class_names
print(class_names)
#作用:获取并打印数据集中所有类别的名称。
#运行结果:输出类别名称列表:['lufei', 'luobin', 'namei', 'qiaoba', 'shanzhi', 'suolong', 'wusuopu']。

(5)可视化数据

plt.figure(figsize=(10, 5))
for images, labels in train_ds.take(1):for i in range(8):ax = plt.subplot(2, 4, i + 1)plt.imshow(images[i].numpy().astype("uint8"))plt.title(class_names[labels[i]])plt.axis("off")
plt.show()
#作用:从训练集中随机选取一批图像进行可视化展示。
#运行结果:显示8张随机选择的图像及其对应的标签。


2. 数据预处理

(1)配置数据集

AUTOTUNE = tf.data.AUTOTUNE
train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
#作用:对数据集进行缓存、打乱和预取操作,以提高数据读取效率。
#运行结果:无直接输出,但优化了数据加载过程。

(2)归一化处理

normalization_layer = tf.keras.layers.Rescaling(1. / 255)
train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
val_ds = val_ds.map(lambda x, y: (normalization_layer(x), y))image_batch, labels_batch = next(iter(val_ds))
first_image = image_batch[0]
print("归一化后数据范围:", np.min(first_image), np.max(first_image))
#作用:将图像像素值归一化到[0, 1]区间内。
#运行结果:输出归一化后的数据范围(0.0到0.9928046),表明归一化操作成功。

3. 模型构建

VGG-16 是一种经典的卷积神经网络(CNN)架构,通过堆叠多个卷积层和池化层来提取图像特征,最后通过全连接层进行分类。以其简单的结构和深度而闻名,尤其在图像分类任务中表现出色。

定义VGG-16模型

def VGG16(nb_classes, input_shape):# 构建VGG-16模型...return model
#作用:定义一个自定义的VGG-16模型,包括多个卷积层和全连接层。
#运行结果:无直接输出,但生成了一个可以使用的模型结构。

(1) 输入层

input_tensor = layers.Input(shape=input_shape)
#input_shape  输入图像的形状,通常为 (height, width, channels),例如 (224, 224, 3) 表示 224x224 像素的 RGB 图像
#Input 层定义了模型的输入张量。

(2)卷积块 1

x = layers.Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(input_tensor)
x = layers.Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)
x = layers.MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)
#两个 Conv2D 层,每个层使用 64 个 3x3 的卷积核,激活函数为 ReLU,padding='same' 表示输出特征图的大小与输入相同。
#MaxPooling2D 层使用 2x2 的池化窗口,步幅为 2,将特征图的大小减半。
#输入图像(224×224×3)
#→ 经过64个3×3卷积核提取特征(输出224×224×64)
#→ 再次卷积增强特征(保持尺寸)
#→ 2×2最大池化(输出112×112×64)

(3)卷积块 2

x = layers.Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)
x = layers.Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)
x = layers.MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)
#与第一个卷积块类似,但卷积核数量增加到 128。

(4) 卷积块 3

x = layers.Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)
x = layers.Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)
x = layers.Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)
x = layers.MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)
#卷积核数量增加到 256,并且有三个卷积层。

(5)卷积块 4

x = layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)
x = layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)
x = layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)
x = layers.MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)
#卷积核数量增加到 512,同样有三个卷积层。

(6)卷积块 5

x = layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)
x = layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)
x = layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)
x = layers.MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)
#与卷积块 4 相同,卷积核数量保持为 512。

块编号CONV层数量输出尺寸通道数作用
12112×11264提取边缘/颜色等低级特征
2256×56128捕获纹理/简单形状
3328×28256识别复杂图案(如草帽轮廓)
4314×14512检测角色局部特征(娜美的头发等)
537×7512整合全局语义信息


(7) 全连接层

x = layers.Flatten()(x)
x = layers.Dense(4096, activation='relu', name='fc1')(x)
x = layers.Dense(4096, activation='relu', name='fc2')(x)
output_tensor = layers.Dense(nb_classes, activation='softmax', name='predictions')(x)
#Flatten 层将多维特征图展平为一维向量。
#两个 Dense 层,每个层有 4096 个神经元,激活函数为 ReLU。
#最后的 Dense 层输出类别概率,使用 softmax 激活函数,nb_classes 是类别数量。

(8)构建模型

model = models.Model(input_tensor, output_tensor)
#使用 Model 类将输入张量和输出张量组合成模型。

(9)初始化模型

model = VGG16(nb_classes=7, input_shape=(img_width, img_height, 3))
model.summary()
#作用:初始化VGG-16模型,并打印模型结构摘要。
#运行结果:输出模型各层的详细信息,包括层名、输出形状和参数数量等。

输入图像 → [CONV→POOL]×5 → 展平 → FC×2 → 分类输出
                        (特征提取)                           (决策)

4. 模型编译与训练

编译模型

opt = tf.keras.optimizers.Adam(learning_rate=1e-4)
model.compile(optimizer=opt,loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),metrics=['accuracy']
)
#作用:配置模型的优化器、损失函数和评估指标。

训练模型

history = model.fit(train_ds,validation_data=val_ds,epochs=epochs
)
#作用:在训练集上训练模型,并在每个epoch结束后评估验证集上的性能。
#运行结果:输出每个epoch的训练准确率、训练损失、验证准确率和验证损失。

5. 结果分析

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(range(epochs), acc, label='Training Accuracy')
plt.plot(range(epochs), val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')plt.subplot(1, 2, 2)
plt.plot(range(epochs), loss, label='Training Loss')
plt.plot(range(epochs), val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()
#作用:绘制训练和验证过程中的准确率及损失变化曲线。
#运行结果:显示两个子图,分别表示准确率和损失的变化趋势。



 

  • 训练准确率验证准确率都随着训练轮数的增加而上升,表明模型逐渐学习到了数据的特征。
  • 训练损失验证损失则逐渐下降,说明模型的预测误差在减小。
图片总数为: 621
Found 621 files belonging to 7 classes.
Using 497 files for training.
Found 621 files belonging to 7 classes.
Using 124 files for validation.
['lufei', 'luobin', 'namei', 'qiaoba', 'shanzhi', 'suolong', 'wusuopu']
归一化后数据范围: 0.0 0.9928046
Model: "functional"
┌─────────────────────────────────┬────────────────────────┬───────────────┐
│ Layer (type)                    │ Output Shape           │       Param # │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ input_layer (InputLayer)        │ (None, 224, 224, 3)    │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block1_conv1 (Conv2D)           │ (None, 224, 224, 64)   │         1,792 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block1_conv2 (Conv2D)           │ (None, 224, 224, 64)   │        36,928 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block1_pool (MaxPooling2D)      │ (None, 112, 112, 64)   │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block2_conv1 (Conv2D)           │ (None, 112, 112, 128)  │        73,856 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block2_conv2 (Conv2D)           │ (None, 112, 112, 128)  │       147,584 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block2_pool (MaxPooling2D)      │ (None, 56, 56, 128)    │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block3_conv1 (Conv2D)           │ (None, 56, 56, 256)    │       295,168 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block3_conv2 (Conv2D)           │ (None, 56, 56, 256)    │       590,080 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block3_conv3 (Conv2D)           │ (None, 56, 56, 256)    │       590,080 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block3_pool (MaxPooling2D)      │ (None, 28, 28, 256)    │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block4_conv1 (Conv2D)           │ (None, 28, 28, 512)    │     1,180,160 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block4_conv2 (Conv2D)           │ (None, 28, 28, 512)    │     2,359,808 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block4_conv3 (Conv2D)           │ (None, 28, 28, 512)    │     2,359,808 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block4_pool (MaxPooling2D)      │ (None, 14, 14, 512)    │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block5_conv1 (Conv2D)           │ (None, 14, 14, 512)    │     2,359,808 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block5_conv2 (Conv2D)           │ (None, 14, 14, 512)    │     2,359,808 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block5_conv3 (Conv2D)           │ (None, 14, 14, 512)    │     2,359,808 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ block5_pool (MaxPooling2D)      │ (None, 7, 7, 512)      │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten (Flatten)               │ (None, 25088)          │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ fc1 (Dense)                     │ (None, 4096)           │   102,764,544 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ fc2 (Dense)                     │ (None, 4096)           │    16,781,312 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ predictions (Dense)             │ (None, 7)              │        28,679 │
└─────────────────────────────────┴────────────────────────┴───────────────┘Total params: 134,289,223 (512.27 MB)Trainable params: 134,289,223 (512.27 MB)Non-trainable params: 0 (0.00 B)
Epoch 1/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 207s 13s/step - accuracy: 0.1736 - loss: 1.9444 - val_accuracy: 0.1935 - val_loss: 1.9390
Epoch 2/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 216s 14s/step - accuracy: 0.1594 - loss: 1.9357 - val_accuracy: 0.1935 - val_loss: 1.9355
Epoch 3/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 195s 12s/step - accuracy: 0.1656 - loss: 1.9362 - val_accuracy: 0.1935 - val_loss: 1.9293
Epoch 4/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 208s 13s/step - accuracy: 0.1749 - loss: 1.9240 - val_accuracy: 0.1452 - val_loss: 1.9054
Epoch 5/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 214s 13s/step - accuracy: 0.1787 - loss: 1.8650 - val_accuracy: 0.2419 - val_loss: 1.6483
Epoch 6/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 202s 13s/step - accuracy: 0.3046 - loss: 1.5703 - val_accuracy: 0.3306 - val_loss: 1.6471
Epoch 7/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 198s 13s/step - accuracy: 0.4451 - loss: 1.4282 - val_accuracy: 0.5403 - val_loss: 1.1161
Epoch 8/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 179s 11s/step - accuracy: 0.6045 - loss: 1.0102 - val_accuracy: 0.5081 - val_loss: 1.0964
Epoch 9/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 166s 11s/step - accuracy: 0.6386 - loss: 0.9255 - val_accuracy: 0.6935 - val_loss: 0.8652
Epoch 10/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 162s 10s/step - accuracy: 0.7404 - loss: 0.6550 - val_accuracy: 0.6290 - val_loss: 0.9989
Epoch 11/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 185s 11s/step - accuracy: 0.8052 - loss: 0.5281 - val_accuracy: 0.6855 - val_loss: 0.9217
Epoch 12/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 185s 12s/step - accuracy: 0.8136 - loss: 0.4523 - val_accuracy: 0.6613 - val_loss: 1.0901
Epoch 13/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 193s 12s/step - accuracy: 0.8089 - loss: 0.4674 - val_accuracy: 0.6935 - val_loss: 0.7750
Epoch 14/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 192s 12s/step - accuracy: 0.8577 - loss: 0.3848 - val_accuracy: 0.7339 - val_loss: 0.8414
Epoch 15/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 185s 12s/step - accuracy: 0.9164 - loss: 0.2603 - val_accuracy: 0.7419 - val_loss: 1.2181
Epoch 16/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 223s 14s/step - accuracy: 0.8789 - loss: 0.4077 - val_accuracy: 0.7258 - val_loss: 0.9584
Epoch 17/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 236s 15s/step - accuracy: 0.9123 - loss: 0.2405 - val_accuracy: 0.7419 - val_loss: 1.2041
Epoch 18/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 236s 15s/step - accuracy: 0.9637 - loss: 0.1224 - val_accuracy: 0.7339 - val_loss: 1.9659
Epoch 19/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 226s 14s/step - accuracy: 0.9677 - loss: 0.0793 - val_accuracy: 0.7339 - val_loss: 1.4271
Epoch 20/20
16/16 ━━━━━━━━━━━━━━━━━━━━ 224s 14s/step - accuracy: 0.9548 - loss: 0.1205 - val_accuracy: 0.7581 - val_loss: 1.4689
#指标	训练集变化	            验证集变化	            结论
#准确率	17.4% → 95.5% (↑78.1%)	19.4% → 75.8% (↑56.4%)	模型学习有效,但存在明显过拟合
#损失值	1.94 → 0.12 (↓93.8%)	1.94 → 1.47 (↓24.2%)	训练损失下降过快,验证损失震荡进程已结束,退出代码为 0




6.从深度学习展开分析

(1)特征学习的革命性突破

传统方法 vs 深度学习

  • 传统CV方案
    需要手工设计特征(如HOG描述子、颜色直方图),但对于动漫人物:

    草帽、发型等特征难以用数学公式描述   不同姿势/角度下特征稳定性差
  • 深度学习方案
    VGG-16通过卷积层自动学习层次化特征:

底层特征(前几层):边缘/颜色 → 识别路飞的草帽红色边缘

中层特征:纹理/部件 → 组合出索隆的三把刀轮廓

高层特征:全局语义 → 理解"娜美的橘色头发+身体比例"这种复合特征

(2)处理图像数据的先天优势

  1. 空间不变性

    • 通过卷积核共享机制,无论路飞出现在图像左上角还是右下角都能被识别

    • 池化层使模型对小幅位移/旋转具有鲁棒性(适合动漫截图角度多变的特点)

  2. 通道维度理解

    • RGB三通道自动提取色彩特征(如乔巴的粉色帽子、山治的金发)

    • 相比灰度图,保留关键颜色线索

  3. 感受野递进

    • 从3×3小窗口逐步扩大到全图感知(最终7×7的特征图对应原图约200×200像素区域)

    • 这种机制天然适配"从局部到整体"的认知逻辑

(3)端到端训练的便捷性

传统流程
图像预处理 → 特征工程 → 分类器设计 → 结果优化(需分步调试)

深度学习流程
原始图片输入 → VGG网络 → 分类结果
所有优化自动完成

(4)针对动漫数据的特殊适配能力

  1. 风格化特征处理

    • 动漫人物线条鲜明、用色大胆,与真实照片差异大

    • CNN通过多层非线性变换,能更好捕捉这种艺术化表达

  2. 跨角色泛化

    • 即使训练集没有"戴草帽的罗宾"这类异常组合,模型也能通过:

      • 低层学到的"草帽特征"

      • 高层学到的"罗宾面部特征"

    • 组合推理出未知变体(比传统方法更具泛化潜力)

(5)延伸应用场景

这套技术方案稍加调整即可用于:

  1. 动漫产业:自动标注动画分镜中的人物出场

  2. 游戏开发:玩家上传截图自动识别角色阵容

  3. 周边电商:拍照搜索手办/服饰对应的

七、总结

在本案例中,深度学习的作用本质是:
通过多层非线性变换,自动从像素中学习到海贼王角色的抽象特征表达,并建立这些特征与人物类别的映射关系。其价值不在于替代人类认知,而是将人类难以显式描述的视觉模式(比如"如何定义乔巴的可爱感")编码成可优化的数学表示。未来结合注意力机制等新技术,还可进一步接近人类的分辨能力。

相关文章:

使用VGG-16模型来对海贼王中的角色进行图像分类

动漫角色识别是计算机视觉的典型应用场景,可用于周边商品分类、动画制作辅助等。 这个案例是一个经典的深度学习应用,用于图像分类任务,它使用了一个自定义的VGG-16模型来对《海贼王》中的七个角色进行分类,演示如何将经典CNN模型…...

AI-02a5a7.神经网络-与学习相关的技巧-正则化

过拟合 过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。 在机器学习的问题中,过拟合是很常见的问题。 而机器学习的目标是提高泛化能力,即便是没有包含在训练数据里的未观测数据,也希望模…...

C# 常用密码加密与解密技术完全指南

目录 密码安全的核心概念 加密 vs 哈希:何时使用? 密钥管理的重要性 常见攻击手段(中间人攻击、彩虹表) 基础加密技术 对称加密(AES) 非对称加密(RSA) 哈希算法(SH…...

C++ QT 与 win32 窗口可以互操作

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->setWindowTitle("天下第一剑"); // HWND hwnd FindWindow(L"天下第一剑",L"天下第一剑"); // qDebug()<<…...

MySQL--day4--排序与分页

&#xff08;以下内容全部来自上述课程&#xff09; 1. 排序数据 1.1 排序基本使用 #1.排序 #如果没有使用排序操作&#xff0c;默认情况下查询返回的数据是按照添加数据的顺序显示的 SELECT * FROM employees;# 练习:按照salary从高到低的顺序显示员工信息 # 使用 ORDER …...

文件操作和IO—初识文件

认识文件 狭义上的文件&#xff08;file&#xff09;&#xff0c;是针对硬盘这种持久化存储的IO设备&#xff0c;当我们想要进行数据保存的时候&#xff0c;往往不是保存成一个整体&#xff0c;而是独立成一个个的单位进行保存&#xff0c;这个独立的单位就被抽象成文件的概念…...

P2670 [NOIP 2015 普及组] 扫雷游戏

P2670 [NOIP 2015 普及组] 扫雷游戏 - 洛谷 #include<bits/stdc.h> using namespace std; int n,m; char a[105][105]; int main(){cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j){cin>>a[i][j];}}for(int i1;i<n;i){for(int j1;j<m;j){…...

HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)

1. SGCC_Electricity 应用介绍 SGCC_Electricity 是一个用于将国家电网&#xff08;State Grid Corporation of China&#xff0c;简称 SGCC&#xff09;的电费和用电量数据接入 Home Assistant 的自定义集成组件。通过该应用&#xff0c;用户可以实时追踪家庭用电量情况&…...

02 基本介绍及Pod基础排错

01 yaml文件里的字段错误 # 多打了一个i导致的报错 [rootmaster01 yaml]# cat 01-pod.yaml apiVersion: v1 kind: Pod metadata:name: likexy spec:contaiiners:- name: aaaimage: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 [rootmaster01 yaml]# kubectl …...

9 定时任务与周期性调度

一、定时任务核心机制 1.1 基础调度配置 # celery.py from celery import Celery from celery.schedules import crontabapp Celery(proj) app.conf.beat_schedule {daily-report: {task: report.generate,schedule: crontab(hour3, minute30), # 每天3:30执行args: (),op…...

macOS 效率工具对比分析:Raycast、Alfred、uTools、Spotlight

macOS 效率工具对比分析&#xff1a;Raycast、Alfred、uTools、Spotlight 对比分析四款常见 macOS 高效工具&#xff0c;涵盖功能、插件生态、开发者支持、适用人群等维度&#xff0c;帮助你选择最适合自己的效率助手。 &#x1f50d; 一、基本介绍 工具名简介SpotlightmacOS …...

接口测试速成指南:基础知识+工具使用全解析

你是否也有这样的经历&#xff1a;项目初期接口文档混乱&#xff0c;测试人员无从下手&#xff1b;开发说接口OK&#xff0c;测试却频繁遇坑&#xff1f;别怕&#xff0c;接口测试并没你想得那么难&#xff01; “接口测试怎么做&#xff1f;用什么工具&#xff1f;”面试官一…...

SpringSecurity基础入门

一个身份认证、授权、防御常见攻击的框架。 spring security 中文网&#xff1a;Spring Security中文网 自定义配置 基于内存的用户认证 实现步骤如下&#xff1a; 在配置类中创建security的配置类&#xff1a; Configuration //声明当前类为配置类 EnableWebSecurity //…...

MySQL的安装及相关操作

目录 一. 数据库产生的背景 二. 数据库操作系统的组成 2.1 数据库(Database) 2.2 数据库管理系统(DBMS, Database Management System) 2.3 应用程序(Application) 三. 数据库的分类 3.1 关系数据库 3.2 非关系数据库 四. MySQL安装 4.1yum安装 1. Ubuntu ​2. cent…...

【Code】Foundations 2017- Catalogue, List of Tables, List of Figures

Foundations 2017 目录 | Catalogue表格目录 | List of Tables图表目录 | List of Figures 目录 | Catalogue 英文原文中文翻译词汇学习&#xff08;音标和解释&#xff09;1. General1. 总则1.1 Scope1.1 范围1.2 Glossary1.2 术语表Glossary [ˈɡlɒsəri] 术语表&#xff…...

【TCGA-CRC】TCGA数据读取

写在前面 参考已有的帖子写的&#xff0c;但是临床数据和UCSC的不同。有知道的小伙伴欢迎指正。 rm(list ls()); gc() test1 data.table::fread("./00_Rawdata/GDCdata/TCGA-COAD/Transcriptome_Profiling/Gene_Expression_Quantification/00ae9ab8-6eaa-4085-af72-26…...

BYUCTF 2025

几周没会的比赛了&#xff0c;都是一题游。这周的BYU还不错&#xff0c;难度适中&#xff0c;只是时间有点短。周末时间不够。 Crypto Many Primes from Crypto.Util.number import bytes_to_long, getPrime import randomflag open("flag.txt").read().encode()…...

【Linux】初见,基础指令(续)

前言&#xff1a; 上文讲解了部分指令&#xff0c;本文我们来讲解剩下的指令【Linux】初见&#xff0c;基础指令-CSDN博客 cat指令 语法&#xff1a;cat 选项 文件 功能&#xff1a;打印文件中的内容 选项&#xff1a; -b 对非空行输出进行编号 -n 对输出的说有行进行编号…...

《MambaLLIE:基于隐式Retinex感知的低光照增强框架与全局-局部状态空间建模》学习笔记

Paper:2405.16105 Github:GitHub - wengjiangwei/MambaLLIE 目录 摘要 一、介绍 二、相关工作 2.1 低光图像增强 2.2 视觉空间状态模型 三、方法 3.1 预备知识 3.2 整体流程 3.3 全局优先-局部次之状态空间块 四、实验 4.1 基准数据集与实施细节 4.2 对比实验 4…...

计算机图形学Games101笔记--几何

第二部分&#xff1a;几何 几何介绍 光栅化解决如何渲染&#xff0c;几何研究模型如何存储在GPU的内存中。几何主要分为两种&#xff1a;隐式几何和显式几何。 **隐士几何&#xff1a;**用点之间的关系存储&#xff0c;如球的计算公式。更一般的可以用f(x,y,z)。我们可以令f…...

Web开发-Python应用Flask框架Jinja模版绑定路由参数传递页面解析SSTI注入

知识点&#xff1a; 1、安全开发-Python-Flask&Jinja2 2、安全开发-Python-路由传参&SSTI注入 演示案例-WEB开发-Python-Flask框架&Jinja2模版&路由传参&SSTI注入 0、Pycharm 配置Python解析 新建Flask项目 1、路由传参 app.route(/) app.route(/<id…...

聚焦开放智能,抢占技术高地 | 2025 高通边缘智能创新应用大赛第五场公开课来袭!

随着2025高通边缘智能创新应用大赛的推进&#xff0c;越来越多的参赛者关注如何借助高性能硬件突破技术瓶颈、打造差异化作品。 5月27日晚8点&#xff0c;大赛将开启初赛阶段的第五场专题公开课——由美格软件研究院院长李书杰领衔&#xff0c;深入解析高通平台的底层架构与参…...

NMOS和PMOS的区别

1 区分NMOS和PMOS&#xff1a;衬底箭头指向G级的是NMOS&#xff0c;衬底箭头背向G级的是PMOS 2 区分D和S级&#xff1a;针对NMOS&#xff0c;体二极管的正方向为S级&#xff1b;针对PMOS&#xff0c;体二极管正的方向为D级 3 区分电流方向&#xff1a;针对NMOS&#xff0c;电…...

Paillier加密方案的原理、实现与应用(vs)

一、实验目的 1、掌握NTL的基本配置和方法&#xff08;以下是以visualstudio为例&#xff09; 2、掌握Paillier加密方案的原理与实现 ①钥匙生成&#xff1a;首先&#xff0c;生成一把钥匙&#xff0c;包括钥匙和私钥匙。钥匙由两个大素数(p,q)的乘积n和一个整数g组成&#…...

Metal入门,使用Metal绘制3D图形

这次是使用Metal绘制一个立方体&#xff0c;并且添加旋转效果&#xff0c;绘制正方形的步骤很简单&#xff0c;我们绘制一个正方形就相当于绘制两个三角形&#xff0c;那么绘制一个正方体&#xff0c;我们很容易想到需要绘制他六个面&#xff0c;很显然&#xff0c;我们也需要把…...

Java 04 API

API 简介 一些已经写好的应用程序编程接口Object toString 默认返回的是当前对象在堆内存中的地址值信息&#xff1a;类的全类名十六进制哈希值返回该对象的返回值 class A{ } //返回的是地址哦 String sA.toString(); //细节&#xff1a;使用打印语句&#xff0c;打印对象…...

基于Gitee 的开发分支版本管理规范

一、版本管理规范概述 目的&#xff1a;规范代码分支管理和版本发布流程&#xff0c;提高团队协作效率&#xff0c;确保代码质量和版本可追溯性。适用范围&#xff1a;基于 Gitee 平台开发的所有项目。分支策略&#xff1a;采用 Git Flow 模型的变体&#xff0c;主要分支包括 …...

HOW - 结合 AI 进行 Tailwind 样式开发

文章目录 情况 1&#xff1a;使用 Tailwind CSS 与手写传统 CSS 的开发效率对比情况 2&#xff1a;AI Tailwind 自动生成 UI 的效率如何&#xff1f;总结 在 WHAT - Tailwind 样式方案&#xff08;不写任何自定义样式&#xff09; 中我们已经简单介绍过 Tailwind。今天主要认识…...

系统数据对接-从获取到处理的全流程

在后端架构的复杂生态中&#xff0c;子系统间或与外部系统的对接是常态&#xff0c;其核心要义在于实现数据的精准传输。本文聚焦于数据传输后的运算逻辑与异常处理机制&#xff0c;旨在为后端开发者提供深度见解。 一、数据获取机制&#xff1a;触发式与定时任务的权衡 &…...

Java 09Stream流与File类

Stream流与File类 Stream流 简化集合和数组的操作&#xff0c;startWith(“张”) 第一个为这个返回true String1.获取Stream对象 单列集合 双列集合 先获得键值对 在遍历数组 零散的数据 Stream<Integer> arrStream.of(1,2,34,3); stream.forEach(sss); 即可2.中间…...

《光与影:33号远征队》栩栩如生的角色动画是如何创建的?

《光与影&#xff1a;33号远征队》是一款由Sandfall Interactive公司开发的回合制RPG游戏&#xff0c;背景是一个黑暗的幻想世界。游戏因其独特的艺术风格和引人注目的叙事赢得了无数赞誉&#xff0c;成为今年大热游戏中的一匹黑马。 在该游戏制作中Sandfall依靠包括Xsens在内的…...

GESP2024年12月认证C++二级( 第三部分编程题(1)寻找数字)

参考程序&#xff08;枚举&#xff09;&#xff1a; #include <iostream> //#include <cmath> using namespace std;int main() {int t;cin >> t;while (t--) {long long a;cin >> a;bool found false;// 枚举 b for (long long b 1; b * b * b * b…...

《探索具身智能机器人视觉-运动映射模型的创新训练路径》

视觉 - 运动映射模型作为实现智能交互与精准行动的核心&#xff0c;吸引着全球科研人员与技术爱好者的目光。这一模型就像机器人的 “神经中枢”&#xff0c;连接着视觉感知与肢体运动&#xff0c;使机器人能够在复杂的现实环境中灵活应对各种任务。 传统的视觉 - 运动映射模型…...

Python打卡DAY31

今日的示例代码包含2个部分 notebook文件夹内的ipynb文件&#xff0c;介绍下今天的思路项目文件夹中其他部分&#xff1a;拆分后的信贷项目&#xff0c;学习下如何拆分的&#xff0c;未来你看到的很多大项目都是类似的拆分方法 知识点回顾 规范的文件命名规范的文件夹管理机器学…...

【SPIN】PROMELA远程引用与控制流验证(SPIN学习系列--5)

PROMELA语言提供了两种强大的机制用于验证并发系统&#xff1a;远程引用(remote references)和进程变量引用。这些机制使得在不引入额外状态变量的情况下&#xff0c;能够精确描述系统状态和属性。 远程引用(Remote References) 远程引用允许你直接引用进程中的控制位置(labe…...

GMSL:汽车里的音视频传输

参考链接&#xff1a; blog.csdn.net/weixin_50875614/article/details/119995651 blog.csdn.net/syjie19900426/article/details/145269782 SerDes 应用场景 WHAT GMSL是什么 GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司推出的一种…...

Java并发进阶系列:深度讨论jdk1.8 ConcurrentHashMap并发环境下transfer方法桶位分配过程

在前面有多篇关于jdk1.8的ConcurrentHashMap研究是基于源代码给出的深度分析&#xff0c;要知道多线程环境下的ConcurrentHashMap内部运行机制是相对复杂的&#xff0c;好在IDEA提供的相关断点和Debug功能确实好用&#xff0c;使得多线程调试起来直观&#xff0c;通过这种方式能…...

【深度学习-Day 14】从零搭建你的第一个神经网络:多层感知器(MLP)详解

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

fdisk和parted的区别

在Linux系统中&#xff0c;fdisk和parted是两种常用的分区工具。虽然它们都可以对硬盘进行分区&#xff0c;但在功能和适用范围上有显著的区别。 fdisk fdisk主要用于MBR&#xff08;主引导记录&#xff09;分区表的管理。MBR分区表有以下特点&#xff1a; 支持小于2TB的硬盘…...

springMVC拦截器,拦截器拦截策略设置

目录 1、MyInterceptor1 2、UserController 3、MvcConfig&#xff0c;拦截器4种拦截方法策略 做请求的校验&#xff0c;如果校验没有通过&#xff0c;直接返回&#xff0c;原来下面的处理&#xff0c;就不用处理了 将request进行拦截校验 将response进行拦截校验 preHandle…...

如何测试北斗卫星通讯终端的性能?

测试北斗卫星通讯终端的性能需从功能、性能、环境适应性、可靠性等多维度展开&#xff0c;以下是具体测试内容与方法&#xff1a; 一、基础功能测试 验证终端是否满足北斗系统的核心通讯功能。 &#xff08;1&#xff09;通信模式测试 短报文通信 测试终端发送 / 接收短报…...

基于MakeReal3D的虚拟预装系统:飞机装配效率与精度的双重突破

在航空制造领域&#xff0c;飞机部件的对接装配是飞机制造过程中的关键环节。传统的部件装配方式高度依赖操作人员的经验和反复调整&#xff0c;调姿过程耗时较长&#xff0c;且难以保证每次装配都能达到最优状态。随着虚拟现实技术的成熟&#xff0c;虚拟装配技术作为一种新兴…...

IP54是什么?

IP54是什么 定义 IP54是一种国际标准&#xff0c;用来指示设备的防护等级&#xff0c;该标准由国际电工委员会&#xff08;IEC&#xff09;制定&#xff0c;并在许多领域广泛使用13。IP是Ingress Protection的缩写&#xff0c;IP等级是针对电气设备外壳对异物侵入的防护等级。…...

Python异步编程详解

Python异步编程详解 引言 异步编程是Python中处理并发操作的重要方式&#xff0c;它允许程序在等待I/O操作时执行其他任务&#xff0c;从而提高程序的整体效率。本文将详细介绍Python异步编程的概念、实现方式以及实际应用场景。 1. 异步编程基础 1.1 什么是异步编程&#x…...

AUC与Accuracy的区别

下面分别解释下这两句话的含义及其原因&#xff0c;并说明 AUC 与 Accuracy&#xff08;准确率&#xff09;的区别&#xff1a; AUC 是阈值无关的指标   • 含义&#xff1a;在二分类问题中&#xff0c;模型通常会输出一个概率值或打分&#xff0c;需要设定一个阈值来将这些概…...

差分数组:原理与应用

一、什么是差分数组 差分数组是一种高效处理区间更新操作的数据结构技巧&#xff0c;特别适用于需要对数组的某个区间进行频繁增减操作的场景。差分数组的核心思想是通过存储相邻元素的差值而非元素本身&#xff0c;将区间操作转化为端点操作&#xff0c;从而将时间复杂度从O(…...

一些C++入门基础

关键字 图引自 C 关键词 - cppreference.com 命名空间 命名空间解决了C没办法解决的各类命名冲突问题 C的标准命名空间&#xff1a;std 命名空间中可以定义变量、函数、类型&#xff1a; namespace CS {//变量char cs408[] "DS,OS,JW,JZ";int cs 408;//函数vo…...

免费插件集-illustrator插件-Ai插件-路径尖角圆角化

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现图形编辑中路径尖角圆角化。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/87…...

数据分析_商务运营考核指标体系搭建

以抖音电商中的小学教辅书籍业务为例&#xff0c;搭建对接达人的商务运营团队能力考核指标体系&#xff0c;涵盖达人筛选、合作管理、效果追踪和长期价值维护等核心环节&#xff0c;结合教育产品特性和商务运营目标&#xff0c;设计分层量化指标&#xff1a; 一、考核目标 围绕…...

基于Java的校运会管理系统【附源码】

湄洲湾职业技术学院 毕业设计&#xff08;论文&#xff09; 课题名称&#xff1a; 系 别&#xff1a; 专 业&#xff1a; 年 级&#xff1a; 姓 名&#xff1a; 学 号&#xff1a; 指导教师&#xff1a; 摘 要 用传统的方式来管理信息&#xff0c;一是耗时较长&#xff0c;二是…...