初入深度学习4——如何修改一个深度学习库

学习前言

在学习过一个深度学习库之后,如果想要满足自己项目或者论文的不同需求,大多数需要对仓库及进行修改,此时如何定位修改的位置,并且对变量进行分析修改,就显得非常重要。
在这里插入图片描述

深度学习库的组成

通过《初入深度学习3——如何分解与学习一个深度学习库》我们已经了解到,一个深度学习仓库具有不同的组成,我们可以将一个深度学习仓库分解如下:
深度学习库的功能通常包括两个部分,一部分是训练模型,另一部分是利用模型进行预测。

在训练模型时,需要考虑模型本身,训练参数,数据加载与损失函数。
在预测模型时,需要考虑模型本身,数据加载,预测后处理。

修改目标定位

在修改仓库前,需要根据所需要修改的功能对需要修改的目标进行定位,比如:
想要对网络结构进行改进,那么就定位到模型本身,然后修改网络结构的特定部分。
想要对训练参数进行改进,那么就定位到训练参数,然后查找各个参数的作用,进一步进行修改。
想要对数据增强进行改进,那么就定位到数据加载,然后分解其中数据增强的部分,修改数据增强的过程。
想要对损失函数进行改进,那么就定位到损失函数,然后分解其中的回归部分、分类部分等,进一步对细节进行修改。
想要对预测结果进行改进,那么就定位到预测后处理,然后根据自身需求,分解每个输出的作用,进一步修改。

因此,在修改前需要做到:
定位修改目标与分析相关变量。

举例

一、任务介绍

接下来,本文将对目标检测算法进行修改,对检测到的对象进行计数

这个计数的过程实现非常简单,但询问的人却蛮多的,简单看看如何实现。

二、目标定位

首先需要对计数这个任务进行分析,分析结果如下:
计数与模型本身并没有什么关系
预测前我们不能进行计数
计数和训练没什么关系
计数发生在预测之后
因此计数是属于预测后处理的内容。我们首先定位到预测的后处理部分。

本文以使用较多的YoloV3-Pytorch库为例,进行解析。定位到YoloV3-Pytorch库的预测的后处理部分,下面的截图中,包括了预测部分与预测后处理的部分。预测后就是预测后处理的部分了。
在这里插入图片描述

扫描二维码关注公众号,回复: 14178569 查看本文章

三、变量分析

对预测结果进行分析,网络self.net的输出是outputs,outputs解码后仍赋给了outputs。这两行过后,outputs是预测结果解码后的内容。
在这里插入图片描述
下一步是进行非极大抑制,结果赋给了results,因此results是非极大抑制后的结果。
在这里插入图片描述
下一步对非极大抑制后的结果进行分解,获得标签,置信度,和预测框坐标。
在这里插入图片描述
在这里,我们已经定位到我们需要的变量了,就是这个top_label,由于top_label代表的是所有预测框的标签,那么我们只需要根据标签进行计数即可。

四、修改代码

既然要使用到top_label,那么首先先打印一下top_label是个什么。
在这里插入图片描述

在这里插入图片描述
打印出来可知,top_label就是一个长条矩阵罢了,里面是每个预测框的标签种类。

由于要进行计数,我们需要判断每个预测框属于哪个类,在python中,利用矩阵可以进行整体的判断,因此我们对self.class_names进行循环,然后判断top_label等于每个类的数量即可。

类别较多时,会将许多无关的类显示出来,因此多增加一个if sub_label_num > 0:的条件判断,只显示有数量的类别。

for i in range(len(self.class_names)):
    sub_label_num = np.sum(top_label == i)
    if sub_label_num > 0:
        print(self.class_names[i], sub_label_num)

之后就可以正常计数了。

总结

代码的修改有易有难,本文举了一个较为简单的例子,但修改的思路却是不变的,首先定位修改目标,然后进行变量分析,最后修改代码即可。

最大的不变就是变化,需求时时刻刻都是在变化的,自己会修改代码,未来的路也会宽的多。

猜你喜欢

转载自blog.csdn.net/weixin_44791964/article/details/123475899