1. 项目概述:基于深度学习的车位检测与属性识别系统
这个Python脚本实现了一个完整的车位检测与属性识别系统,主要用于处理停车场监控场景中的车位状态分析。系统通过读取二进制格式的检测结果文件(.bin),结合原始图像,实现以下核心功能:
- 解析神经网络输出的车位坐标和属性数据
- 将模型输出的归一化坐标还原到原始图像尺寸
- 对检测结果进行后处理(去重、过滤低质量检测)
- 可视化展示车位位置和各类属性信息
典型应用场景包括智能停车场管理系统、城市停车诱导系统等,可以帮助管理人员实时掌握车位占用情况、特殊车位状态等信息。
2. 核心功能模块解析
2.1 数据读取与解析
脚本的核心是readTensor函数,它负责处理二进制格式的检测结果文件。这种二进制格式具有固定结构,每20个int32数值代表一个车位的完整信息:
python复制def readTensor(tensorFile):
tensor = open(tensorFile,'rb')
infer_data = np.fromfile(tensor, dtype=np.int32)
soltnum = int(len(infer_data) / 20) # 计算检测到的车位数量
每个车位的数据包包含:
- 4个角点的坐标(6-13字节)
- 置信度(4字节)
- 车位类别名称(5字节)
- 多种属性标志(14-19字节):
- isOccupied:是否被占用
- isVIP:是否VIP车位
- iswoman:是否女性专用车位
- isdisabled:是否残疾人车位
- ischarging:是否充电车位
- step:是否阶梯形车位
2.2 坐标转换与缩放
由于神经网络通常在固定尺寸的输入图像上工作(本项目中为608×736),而实际图像可能有不同尺寸,需要进行坐标转换:
python复制h0, w0 = im0.shape[:2] # 原始图像尺寸
sx = w0 / float(MODEL_IN_W) # 宽度缩放比例
sy = h0 / float(MODEL_IN_H) # 高度缩放比例
# 将模型输出坐标转换回原始图像尺寸
x1 = max(int(raw_x1 * sx), 0)
y1 = max(int(raw_y1 * sy), 0)
# 其他三个角点同理...
这种缩放处理保证了检测框能够准确对应到原始图像中的实际位置。
3. 关键算法实现细节
3.1 车位数据后处理
系统实现了两种后处理算法来过滤低质量检测:
- 邻近车位过滤(delrule=1):
python复制# 计算两个车位入口边的距离
if (abs(xi1 - xj1) + abs(yi1 - yj1)) < 40 or (abs(xi2 - xj2) + abs(yi2 - yj2)) < 40:
point_all[j]["delrule"] = 1 # 标记为需要删除
- 形状异常过滤(delrule=2):
python复制# 计算车位两条对角线的夹角
vec1 = [line1[2]-line1[0], line1[3]-line1[1]]
vec2 = [line2[2]-line2[0], line2[3]-line2[1]]
dot_product = vec1[0] * vec2[0] + vec1[1] * vec2[1]
# 计算夹角(度)
radians = math.acos(dot_product/(m1 * m2))
du = math.degrees(radians)
if du > 20: # 如果夹角过大,说明形状不正常
point_all[i]["delrule"] = 2
3.2 属性数据解析
二进制数据中的属性标志使用IEEE 754浮点数格式存储,需要通过特殊方式解析:
python复制point_dict1["isVIP"] = struct.unpack('!f',
int(bin(infer_data[20*i+15])[2:],2).to_bytes(4,byteorder='big'))[0]
这种存储方式虽然节省空间,但增加了数据解析的复杂度。每个属性值实际上是二分类的概率值,大于0.5通常认为该属性成立。
4. 可视化实现
系统使用OpenCV实现了丰富的可视化效果,不同状态的元素使用不同颜色标注:
python复制# 有效车位使用绿色标注
cv2.arrowedLine(im0, (point_i["pointx"][0], point_i["pointy"][0]),
(point_i["pointx"][1], point_i["pointy"][1]), (0, 255, 0), 1, cv2.LINE_AA)
# 被过滤的车位使用黑色标注
cv2.arrowedLine(im0, (point_i["pointx"][0], point_i["pointy"][0]),
(point_i["pointx"][1], point_i["pointy"][1]), (0, 0, 0), 1, cv2.LINE_AA)
可视化内容包括:
- 车位边界(带箭头的连线)
- 置信度分数
- 车位类别名称
- 各种属性状态(占用、VIP等)
5. 系统配置与调试
5.1 关键参数配置
python复制# 模型输入尺寸(需与实际模型训练尺寸一致)
MODEL_IN_W = 608
MODEL_IN_H = 736
# 调试选项:是否输出模型输入尺寸的可视化
DEBUG_DRAW_MODEL_SIZE = True
# 置信度阈值(低于此值的检测结果会被忽略)
CONFIDENCE_THRESHOLD = 0.45
5.2 路径配置
脚本中需要配置几个关键路径:
python复制# 原始图像路径
imagespath = "/ai/DataSets/OD_FSD_zh/TI_test/rm/4/image/"
# 输出结果保存路径
zh = "/ai/TopViewMul/4/psd_out/" + tensorFile.split('/')[-1][:-8] + '.bmp'
6. 性能优化与调试技巧
6.1 性能优化建议
-
批量处理:当前脚本是单张处理,可以改为批量读取和处理图像,利用GPU的并行计算能力。
-
内存优化:对于大型停车场图像,可以先将图像分块处理,再合并结果。
-
多线程处理:IO操作(图像读取、结果保存)可以与计算操作并行。
6.2 常见问题排查
- 坐标越界问题:
python复制# 原始代码中的保护措施
x1 = max(int(raw_x1 * sx), 0) # 确保坐标不小于0
- 图像读取失败:
python复制if im0 is None:
print("读取图片失败:", tensorFile)
return
- 数据解析错误:
python复制if x3 > 1000 or x4 > 1000 or x1 > 1000 or x2 > 1000:
print("数据解析错误"+ tensorFile + str(x3) + '--'+ str(zh1))
7. 扩展与改进方向
-
支持更多车位属性:可以扩展识别电动车位、预约车位等更多类型。
-
集成到Web系统:将检测结果通过API提供给前端展示系统。
-
加入跟踪功能:对连续视频帧中的车位状态进行跟踪,提高状态判断的准确性。
-
模型量化与加速:将模型量化为INT8格式,提高推理速度。
这个车位检测系统展示了如何将深度学习模型应用到实际场景中,通过精心设计的后处理算法和可视化方案,使模型输出更加可靠和直观。系统中的坐标转换、数据解析和后处理算法等关键技术,也可以迁移到其他类似的视觉检测项目中。