人工智能路线图
2022-07-23 18:11:38 4 举报
AI智能生成
机器视觉初学者的方向
作者其他创作
大纲/内容
python编程基础
WHY?
目前最流行的深度学习框架都是基于python的,所以python基础很重要。
学习途径:菜鸟编程,B站,网易云课堂等平台;
数学知识
高数
线性代数
概率论
传统图像算法(opencv)
https://blog.csdn.net/HG0724/article/details/116290698
图像基础操作
像素坐标系
读取图像:cv.imread()
显示图像:cv.imshow()
色彩空间转换
BGR->Gray(灰度图)
BGR->HSV(有些算法会使用)
图像的加法
图像的几何变换
缩放
平移
旋转
仿射变换:是对图像的缩放、旋转、翻转和平移等的组合操作。
图像金字塔
用于特征提取,可能不仅对原始输入进行特征提取,还对每一层金字塔进行特征提取,每一层的特征提取可能是不一样的,最后再将每一层的结果总结在一起
形态学操作
腐蚀
膨胀
开运算与闭运算
顶帽与黑帽
深度学习
深度学习框架
pytorch(偏学术)
tensorflow(工业界主流框架)
两者的一些区别
BHWC
子主题
保持学习:多看论文(计算机视觉相关的)
什么是神经网络?
神经网络的工作原理?
网络结构
全连接网络
卷积网络
循环网络
AE、VAE与GAN
梯度下降
卷积神经网络
理论知识
卷积
函数的方式
网络层的方式
特点
局部连接
权值共享
多卷积核
池化(下采样)
填充
激活函数
sigmoid
tanh
softmax
relu
leaky-relu
损失函数
MSE
均方误差损失函数(Mean Squared Error Loss,MSE Loss):适用于回归问题,在预测值和真实值之间计算差距的平方和,
交叉熵损失函数(Cross-Entropy Loss)
适用于多分类问题,测量模型输出的概率分布与真实标签分布之间的差异
应用
基础任务
图像分类
LeNet-5:是最早被广泛应用的CNN,适用于手写数字识别。
AlexNet:是在ImageNet 大规模视觉识别竞赛(ILSVRC)上大获全胜的CNN,以及在计算机视觉领域中最成功的模型之一。
VGGNet:是在ImageNet 竞赛中获得前三甲的深度CNN模型,拥有更深的网络结构设计,提高了分类准确率。
GoogleNet/InceptionNet:是Google提出的一个模型,其在ImageNet 竞赛上取得了冠军。
ResNet:属于残差神经网络(Residual Neural Network),通过引入“shortcut”和“skip connection”机制来解决深度神经网络训练时的梯度问题,获得了更好的分类性能。
图像分类是将一张图片归类到事先定义好的几个类别中的一种。图像分类在计算机视觉、图像搜索、自动驾驶等领域得到广泛应用。
目标检测
用到的关键技术
图像金字塔
0.7.。。
IOU
iou表示两个框重叠的比例,iou越大,表示两个框重叠部分越多,越有可能框的是同一个物体
import numpy as np
# 定义IOU(交并比)计算公式, 传入真实框和其他移动后的框
def iou(box, boxes, isMin=False):
box_area = (box[2] - box[0]) * (box[3] - box[1]) # 计算原始真实框的面积
boxes_area = (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1]) # 计算移动后的框的面积,这里计算的是矩阵
# 找到两个框的内部点计算交集
x1 = np.maximum(box[0], boxes[:, 0])
y1 = np.maximum(box[1], boxes[:, 1])
x2 = np.minimum(box[2], boxes[:, 2])
y2 = np.minimum(box[3], boxes[:, 3])
# 然后找到交集区域的长和宽,有的框没有交集那么相差可能为负,所以需要使用0来规整数据
w = np.maximum(0, x2 - x1)
h = np.maximum(0, y2 - y1)
# 计算交集的面积
inter_area = w * h
# 两种计算方法:1是交并比等于交集除以并集,2是交集除以最小的面积
if isMin:
ovr_area = np.true_divide(inter_area, np.minimum(boxes_area, box_area))
else:
ovr_area = np.true_divide(inter_area, (boxes_area + box_area - inter_area))
# 返回交并比,也就是IOU
return ovr_area
# 定义IOU(交并比)计算公式, 传入真实框和其他移动后的框
def iou(box, boxes, isMin=False):
box_area = (box[2] - box[0]) * (box[3] - box[1]) # 计算原始真实框的面积
boxes_area = (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1]) # 计算移动后的框的面积,这里计算的是矩阵
# 找到两个框的内部点计算交集
x1 = np.maximum(box[0], boxes[:, 0])
y1 = np.maximum(box[1], boxes[:, 1])
x2 = np.minimum(box[2], boxes[:, 2])
y2 = np.minimum(box[3], boxes[:, 3])
# 然后找到交集区域的长和宽,有的框没有交集那么相差可能为负,所以需要使用0来规整数据
w = np.maximum(0, x2 - x1)
h = np.maximum(0, y2 - y1)
# 计算交集的面积
inter_area = w * h
# 两种计算方法:1是交并比等于交集除以并集,2是交集除以最小的面积
if isMin:
ovr_area = np.true_divide(inter_area, np.minimum(boxes_area, box_area))
else:
ovr_area = np.true_divide(inter_area, (boxes_area + box_area - inter_area))
# 返回交并比,也就是IOU
return ovr_area
NMS
# 定义NMS,筛选符合标准的线框
def nms(boxes, thresh=0.3, isMin=False):
# 如果照片里面没有框数据了,就返回空列表
if len(boxes) == 0:
return np.array([])
# 以计算出的iou从大到小排列
_boxes = boxes[(-boxes[:, 4]).argsort()]
r_boxes = []
# 如果框的有1个以上就进行对比
while len(_boxes) > 1:
a_box = _boxes[0] # 取出最大的框
b_boxes = _boxes[1:] # 剩下的框分别和之前的进行比对
r_boxes.append(a_box) # 先将最大iou的框添加到保留框的列表中
# 保留iou 小于0.3的,说明这个框和目前比对的不是同一个框,去除交集较多的框
index = np.where(iou(a_box, b_boxes, isMin) <= thresh)
_boxes = b_boxes[index]
# _boxes = b_boxes[iou(a_box, b_boxes, isMin) < thresh]
# 如果保留的框数量大于0,则添加iou最大的那个框
if len(_boxes) > 0:
r_boxes.append(_boxes[0])
# 将这些框堆叠在一起
return np.stack(r_boxes)
def nms(boxes, thresh=0.3, isMin=False):
# 如果照片里面没有框数据了,就返回空列表
if len(boxes) == 0:
return np.array([])
# 以计算出的iou从大到小排列
_boxes = boxes[(-boxes[:, 4]).argsort()]
r_boxes = []
# 如果框的有1个以上就进行对比
while len(_boxes) > 1:
a_box = _boxes[0] # 取出最大的框
b_boxes = _boxes[1:] # 剩下的框分别和之前的进行比对
r_boxes.append(a_box) # 先将最大iou的框添加到保留框的列表中
# 保留iou 小于0.3的,说明这个框和目前比对的不是同一个框,去除交集较多的框
index = np.where(iou(a_box, b_boxes, isMin) <= thresh)
_boxes = b_boxes[index]
# _boxes = b_boxes[iou(a_box, b_boxes, isMin) < thresh]
# 如果保留的框数量大于0,则添加iou最大的那个框
if len(_boxes) > 0:
r_boxes.append(_boxes[0])
# 将这些框堆叠在一起
return np.stack(r_boxes)
Convert2Square(Numpy实现)
# 定义函数将P网络在原图中抠出来的带有人脸的框转变成正方形,以便输入到R网络中
def convert_to_square(bbox):
squre_bbox = bbox.copy()
if len(bbox) == 0:
return np.array([])
h = bbox[:,3]-bbox[:,1]
w = bbox[:,2]-bbox[:,0]
max_side = np.maximum(w,h)
squre_bbox[:,0] = bbox[:,0]+w*0.5-max_side*0.5
squre_bbox[:,1] = bbox[:, 1] + h* 0.5 - max_side * 0.5
squre_bbox[:,2] = squre_bbox[:,0]+max_side
squre_bbox[:,3] = squre_bbox[:,1]+max_side
return squre_bbox
def convert_to_square(bbox):
squre_bbox = bbox.copy()
if len(bbox) == 0:
return np.array([])
h = bbox[:,3]-bbox[:,1]
w = bbox[:,2]-bbox[:,0]
max_side = np.maximum(w,h)
squre_bbox[:,0] = bbox[:,0]+w*0.5-max_side*0.5
squre_bbox[:,1] = bbox[:, 1] + h* 0.5 - max_side * 0.5
squre_bbox[:,2] = squre_bbox[:,0]+max_side
squre_bbox[:,3] = squre_bbox[:,1]+max_side
return squre_bbox
目标检测是计算机视觉领域中的一个重要问题,旨在自动化地检测出图像或视频中的物体,并给出它们的位置和类别。目标检测可以广泛应用于智能监控、自动驾驶、人脸识别、无人机、机器人等众多领域。
Two stage目标检测算法
先进行区域生成(region proposal,RP)(一个可能包含待检测物体的预选框),再通过卷积神经网络进行样本分类。
任务:特征提取->生成RP->分类/定位回归。
常见Two stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN和Raster R-FCN等。
先进行区域生成(region proposal,RP)(一个可能包含待检测物体的预选框),再通过卷积神经网络进行样本分类。
任务:特征提取->生成RP->分类/定位回归。
常见Two stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN和Raster R-FCN等。
One stage 目标检测算法
不用RP,直接在网络中提取特征来预测物体分类和位置。
任务:特征提取->分类/定位回归。
常见的one stage目标检测算法有:OverFeat、YOLOv1、YOLOv3、SSD和RetinaNet等。
不用RP,直接在网络中提取特征来预测物体分类和位置。
任务:特征提取->分类/定位回归。
常见的one stage目标检测算法有:OverFeat、YOLOv1、YOLOv3、SSD和RetinaNet等。
iDetection
语义分割
语义分割是计算机视觉中的一个重要任务,旨在对图像中的每个像素进行分类,将同一类别的像素划分为同一个区域,从而获得像素级别的图像语义分割结果。简单来说就是抠图
常见的语义分割模型有FCN、SegNet、U-Net、DeepLab等。
0 条评论
下一页