1.任务要求
2.数据处理
3.训练过程
4.踩的一些坑
5.总结
6.完善
1.任务要求基于自然驾驶采集的图像数据,评价雨雪雾等恶劣天气场景下交通参与者的检测的性能,输出二维边界框(BoundingBox)。
其中,所有遮挡或截断比例小于70%、长边像素大于10的非机动车辆均需要识别,所有遮挡或截断比例小于70%、长边像素大于15的行人目标均需要识别。
当目标被遮挡时,边界框需要包含目标被遮挡的部分,当目标被截断时(目标的一部分在镜头外),边界框只需包含目标在图像内可见部分即可。
对于骑行人,需要分别输出非机动车框和行人框。
首先看一下官方给的数据集:
官方给的label里面是json文件,需要把json文件转化成Yolo需要的txt文件。
然后需要划分训练集和验证集,我划分的比例是8:2,文件结果如下:
数据处理的代码如下:
import json
import os
import random
import cv2
data_path = "F:/SOTIF/data/"
catagory_id = {"pedestrian": 0, "non-motor-vehicle": 1, "motor-vehicle": 2, "other": 3}
save_image_path = "F:/SOTIF/data/VOCdevkit/images/"
save_label_path = "F:/SOTIF/data/VOCdevkit/labels/"
TRAIN_RATIO = 80 # 训练集和测试集划分的比例
def anno(json_path):
"从json文件中获取信息"
with open(json_path, "r") as f:
dict = json.load(f)
img_path = dict.get("info").get("image_name")
img_id = img_path.replace('.png', '')
annnotations = dict.get('annotations')
prob = random.randint(1, 100) # 随机数划分比例
if prob
3.训练过程
我用的是Yolov3训练的,设置的Epoch是300,这是跑100个Epoch左右,mAp的值在0.83左右,测试结果如下:
但是也有一些检测的比较离谱的,两张图片只差了一帧,结果却相差那么大,如下:
4.踩的一些坑4.1 在处理数据的时候,错把json文件里的bbox(x,y,w,h)的存储方式当成了bbox(x1,y1,x2,y2),导致得到的都是一些错的数据,用这些错的数据训练了很久,然后发现效果特别差,如下:
起初以为问题出在数据不均衡,因为我用代码计算了一下每个类别的数量,结果就出现了下面的离谱数据:'non-motor-vehicle': 428, 'motor-vehicle': 10073, 'pedestrian': 998, 'other': 7
然后就想着对数据进行数据增广的 *** 作,在yolo里面自带的有对数据处理的程序,处理完之后发现效果还是很差,然后就想到了可能是数据处理出错了,然后又分析json文件,知道了bbox里面储存的是(x,y,w,h)。
等修正之后程序就能正常训练了。
在测试过程中,发现有些图片的检测偏差比较大,接下来准备增加训练的Epoch,来提高mAP,再试试测试的效果。
然后再通过换网络,试试Yolov5的效果。
还有一种设想是在进行训练之前,对图片进行一个除雾,除雨雪的 *** 作,减少对目标物的遮挡,然后再进行训练。
上面提到的在检测的时候会出现一些检测特别离谱的情况,把mAP提高到0.93的时候还是存在这种情况,然后就把用Yolov3训练出来的模型在Yolov5上运行,发现效果很好,没有之前存在的那种情况了。
之后我就找为什么在v3中会发生这种情况,后来发现在进行数据处理的时候,训练集和验证集分的有问题,导致了那种情况。
现在在用Yolov5训练模型,这是mAP值为0.6时的检测效果,如下:
test
后续会继续用Yolov5进行训练,提高mAP的值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)