使用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. 周邊電商:拍照搜索手辦/服飾對應的

七、總結

在本案例中,深度學習的作用本質是:
通過多層非線性變換,自動從像素中學習到海賊王角色的抽象特征表達,并建立這些特征與人物類別的映射關系。其價值不在于替代人類認知,而是將人類難以顯式描述的視覺模式(比如"如何定義喬巴的可愛感")編碼成可優化的數學表示。未來結合注意力機制等新技術,還可進一步接近人類的分辨能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82234.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82234.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82234.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[創業之路-377]:企業戰略管理案例分析-戰略制定/設計-市場洞察“五看”:看宏觀之社會發展趨勢:數字化、智能化、個性化的趨勢對初創公司的戰略機會

數字化、智能化、個性化趨勢為初創公司帶來了捕捉長尾需求、提升運營效率、創新商業模式等戰略機會,具體分析如下: 一、數字化趨勢帶來的戰略機會 捕捉長尾需求:數字化技術能夠幫助初創公司更好地捕捉市場中的長尾需求,滿足那些…

macOS 安裝 PostgreSQL

文章目錄 安裝安裝信息 驗證GUI 工具下載 安裝 最簡單的方式是通過 brew 安裝 brew install postgresql17該版本在 brew 上的詳情頁:https://formulae.brew.sh/formula/postgresql17 你也可以根據需要,搜索 安裝更新版本 如果你沒有安裝 brew&#xf…

安裝openresty使用nginx+lua,openresty使用jwt解密

yum install -y epel-release yum update yum search openresty # 查看是否有可用包 yum install -y openresty啟動systemctl start openresty驗證服務狀態systemctl status openresty設置開機自啟systemctl enable openrestysystemctl stop openresty # 停止服務 system…

全球化 2.0 | 云軸科技ZStack助力中東智慧城市高性能智能安防云平臺

在全球智慧城市加速建設的背景下,中東某大型城市通過部署云軸科技ZStack Cloud云平臺,成功實現公共安全視頻監控系統(CCTV)的智能化升級。該平臺以彈性計算、GPU智能調度、高可用架構為核心,支撐千路高清視頻流處理及人…

Day35打卡 @浙大疏錦行

知識點回顧: 三種不同的模型可視化方法:推薦torchinfo打印summary權重分布可視化進度條功能:手動和自動寫法,讓打印結果更加美觀推理的寫法:評估模式 作業:調整模型定義時的超參數,對比下效果。…

嵌入式軟件-如何做好一份技術文檔?

嵌入式軟件-如何做好一份技術文檔? 文章目錄 嵌入式軟件-如何做好一份技術文檔?一.技術文檔的核心價值與挑戰二.文檔體系的結構化設計三.精準表達嵌入式特有概念四. **像管理代碼一樣管理文檔**,代碼與文檔的協同維護五.質量評估與持續改進5.…

css五邊形

五邊形 .fu{width: 172rpx;height: 204rpx;overflow: hidden;border-radius: 10rpx;clip-path: polygon(0% 0%, 100% 0%, 100% 75%, 50% 100%, 0% 75%, 0% 25%); }六邊形 clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);

【Java高階面經:微服務篇】1.微服務架構核心:服務注冊與發現之AP vs CP選型全攻略

一、CAP理論在服務注冊與發現中的落地實踐 1.1 CAP三要素的技術權衡 要素AP模型實現CP模型實現一致性最終一致性(Eureka通過異步復制實現)強一致性(ZooKeeper通過ZAB協議保證)可用性服務節點可獨立響應(支持分區存活)分區期間無法保證寫操作(需多數節點可用)分區容錯性…

頭歌軟工導論作業

一.集成測試和確認測試 第1關:集成測試 1、 集成測試的主要方法有CD A、 自頂向下集成方法 B、 自底向上集成方法 C、 漸增式測試方法 D、 非漸增式測試方法 2、 目前在進行集成測試時普遍采用非漸增式測試方法。B A、 √ B、 3、 自底向上集成策略是從主控制模…

MFC:獲取所有打印機的名稱(打印機模塊-1)

背景: 在一個 MFC 應用程序中,列出本地系統中安裝的打印機,并檢測是否存在“Microsoft Print to PDF”或“Microsoft XPS Document Writer”虛擬打印機。如果有,則選擇其中一個作為默認或后續操作對象;如果沒有&#…

設計模式-行為型模式(詳解)

模板方法 模板方法模式,它在一個抽象類中定義了一個算法(業務邏輯)的骨架,具體步驟的實現由子類提供,它通過將算法的不變部分放在抽象類中,可變部分放在子類中,達到代碼復用和擴展的目的。 復用: 所有子類可以直接復…

STM32中的IIC協議和OLED顯示屏

串口通信協議的缺點 串口通信通常需要至少三條線(TX、RX和GND),而 I2C 總線僅需要兩條信號線(SDA和SCL); 串口通信僅支持一對一通信,而 I2C 總線支持多機通信,允許單個主機與多個從…

30個性能優化方案

1.用String.format拼接字符串 不知道你有沒有拼接過字符串,特別是那種有多個參數,字符串比較長的情況。 比如現在有個需求:要用get請求調用第三方接口,url后需要拼接多個參數。 以前我們的請求地址是這樣拼接的: S…

docker中部署Universal Media Server (UMS)

Universal Media Server (UMS) 本身主要是作為桌面服務程序開發的(主要面向 Java GUI DLNA 播放),但確實可以通過 Docker 進行部署。雖然官方沒有提供 Docker 鏡像,但社區有一些可用的方式可以在 Docker 中運行它。 下面是一個可…

配置文件,xml,json,yaml,我該選哪個?

文章目錄 一、核心特性對比二、性能與生態系統三、適用場景與選型建議四、替代方案與趨勢五、總結 在軟件開發中,配置文件格式的選擇直接影響開發效率和維護成本。XML、JSON、YAML 是目前主流的三種格式,但它們各有適用場景和局限性。本文將從語法特性、…

產品迭代與放棄的判斷:MVP、PMF 與 Scale Fit 的三重驗證

在創業和產品管理的世界里,一個永恒的難題是:什么時候應該繼續投入資源進行產品迭代?什么時候又該果斷放棄? 這是一個既關乎戰略方向,又涉及資源分配的核心命題。許多初創公司或產品團隊往往在錯誤的方向上堅持太久&a…

DAY 35 模型可視化與推理

知識點回顧: 三種不同的模型可視化方法:推薦torchinfo打印summary權重分布可視化進度條功能:手動和自動寫法,讓打印結果更加美觀推理的寫法:評估模式 作業:調整模型定義時的超參數,對比下效果。…

20250523-BUG-E1696:無法打開元數據文件“platform.winmd(已解決)

BUG:E1696:無法打開元數據文件“platform.winmd(已解決) 最近在用VisualStudio2022打開一個VisualStudio2017的C老項目后報了這個錯,幾經周折終于解決了,以下是我用的解決方法: 將Debug從Win32改…

Hellorobot 移動操作機器人開源實踐:HPR 模型 + 全棧資源,降低家庭機器人開發門檻

Hellorobot在DobbE框架中扮演了重要的技術支柱角色。通過其尖端的模塊化設計和高效算法優化,Hellorobot為家庭機器人領域注入了強大的創新動力。DobbE框架的核心技術——Home Pretrained Representations (HPR) 模型,得益于Hellorobot的技術支持&#xf…

onnx模型轉入rknn3399平臺上工作記錄

1.rknn虛擬環境使用時報錯問題 使用rknn17環境的報錯: ImportError: libdc1394.so.22: cannot open shared object file: No such file or directory 參考鏈接:https://blog.csdn.net/2301_80032564/article/details/142316410 創作軟連接: …