【神经网络与深度学习】4.深度学习视觉应用

算法评估

TP: 被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数
FP: 被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数
FN:被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数
TN: 被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数

PR

  1. 准确率(Accuracy): T P + T N T P + T N + F P + F N \frac{T P+T N}{T P+T N+F P+F N} TP+TN+FP+FNTP+TN

  2. 精确率(Precision): T P T P + F P \frac{TP}{TP+FP} TP+FPTP

  3. 召回率(Recall): T P T P + F N \frac{TP}{TP+FN} TP+FNTP 。召回率越高,准确度越低

  4. 均值平均准确率(Average Precision):相当于PR曲线下的面积
    A P = ∑ k = 1 N P ( k ) Δ r ( k ) A P=\sum_{k=1}^{N} P(k) \Delta r(k) AP=k=1NP(k)Δr(k)

P-R曲线

目标检测(YOLO)

基本原理

很多时候图像里有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体位置。在计算机视觉里,我们将这类任务称为目标检测(object detection)或物体检测。

目标检测在多个领域中被广泛使用。例如,在无人驾驶里,我们需要通过识别拍摄到的视频图像里的车辆、行人、道路和障碍的位置来规划行进线路。机器人也常通过该任务来检测感兴趣的目标。安防领域则需要检测异常目标,如歹徒或者炸弹。

%matplotlib inline
from PIL import Image
import sys
sys.path.append("..") 
import d2lzh_pytorch as d2l
d2l.set_figsize()
img = Image.open('img/catdog.jpg')
d2l.plt.imshow(img);

d2l.set_figsize()
img = Image.open('img/catdog.jpg')
d2l.plt.imshow(img); 
# 加分号只显示图
dog_bbox, cat_bbox = [60, 45, 378, 516], [400, 112, 655, 493]

def bbox_to_rect(bbox, color): 
# 将边界框(左上x, 左上y, 右下x, 右下y)格式转换成matplotlib格式:
# ((左上x, 左上y), 宽, 高)
return d2l.plt.Rectangle(xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0],height=bbox[3]-bbox[1],fill=False, edgecolor=color,linewidth=2)

fig = d2l.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, 'blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'));

语义分割

语义分割关注如何将图像分割成属于不同语义类别的区域。值得一提的是,这些语义区域的标注和预测都是像素级的。下图展示了语义分割中图像有关狗、猫和背景的标签。可以看到,与目标检测相比,语义分割标注的像素级的边框显然更加精细。
在这里插入图片描述

相似概念辨析:

  • 图像分割
    图像分割将图像分割成若干组成区域。这类问题的方法通常利用图像中像素之间的相关性。它在训练时不需要有关图像像素的标签信息,在预测时也无法保证分割出的区域具有我们希望得到的语义。
  • 实例分割
    实例分割又叫同时检测并分割。它研究如何识别图像中各个目标实例的像素级区域。与语义分割有所不同。
%matplotlib inline
import time
import torch
import torch.nn.functional as F
import torchvision
import numpy as np
from PIL import Image
from tqdm import tqdm
import sys
sys.path.append("..") 
import d2lzh_pytorch as d2l

def read_voc_images(root="../../data/VOCdevkit/VOC2012", 
is_train=True, max_num=None):
txt_fname = '%s/ImageSets/Segmentation/%s' % (
root, 'train.txt' if is_train else 'val.txt')
with open(txt_fname, 'r') as f:
images = f.read().split()
if max_num is not None:
images = images[:min(max_num, len(images))]
features, labels = [None] * len(images), [None] * len(images)
for i, fname in tqdm(enumerate(images)):
features[i] = Image.open('%s/JPEGImages/%s.jpg' % 
(root,fname)).convert("RGB")
labels[i] = Image.open('%s/SegmentationClass/%s.png' % 
(root,fname)).convert("RGB")
return features, labels # PIL image
voc_dir = "../../data/VOCdevkit/VOC2012"
train_features, train_labels = read_voc_images(voc_dir, max_num=100)

n = 5
imgs = train_features[0:n] + train_labels[0:n]
d2l.show_images(imgs, 2, n);

风格迁移

使用卷积神经网络自动将某图像中的样式应用在另一图像之上,即风格迁移。我们需要两张输入图像,一张是内容图像,另一张是样式图像,目标是修改内容图像使其在样式上接近样式图像
在这里插入图片描述

  • 首先,我们初始化合成图像,例如将其初始化成内容图像。该合成图像是样式迁移过程中唯一需要更新的变量,即样式迁移所需迭代的模型参数。
  • 然后,我们选择一个预训练的卷积神经网络来抽取图像的特征,其中的模型参数在训练中无须更新。深度卷积神经网络凭借多个层逐级抽取图像的特征。我们可以选择其中某些层的输出作为内容特征或样式特征。
    在这里插入图片描述
    样式迁移常用的损失函数由3部分组成:
  • 内容损失(content loss)使合成图像与内容图像在内容特征上接近
  • 样式损失(style loss)令合成图像与样式图像在样式特征上接近
  • 总变差损失(total variation loss)则有助于减少合成图像中的噪点。
    最后,当模型训练结束时,我们输出样式迁移的模型参数,即得到最终的合成图像。

未来展望

  • 生成对抗网络
    生成对抗网络(GANs, generative adversarial networks)的模型通过框架中至少有两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)。其整体结构如下:

在这里插入图片描述

原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。
一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。

本文参考《动手深度学习》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值