计算机视觉
简介
计算机视觉(Computer Vision)又称为机器视觉(Machine Vision),顾名思义是一门“教”会计算机如何去“看”世界的学科。在机器学习大热的前景之下,计算机视觉与自然语言处理(Natural Language Process, NLP)及语音识别(Speech Recognition)并列为机器学习方向的三大热点方向。而计算机视觉也由诸如梯度方向直方图(Histogram of Gradient, HOG)以及尺度不变特征变换(Scale-Invariant Feature Transform, SIFT)等传统的手办特征(Hand-Crafted Feature)与浅层模型的组合逐渐转向了以卷积神经网络(Convolutional Neural Network, CNN)为代表的深度学习模型。
方向
比较基础和热门的几个方向主要包括了:
图像识别
语义分割
目标检测
视觉问答
开源成为AI领域发展引擎
随着深度学习、计算机视觉等学科的发展,各大研究机构和公司陆续开源自己的深度学习框架,论文发表同时开源代码也成了行业内的习惯和共识
OpenMMlab
OpenMMLab是深度学习时代最完整的计算机视觉开源算法体系。OpenMMLab 自 2018 年开源以来,累计发布超过 15 个算法库,涵盖分类、检测、分割、视频理解等众多算法领域,有超过 250 种算法实现和 2000 个预训练模型。
总体架构概览
算法训练部署一体化
机器学习和神经网络简介
“机器学习是让计算机像人类一样学习和行动的科学,通过以观察和现实世界互动的形式向他们提供数据和信息,以自主的方式改善他们的学习。”
机器学习的核心是“使用算法解析数据,从中学习,然后对世界上的某件事情做出决定或预测”。这意味着,与其显式地编写程序来执行某些任务,不如教计算机如何开发一个算法来完成任务。有三种主要类型的机器学习:监督学习、非监督学习和强化学习,所有这些都有其特定的优点和缺点。
有监督学习
监督学习是指数据集的正确输出已知情况下的一类学习算法。因为输入和输出已知,意味着输入和输出之间有一个关系,监督学习算法就是要发现和总结这种“关系”。
监督算法常见的有:
- 线性回归
- 神经网络
- 决策树
- 支持向量机
- KNN
- 朴素贝叶斯算法
无监督学习
无监督学习是指对无标签数据的一类学习算法。因为没有标签信息,意味着需要从数据集中发现和总结模式或者结构。
我们基于数据中的变量之间关系利用聚类算法发现这种内在模式或者结构。
无监督算法有:
主成分分析法(PCA)
异常检测法
自编码算法
深度信念网络
赫比学习法
生成式对抗网络
自组织映射网络
半监督学习
有监督和无监督中间包含的一种学习算法是半监督学习(semi-supervised learning)。对于半监督学习,其训练数据的一部分是有标签的,另一部分没有标签,而没标签数据的数量常常极大于有标签数据数量(这也是符合现实情况的)
简单的归纳就是,是否有监督(supervised),就看输入数据是否有标签(label)。输入数据有标签,则为有监督学习;没标签则为无监督学习。
神经网络
神经网络是机器学习的一种算法,是深度学习的基础,深度学习是机器学习的一个子集。
完整模型训练套路:
import torch
import torchvision
from torch.utils.data import DataLoader
from torch import nn
from torch.nn import MaxPool2d
from torch import nn
# from model import *
# 准备训练和测试数据集
train_data = torchvision.datasets.CIFAR10("./dataset", train=True, transform=torchvision.transforms.ToTensor(), download=True)
test_data = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 获得数据集长度
train_data_size = len(train_data)
test_data_size = len(test_data)
# 如果train_data_size=10.训练数据集的长度为10
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))
# 利用DataLoader来加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)
# 搭建神经网络
class Tuidui(nn.Module):
def __init__(self):
super(Tuidui, self).__init__()
self.model = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=5, stride=1, padding=2),
nn.MaxPool2d(2),
nn.Conv2d(32, 32, kernel_size=5, stride=1, padding=2),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, kernel_size=5, stride=1, padding=2),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(64*4*4, 64),
nn.Linear(64, 10)
)
def forward(self, x):
x = self.model(x)
return x
tuidui = Tuidui()
input = torch.ones((64, 3, 32, 32))#64bathsize,3个通道,32*32
output = tuidui(input)
print(output.shape)
# 创建损失函数
loss_fn = nn.CrossEntropyLoss()
# 定义优化器
optimizer = torch.optim.SGD(tuidui.parameters(), lr=0.01)
# 设置训练网络的一些参数
# 记录训练的次数
total_train_step = 0
# 记录测试的次数
total_test_step = 0
# 训练的轮数
epoch = 10
for i in range(epoch):
print("------------------第{}轮训练开始------------------".format(i+1))
#训练步骤开始
for data in train_dataloader:
imgs, targets = data
outputs = tuidui(imgs)
loss = loss_fn(outputs, targets)
# 优化器优化模型(已训练一次)
optimizer.zero_grad()#梯度清零
loss.backward()#反向传播,得到每个参数节点的梯度
optimizer.step()#调用优化器,对其中参数进行优化
total_train_step=total_train_step+1
# if total_train_step % 100 == 0:
print("训练次数:{},Loss:{}".format(total_train_step, loss.item()))
#测试步骤开始
total_test_loss = 0
with torch.no_grad():
for data in test_dataloader:
imgs, targets = data
outputs = tuidui(imgs)
loss = loss_fn(outputs, targets)
total_test_loss = total_test_loss + loss.item()
print("整体测试集上的Loss:{}".format(total_test_loss))