目标检测中的IoU理论讲解+代码实现
IoU 理论讲解在计算机中,图像的坐标系是以左上角为原点,原点向右(x轴)和向下(y轴)分别作为两个坐标轴构成的,分别代表图像的宽度(width)和高度(height)。
下面的图片中,红色框是标注好的框(Ground Truth),蓝色框是预测出来的。
那么这两个框的交集就是下面黄色填充的区域:
而两个框的并集,就是把两个框的区域合并(重叠部分+不重叠部分),就像下面这样:
IoU就是交集区域面积与并集区域面积的比值,其计算公式如下:$$IoU=\frac{交集}{并集}$$
假设已知每个框的左上角坐标和右下角坐标,具体地,用[x1,y1,x2,y2]代表蓝色框的坐标,用[xx1,yy1,xx2,yy2]代表红色框的坐标:
现在来确定交集的左上角和右下角的坐标:
左上角坐标为$(max(x1,xx1),max(y1,yy1))$右下角坐标为$(min(x2,xx2),min(y2,yy2))$
那么两者的交集区域面积为:$$[min(y2,yy2)-max(y1,yy1)]*[min(x2,xx2)-max(x1,xx1)]$$
当两者无交集时,上式的乘法中有一项为负数,我们可以规定 ...
手把手教你打造一个汽车检测器!
本文将带你打造一个汽车检测器,使用的算法是PyTorch版本的YOLOV3。本文不会讲解该算法的细节,而是专注于如何去实现自己的汽车检测器,主要包括数据下载,数据清洗,数据集制作以及训练和检测(图片检测,视频检测)等过程。即使你不知道YOLOV3是什么也没关系,这对于阅读本文几乎毫无影响。
数据集下载为了检测汽车,首先需要获取含有汽车的标注好的数据集,这里我选择了KITTI。由于官网下载太慢,推荐使用下面的百度云链接进行下载。
下载KITTI数据集:https://pan.baidu.com/s/1t3TXXkqVR4NGqZwQiGEIzg提取码:cw35
源码来自Github开源项目https://github.com/eriklindernoren/PyTorch-YOLOv3,为了适应本文的内容,我将其做了些许更改,一并上传到了百度云,在公众号后台回复"detect"直达下载地址。
数据清洗在主目录PyTorch-YOLOv3-master下新建文件夹datasets,在datasets中新建四个文件夹:train_image,train_label,pr ...
魔改交叉熵
在之前的这篇文章中,我们介绍了PyTorch中的交叉熵损失函数的具体使用方法(传送门),并举了大量的栗子进行解释。
在此基础上,就可以尝试对交叉熵进行魔改啦~
CrossEntropyLoss到底做了什么?
吃瓜群众:那说一下魔改的具体内容呗…
别着急,在开始魔改之前,需要花些篇幅介绍下在PyTorch中的CrossEntropyLoss内部所做的事情。这是官方给出的关于CrossEntropyLoss的维度说明。简而言之,分为两种情况:
网络的输出shape为[N,C],对应的真实类别标签维度就得是[N];
网络的输出shape为[N,C,d1,d2,...],对应的真实类别标签维度就得是[N,d1,d2,...];
对于第一种情况,我们在这篇文章(传送门)的最后已经讲过,本文将以第二种形式的数据进行举例说明。
来看一下贯穿本文的一个栗子:
假设网络的输出output的shape为[1,3,256,256],其中1代表batchsize,3代表这是个三分类问题,后面的两个256可以看作是一张256*256的图片的高(height)和宽(width),也就是说,总共有256*2 ...
那些年,我们一起实现的交叉熵
最近在做交叉熵的魔改,所以需要好好了解下交叉熵,遂有此文。
关于交叉熵的定义请自行百度,相信点进来的你对其基本概念不陌生。
本文将结合PyTorch,介绍离散形式的交叉熵在二分类以及多分类中的应用。注意,本文出现的二分类交叉熵和多分类交叉熵,本质上都是一个东西,二分类交叉熵可以看作是多分类交叉熵的一个特例,只不过在PyTorch中对应方法的实现方式不同(不同之处将在正文详细讲解)。
好了,废话少叙,正文开始~
二分类交叉熵$$L=-\frac1N \sum_{i=1}^{N}[y_ilog(p_i)+(1-y_i)log(1-p_i)]$$其中,$N$是总样本数,$y_i$是第$i$个样本的所属类别,$p_i$是第$i$个样本的预测值,一般来说,它是一个概率值。
上栗子:
.
$y_i$
$p_i$
第1个样本
1
0.8
第1个样本
0
0.2
第1个样本
0
0.4
按照上面的公式,交叉熵计算如下:$$L=\frac13[(1*log0.8+(1-1)log(1-0.8))+(0log0.2+(1-0)log(1-0.2))+(0log0.4+(1-0)*l ...
1小时快速入门PyTorch
12#二话不说,先把包导入进来~import torch
tensor初始化123#定义一个tensormy_tensor=torch.tensor([[1,2,3],[4,5,6]])print(my_tensor)
tensor([[1, 2, 3],
[4, 5, 6]])
123#指定tensor的数据类型my_tensor=torch.tensor([[1,2,3],[4,5,6]],dtype=torch.float32)print(my_tensor)
tensor([[1., 2., 3.],
[4., 5., 6.]])
123#指定devicemy_tensor=torch.tensor([[1,2,3],[4,5,6]],dtype=torch.float32,device='cuda')print(my_tensor)
tensor([[1., 2., 3.],
[4., 5., 6.]], device='cuda:0')
123#如果有gpu则使用gpu,此时d ...
含码量为零--醒醒,你的模型或许是错的
进化,进化这个社会充满了模型。
按照达尔文的进化论,从毫不起眼的微生物到如今世间万物的演变,都是在不断地优胜劣汰的追逐中自发产生的,今天的一切,都是自然选择的结果,包括你我。
走过了茹毛饮血的原始时代,熬过了奴隶社会的艰辛,在两千多年的封建社会中不断发展着,冲破了近代以来帝国列强的封锁与侵略,建立了新中国。直至今日,在马克思主义与中国实际相结合的思想的正确引领下,我国开辟了中国特色社会主义道路,并在这条道路上奋勇前行。
1如何去解释其正确性?
社会本身就是一个模型。
只是在最开始的时候,模型的权重是被随机初始化的,模型根本什么都不会。无论面对任何问题,模型只能随机的给出答案,这无疑是在碰运气。
为了进一步回答这一问题,必须回到过去。
回到过去万物伊始时,诞生了许许多多不同种类的微小生命体,这些生命体在一开始面对这个世界的时候是茫然无措的,天敌,风雨,雷电,海啸,地震,它们任凭着自然力量的摆布。但是,在经历了些许后,某些生命体从中学到了某些机理,尽管我们很难解释这些机理是如何被学习到的,但这一点突破使得这些生命体进化了,有些进化出了感光系统,从而可以帮助它们防御天敌的捕食,有些进化出了可 ...
一行代码搞定文件批量重命名
在我的rgb文件夹中,含有若干张图片,先使用os.listdir来查看一下这些图片的名字:
1234path = 'rgb'all_pics=os.listdir(path)for i in all_pics: print(i)
输出图片名字:
1234567891011121314color_0000.jpgcolor_0001.jpgcolor_0002.jpgcolor_0003.jpgcolor_0004.jpgcolor_0005.jpgcolor_0006.jpgcolor_0007.jpgcolor_0008.jpgcolor_0009.jpgcolor_0010.jpgcolor_0011.jpgcolor_0012.jpg...
现在,我希望将这些图片的名字中的color_前缀去掉,并且将0001,0013等前面多余的0给去掉,具体来说,将0001改成1,将0013改成13,其余同理进行处理。
先观察一下原始名字的结构,拿color_0001.jpg为例:
1img='color_0001.jpg'
我们可以使用Pyth ...
一阶运动模型
最近,”蚂蚁雅黑”又火了一波,在B站搜索”蚂蚁雅黑”,映入眼帘的是这样的场景
它利用某种技术,可以让一张静态图片动起来,无论是影视人物的画像,还是活在古画里的历代皇帝,甚至动漫人物,雕塑人物,只要有一份参考视频做参考,他们就统统都能动起来,而且毫无违和感。
本文分为两部分,第一部分主要介绍上面提到的某种技术,第二部分手把手教你生成这种神奇的视频。
对于理论不感冒的小伙伴,也可以直接划到动手实践部分进行阅读。
对了,按照本文操作生成的视频已经放在文末,欢迎围观,哈哈哈~
理论讲解
整个框架由两部分组成:运动估计模块(Motion Module)和图像生成模块(Generation Module)。
用一段话来描述整个框架在做的事情:
输入的数据包括原图像(Source)和驱动视频(Driving Frame),这两部分数据被输入关键点检测器(Keypoint Detector,它是一个编解码器网络),以提取关键点(Keypoint),这里的关键点包含两部分:源图像中的关键点+驱动视频中的关键点;接着,这些关键点通过仿射变换(Affine Transformations),得到一阶运动表示 ...
Python实现10大经典排序算法
大家好,我最近在重学数据结构与算法这门课,顺手整理了10大经典排序算法的Python实现,并配有动画加以理解,建议收藏起来慢慢食用~
好了,废话少说,上干货 !
1. 冒泡排序
123456def bubbleSort(arr): for i in range(1, len(arr)): for j in range(0, len(arr)-i): if arr[j] > arr[j+1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] return arr
2. 选择排序
1234567891011def selectionSort(arr): for i in range(len(arr) - 1): # 记录最小数的索引 minIndex = i for j in range(i + 1, len(arr)): if arr[j] < arr[minIndex]: ...