序言
该项目实现过程基于此仓库:车辆检测和多标签属性识别,在此基础上进行优化和修改。
一、车辆属性识别
车辆属性识别,可以分为两部分:一是车辆检测,二是多标签分类;而车辆检测就是我们通常用到的目标检测算法,在这里就没必要多说,我直接使用了yolov5s的coco权重,在检测时剔除其他标签,只保留了车辆的标签:car、bus、truck。
第一部分理解起来相对比较简单,重点来讲多标签分类,什么是多标签分类?通常我们接触到的分类算法往往是一个标签对应一张图片,即这张图是猫,那对应的标签就是猫,如果是狗,那对应的标签就是狗,那有没有可能一张图中即包含了猫也包含了狗呢?答案肯定是有的。
在这些类型的问题中,我们有一组目标变量,被称为多标签分类问题。那么,这两种情况有什么不同吗? 很明显,有很大的不同,因为在第二种情况下,任何图像都可能包含不同图像的多个不同的标签。(重新思考一下,多标签和多分类有什么区别?),来看一下下面这张图(科比和GiGi)
假设我们给科比定义了几种属性:男人、黑人、成年人,那么同样的gigi身上也有几种属性:女人、黑人、未成年人。对于多分类任务来说,男人和女人是相互对立的,即一个实例不可能同时属于男人和女人,同样的也不可能同时属于成年人或者未成年人,只能是某一种属性分类,简而言之,有多个类别,但每个实例只分配一个,因此这些问题被称为多类分类问题。
回顾一下这张图片,科比被定义为男人、黑人、成年人类型。但不同的是,这一次,每个人都有可能被分成一个或多个不同的类别。所以每个实例都可以使用多个类别进行分配。因此,这些类型的问题被称为多标签分类问题。
那么在这个项目中,车辆的属性一共定义为了三种标签:车辆类型、颜色、朝向,在此我只用了其中两种:车辆类型、颜色。
检测出来的效果如下:
用于视频检测的效果如下:
二、模型训练
模型训练在开头的github仓库中有提到,主要是多标签的训练,将原话搬到这里:
训练过程选择交叉熵作为损失函数,需要注意的是,由于是多标签分类,故计算loss的时候需要累加各个标签的loss,其中loss = loss_color + loss_direction + 2.0 * loss_type,根据经验,将车辆类型的loss权重放到到2倍效果较好。
另一方面,训练分为两步:(1). 冻结除了Resnet-18除全连接层之外的所有层,Fine-tune训练到收敛为止;(2).打开第一步中冻结的所有层,进一步Fine-tune训练,调整所有层的权重,直至整个模型收敛为止。
因为我只使用了该仓库的多标签分类权重,没有重新训练,主要还是没有数据,所以这部分没有训练过程,感兴趣的同学可以自己收集数据进行训练。
完整的代码有时间我再整理上传到github上。