毕业设计ing,但中途要出去一波。做个记录,备忘。
基于jetson nano和yolov5 的 车行人检测。
目前已经做的工作:
1、数据集的制作,原本是用的老师给的自己拍的一些数据(含夜间),但效果一般。更换BDD100K的智能驾驶数据集。
但智能驾驶的数据集的分类有10种,还有一些比较小的目标,不能直接拿过来用。
这里的工作进行了数据清洗,将小目标去除(小于图片的千分之一),将非人和车的标签去除,并将其转化成yolo格式数据集。
参考两位博主的代码:
【玩转yolov5】使用bdd100k数据集训练行人和全车模型,链接:https://blog.csdn.net/ChuiGeDaQiQiu/article/details/113415081
bdd100k数据集制作用于YOLOv3训练,链接:https://blog.csdn.net/fly_wt/article/details/98957748
我整合了一下生成了试用我自己的。(保留夜间)
import json
# 这里是我需要的10个类别
categorys = ['car', 'bus', 'person', 'bike', 'truck', 'motor', 'train', 'rider', 'traffic sign', 'traffic light']
##但我想归类 将 car bus truck 0 1 4归为一类 0 2 person归为一类 1
def parseJson(jsonFile):
'''
params:
jsonFile -- BDD00K数据集的一个json标签文件
return:
返回一个列表的列表,存储了一个json文件里面的方框坐标及其所属的类,
'''
objs = []
obj = []
info = jsonFile
name = info['name']
objects = info['labels']
for i in objects:
if (i['category'] in categorys):
obj.append(int(i['box2d']['x1']))
obj.append(int(i['box2d']['y1']))
obj.append(int(i['box2d']['x2']))
obj.append(int(i['box2d']['y2']))
obj.append(i['category'])
objs.append(obj)
obj = []
# print("objs",objs)
return name, objs
# test
f = open("labels/train/bdd100k_labels_images_train.json")
info = json.load(f)
objects = info
n = len(objects) ##图片个数
thr=0.001
for i in range(n): #每一张图片的操作
name, result = parseJson(objects[i]) ##result一张图片的所有个标注信息
yolotxt = open('F:/data/bdd100k/images/labels2/train/'+name.replace('.jpg','')+'.txt', mode='w')##新建的txt
stryolos='' ##txt格式内容
for j in range(len(result)):
cls_id = categorys.index(result[j][4])
##归类
if( cls_id not in [0,1,2,4]):
continue
if (cls_id in [0,1,4]):
cls_id=0
if(cls_id == 2):
cls_id=1
cx=(result[j][0]+result[j][2])/2
cy = (result[j][1] + result[j][3]) / 2
w=abs(result[j][0]-result[j][2])
h=abs(result[j][1]-result[j][3])
##标记图像太小删除
if(w*h<thr * 1280*720):
continue
if([cx,cy,w,h].count(0)>0):
continue
h=h/720
cx = cx/ 1280
w = w / 1280
cy = cy/ 720
stryolo= str(cls_id)+ ' '+str(format(cx,'.6f'))+' '+str(format(cy,'.6f'))+' '+str(format(w,'.6f'))+' '+str(format(h,'.6f'))+'\n'
stryolos+=stryolo
print(stryolos)
yolotxt.write(stryolos)
# print(len(result))
import json
# 这里是我需要的10个类别
categorys = ['car', 'bus', 'person', 'bike', 'truck', 'motor', 'train', 'rider', 'traffic sign', 'traffic light']
##但我想归类 将 car bus truck 0 1 4归为一类 0 2 person归为一类 1
def parseJson(jsonFile):
'''
params:
jsonFile -- BDD00K数据集的一个json标签文件
return:
返回一个列表的列表,存储了一个json文件里面的方框坐标及其所属的类,
'''
objs = []
obj = []
info = jsonFile
name = info['name']
objects = info['labels']
for i in objects:
if (i['category'] in categorys):
obj.append(int(i['box2d']['x1']))
obj.append(int(i['box2d']['y1']))
obj.append(int(i['box2d']['x2']))
obj.append(int(i['box2d']['y2']))
obj.append(i['category'])
objs.append(obj)
obj = []
# print("objs",objs)
return name, objs
# test
f = open("labels/train/bdd100k_labels_images_train.json")
info = json.load(f)
objects = info
n = len(objects) ##图片个数
thr=0.001
for i in range(n): #每一张图片的操作
name, result = parseJson(objects[i]) ##result一张图片的所有个标注信息
yolotxt = open('F:/data/bdd100k/images/labels2/train/'+name.replace('.jpg','')+'.txt', mode='w')##新建的txt
stryolos='' ##txt格式内容
for j in range(len(result)):
cls_id = categorys.index(result[j][4])
##归类
if( cls_id not in [0,1,2,4]):
continue
if (cls_id in [0,1,4]):
cls_id=0
if(cls_id == 2):
cls_id=1
cx=(result[j][0]+result[j][2])/2
cy = (result[j][1] + result[j][3]) / 2
w=abs(result[j][0]-result[j][2])
h=abs(result[j][1]-result[j][3])
##标记图像太小删除
if(w*h<thr * 1280*720):
continue
if([cx,cy,w,h].count(0)>0):
continue
h=h/720
cx = cx/ 1280
w = w / 1280
cy = cy/ 720
stryolo= str(cls_id)+ ' '+str(format(cx,'.6f'))+' '+str(format(cy,'.6f'))+' '+str(format(w,'.6f'))+' '+str(format(h,'.6f'))+'\n'
stryolos+=stryolo
print(stryolos)
yolotxt.write(stryolos)
# print(len(result))
2:放入yolov5 训练...(没啥好说的)试用yolov5s模型。
放几张结果图:效果还行,后期不行再换模型,加数据。我这只用了10000张图片。
emmm,有点长,下一篇讲jetson nano上的工作。