MindSpore:【课程作业经验】基于MindSpore的YOLOv3-Darknet53的车辆检测计数实现
本项目基于MindSpre框架、YOLOv3-Darknet53、VisDrone数据集实现目标检测与计数。
1.项目地址
https://github.com/whitewings-hub/mindspore-yolov3-vehicle_counting
2.环境准备
MindSpore版本为1.5。
3.数据集处理
VisDrone数据集下载http://aiskyeye.com/download/object-detection-2/
需要将原始VisDrone数据集转换为coco格式,然后存放在本地目录
使用https://github.com/whitewings-hub/mindspore-yolov3-vehicle_counting/blob/main/code_2/VisDrone2coco.py来进行处理,python VisDrone2coco.py即可。
4.基于albumentations的数据增强
使用了albumentations库中的RandomBrightnessContrast方法、HueSaturationValue方法、Cutout方法进行随机调整亮度和对比度、随机调整输入图像的色调饱和度、在图像中生成正方形区域来对图像数据进行增强,通过albumentations库中的Compose方法把这三个图像数据增强变换放在一起按顺序执行,并在后面读取图片进行图像数据增强。
transform = A.Compose([
A.RandomBrightnessContrast(p=0.5),
A.HueSaturationValue(),
A.Cutout(num_holes=10, max_h_size=20, max_w_size=20, fill_value=0, p=0.5)
])
5.DIoU-NMS
将普通NMS算法替换为DIoU-NMS算法。在传统NMS代码的基础上,前面按置信度得分从高到底排序并选择置信度得分最高的候选框的操作是一样的,主要增加的额外变量就是两框最小外接框的对角线长的平方以及两框中心点距离的平方,之后再根据DIoU计算的公式进行计算得到DIoU然后过滤掉DIoU高于阈值的框,保留置信度分数最高的目标框并对其余剩下的目标框进行递归。
def _diou_nms(self, dets, thresh=0.6):
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = x1 + dets[:, 2]
y2 = y1 + dets[:, 3]
scores = dets[:, 4]
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
order = scores.argsort()[::-1]
keep = []
while order.size > 0:
i = order[0]
keep.append(i)
xx1 = np.maximum(x1[i], x1[order[1:]])
yy1 = np.maximum(y1[i], y1[order[1:]])
xx2 = np.minimum(x2[i], x2[order[1:]])
yy2 = np.minimum(y2[i], y2[order[1:]])
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h
ovr = inter / (areas[i] + areas[order[1:]] - inter)
center_x1 = (x1[i] + x2[i]) / 2
center_x2 = (x1[order[1:]] + x2[order[1:]]) / 2
center_y1 = (y1[i] + y2[i]) / 2
center_y2 = (y1[order[1:]] + y2[order[1:]]) / 2
inter_diag = (center_x2 - center_x1) ** 2 + (center_y2 - center_y1) ** 2
out_max_x = np.maximum(x2[i], x2[order[1:]]