目錄
一、機器視覺
1.1 應用場景
1.2 常見的計算機視覺任務
1.2.1 圖像分類
1.2.2 目標檢測
1.2.3 圖像分割
二、自然語言處理
三、推薦系統
3.1 常用的推薦系統算法實現方案
四、圖像分類實驗補充
4.1 CIFAR-100 數據集實驗
實驗代碼
4.2?CIFAR-10
實驗代碼?
深度學習的應用領域廣泛且多樣,涵蓋了計算機視覺、自然語言處理、推薦系統等多個領域。
一、機器視覺
1.1 應用場景
計算機視覺(Computer Vision)又稱機器視覺(Machine Vision),是一門讓機器學會如何去“看”的學科,是深度學習技術的一個重要應用領域,被廣泛應用于安防、工業質檢和自動駕駛等場景。具體來說,就是讓機器去識別攝像機拍攝的圖片或視頻中的物體,檢測出物體所在的位置,并對目標物體進行跟蹤,從而理解并描述出圖片或視頻里的場景和故事,以此來模擬人腦視覺系統。因此,計算機視覺也通常被叫做機器視覺,其目的是建立能夠從圖像或者視頻中“感知”信息的人工系統。
計算機視覺技術經過幾十年的發展,已經在交通(車牌識別、道路違章抓拍)、安防(人臉閘機、小區監控)、金融(刷臉支付、柜臺的自動票據識別)、醫療(醫療影像診斷)、工業生產(產品缺陷自動檢測)等多個領域應用,影響或正在改變人們的日常生活和工業生產方式。未來,隨著技術的不斷演進,必將涌現出更多的產品和應用,為我們的生活創造更大的便利和更廣闊的機會。
1.2 常見的計算機視覺任務
1.2.1 圖像分類
圖像分類利用計算機對圖像進行定量分析,把圖像或圖像中的像元或區域劃分為若干個類別中的某一種。以下是一些常見的圖像分類算法:
1.2.2 目標檢測
對計算機而言,能夠“看到”的是圖像被編碼之后的數字,但它很難理解高層語義概念,比如圖像或者視頻幀中出現的目標是人還是物體,更無法定位目標出現在圖像中哪個區域。目標檢測的主要目的是讓計算機可以自動識別圖片或者視頻幀中所有目標的類別,并在該目標周圍繪制邊界框,標示出每個目標的位置。目標檢測應用場景覆蓋廣泛,如安全帽檢測、火災煙霧檢測、人員摔倒檢測、電瓶車進電梯檢測等。
以下是一些常見的目標檢測算法:
1.2.3 圖像分割
圖像分割指的是將數字圖像細分為多個圖像子區域的過程,即對圖像中的每個像素加標簽,這一過程使得具有相同標簽的像素具有某種共同視覺特性。圖像分割的目的是簡化或改變圖像的表示形式,使得圖像更容易理解和分析。圖像分割通常用于定位圖像中的物體和邊界(線、曲線等)。圖像分割的領域非常多,如人像分割、車道線分割、無人車、地塊檢測、表計識別等。
以下是一些常見的圖像分割算法:
U-Net
DeepLabv3+
PSPNet
GSCNN
HRNet
PP-LiteSeg
PP-HumanSeg
PP-Matting
二、自然語言處理
自然語言處理(Natural Language Processing,簡稱 NLP)是計算機科學和人工智能領域的一個重要方向。它主要研究人與計算機之間,使用自然語言進行有效通信的各種理論和方法。簡單來說,計算機以用戶的自然語言數據作為輸入,在其內部通過定義的算法進行加工、計算等系列操作后(用以模擬人類對自然語言的理解),再返回用戶所期望的結果。
隨著計算機和互聯網技術的發展,自然語言處理技術在各領域廣泛應用,我們平時常用的搜索引擎、新聞推薦、智能音箱等產品,都是以自然語言處理技術為核心的互聯網和人工智能產品。
三、推薦系統
互聯網和信息計算的快速發展,衍生了海量的數據,我們已經進入了一個信息爆炸的時代,每時每刻都有海量信息產生,然而這些信息并不全是個人所關心的,用戶從大量的信息中尋找對自己有用的信息也變得越來越困難。另一方面,信息的生產方也在絞盡腦汁地把用戶感興趣的信息送到用戶面前,每個人的興趣又不盡相同,所以可以實現千人千面的推薦系統應運而生。簡單來說,推薦系統是根據用戶的瀏覽習慣,確定用戶的興趣,通過發掘用戶的行為,將合適的信息推薦給用戶,滿足用戶的個性化需求,幫助用戶找到對他胃口但不易找到的信息或商品。
推薦系統在互聯網和傳統行業中都有著大量的應用。在互聯網行業,幾乎所有互聯網平臺都應用了推薦系統,如資訊新聞、影視劇、知識社區的內容推薦、電商平臺的商品推薦等;在傳統行業中,有些用于企業的營銷環節,如銀行的金融產品推薦、保險公司的保險產品推薦等。
3.1 常用的推薦系統算法實現方案
協同過濾推薦(Collaborative Filtering Recommendation)
基于用戶的協同過濾:根據用戶的歷史喜好分析出相似興趣的人,然后給用戶推薦其他人喜歡的物品。例如,小李和小張對物品 A、B 都給了十分好評,那么可以認為小李和小張具有相似的興趣愛好,如果小李給物品 C 十分好評,那么可以把 C 推薦給小張。
基于物品的協同過濾:根據用戶的歷史喜好分析出相似物品,然后給用戶推薦同類物品。例如,小李對物品 A、B、C 給了十分好評,小王對物品 A、C 給了十分好評,從這些用戶的喜好中分析出喜歡 A 的人都喜歡 C,物品 A 和 C 是相似的,如果小張給了 A 好評,那么可以把 C 也推薦給小張。
基于內容過濾推薦(Content-based Filtering Recommendation)
核心是衡量出兩個物品的相似度。首先對物品或內容的特征作出描述,發現其相關性,然后基于用戶以往的喜好記錄,推薦給用戶相似的物品。例如,小張對物品 A 感興趣,而物品 A 和物品 C 是同類物品(從物品的內容描述上判斷),可以把物品 C 也推薦給小張。
組合推薦(Hybrid Recommendation)
實際應用中往往不只采用某一種推薦方法,而是通過一定的組合方法將多個算法混合在一起,以實現更好的推薦效果,比如加權混合、分層混合等。具體選擇哪種方式和應用場景有很大關系。
四、圖像分類實驗補充
4.1 CIFAR-100 數據集實驗
CIFAR-100 數據集有 100 個類別,每個類別有 600 張大小為 32×32 的彩色圖像,其中 500 張作為訓練集,100 張作為測試集。對于每一張圖像,它有 fine_labels
和 coarse_labels
兩個標簽,分別代表圖像的細粒度和粗粒度標簽。對應下圖中的 classes 和 superclass。 也就是說, CIFAR100 數據集是層次的。
實驗代碼
# python --version 3.8.10
# PyTorch --version 2.3.1
# torchvision --version 0.18.1
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torchvision.datasets import CIFAR100# 定義超參數
num_epochs = 5
batch_size = 64
learning_rate = 0.001kernel_size = 5
image = 32# 數據增強
# transform_train = transforms.Compose([
# transforms.RandomHorizontalFlip(),
# transforms.RandomCrop(32, padding=4),
# transforms.ToTensor(),
# transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
# ])
#
# transform_test = transforms.Compose([
# transforms.ToTensor(),
# transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
# ])
# # 加載和預處理數據
# train_dataset = CIFAR100(root='./', train=True, transform=transform_train, download=False)
# test_dataset = CIFAR100(root='./', train=False, transform=transform_test, download=False)# 加載和預處理數據
train_dataset = CIFAR100(root='./', train=True, transform=transforms.ToTensor(), download=False)
test_dataset = CIFAR100(root='./', train=False, transform=transforms.ToTensor(), download=False)
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)# 定義CNN模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=5, padding=2, stride=1)self.relu1 = nn.ReLU()self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5)self.relu2 = nn.ReLU()self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)self.fc1 = nn.Linear(in_features=16*6*6, out_features=100)def forward(self, x):x = self.pool1(self.relu1(self.conv1(x)))x = self.pool2(self.relu2(self.conv2(x)))x = x.view(-1, 16*6*6) # Flattenx = self.fc1(x)return x# 訓練模型
def train(model, train_loader, optimizer, criterion, epochs):model.train()for epoch in range(epochs):for i, (images, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model.forward(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()if i % 100 == 0:print(f"Epoch [{epoch + 1}/{epochs}], step {i + 1}/{len(train_loader)}, Loss: {loss.item()}")# 測試模型
def predict(model, test_loader):model.eval()correct = 0total = 0with torch.no_grad():for images, labels in test_loader:outputs = model.forward(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Accuracy on test set: {100 * correct / total:.2f}%')# 初始化模型、損失函數和優化器
model = CNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 訓練并測試模型
train(model, train_loader, optimizer, criterion, epochs=num_epochs)# 模型保存并測試
torch.save(model.state_dict(), 'cnn_state_dict.pth')# 加載模型
model = CNN()
model.load_state_dict(torch.load('cnn_state_dict.pth'))
predict(model, test_loader)
4.2?CIFAR-10
CIFAR-10 數據集是一個用于普適物體識別的計算機視覺數據集, 包含 60000張 32x32 的 RGB 彩色圖片, 總共分為 10 個類別。 每個類別包含 6000 張圖像, 其中 50000 張用于訓練集, 10000 張用于測試集。
實驗代碼?
# python --version 3.8.10
# PyTorch --version 2.3.1
# torchvision --version 0.18.1
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torchvision.datasets import CIFAR10# 定義超參數
num_epochs = 1
batch_size = 64
learning_rate = 0.001# 加載和預處理數據
train_dataset = CIFAR10(root='./', train=True, transform=transforms.ToTensor(), download=False)
test_dataset = CIFAR10(root='./', train=False, transform=transforms.ToTensor(), download=False)
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)# 定義CNN模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=5, padding=2, stride=1)self.relu1 = nn.ReLU()self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5)self.relu2 = nn.ReLU()self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)self.fc1 = nn.Linear(in_features=16*6*6, out_features=10)def forward(self, x):x = self.pool1(self.relu1(self.conv1(x)))x = self.pool2(self.relu2(self.conv2(x)))x = x.view(-1, 16*6*6) # Flattenx = self.fc1(x) #會自動加softmaxreturn x# 訓練模型
def train(model, train_loader, optimizer, criterion, epochs):model.train()for epoch in range(epochs):for i, (images, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model.forward(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()if i % 100 == 0:print(f"Epoch [{epoch + 1}/{epochs}], step {i + 1}/{len(train_loader)}, Loss: {loss.item()}")# 測試模型
def predict(model, test_loader):model.eval()correct = 0total = 0with torch.no_grad():for images, labels in test_loader:outputs = model.forward(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Accuracy on test set: {100 * correct / total:.2f}%')# 初始化模型、損失函數和優化器
model = CNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 訓練并測試模型
train(model, train_loader, optimizer, criterion, epochs=num_epochs)# 模型保存并測試
torch.save(model.state_dict(), 'cnn_state_dict.pth')# 加載模型
model = CNN()
model.load_state_dict(torch.load('cnn_state_dict.pth'))
predict(model, test_loader)