由于之前已经完成了Yolov5的安装、数据集标注、模型训练工作,在此便将训练完成的模型运用起来,完成一个项目。
上述提到的部分可见之前文章:
Yolov5安装及简单使用:Yolov5安装及简单使用
数据集标注:数据集标注方法
模型训练:用Yolov5训练数据集
1.项目思路
通过已经训练完成的模型,可以实现对需要检测的目标标记预测框,若要计算人与车的距离,不妨可以分别计算出人与车的中心点,然后计算二者距离即可,再根据距离来进行风险评估。
2.项目实现
# 计算物体中心点
def calculate_center_point(xy):
return (int(xy[2]) + int(xy[0])) // 2, (int(xy[3]) + int(xy[1])) // 2
# 画出人和车的中心点
def plot_people_points(xy, im):
thickness = -1
color = [0, 255, 0]
center = calculate_center_point(xy)
radius = 10
cv2.circle(im, center, radius, color, thickness)
def plot_car_points(xy, im):
thickness = -1
color = [0, 0, 255] # red
center = calculate_center_point(xy)
radius = 10
cv2.circle(im, center, radius, color, thickness)
# 计算人车距离
def calculate_distance(people_coords, car_coords):
# 人与车的中心点
centers_people = []
centers_car = []
# 分别计算中心点
for i in people_coords:
centers_people.append(calculate_center_point(i))
for i_car in car_coords:
centers_car.append(calculate_center_point(i_car))
centers = itertools.product(people_coords, car_coords, repeat=1)
for xy in centers:
people_center_list = (((int(xy[0][2]) + int(xy[0][0])) // 2,
(int(xy[0][3]) + int(xy[0][1])) // 2))
car_center_list = (((int(xy[1][2]) + int(xy[1][0])) // 2,
(int(xy[1][3]) + int(xy[1][1])) // 2))
# 欧氏距离
return ((car_center_list[0] - people_center_list[0]) ** 2 + (car_center_list[1] - people_center_list[1]) ** 2) ** 0.5
3.项目效果
4.改进思路
由于博主人工智能方面的学习初入门径,所以难免存在一些问题。
- 此处采用的是二维坐标来计算,不够准确,如果运用于实际,显然是不行的,可以修改为三维。
- 实时性不够,如若实际用于交通风险评估并给予示警,很显然是来不及的,可以改进算法来提高实时性。
- 显示结果太过冗杂,可以通过算法改进,通过某种机制来实现结果过滤,是显示的结果相对有意义。