24、基于Python和K3s集群的智能交通计算机视觉系统

基于Python和K3s集群的智能交通计算机视觉系统

人工智能(AI)常被用于替代人类日常活动,能赋予系统自主运行的智能。计算机视觉(CV)作为AI的一个子领域,专注于检测视频和图像中的物体,在城市交通检测中应用广泛。本文将介绍如何构建一个基本的智能交通系统,该系统可在车辆行驶时检测汽车、卡车和行人等物体。

1. 技术要求

要部署计算机视觉系统,需要以下条件:
- 一个由公共云提供商(如亚马逊网络服务(AWS)、Azure、谷歌云平台(GCP))托管的Kubernetes集群。
- 配备8GB微型安全数字(SD)卡和小型液晶显示器(LCD)屏幕的Raspberry Pi 4B,用于车载使用。
- 推荐使用Logitech C922 PRO网络摄像头,因其质量好且在Linux上有良好支持。
- 多个用于边缘Raspberry设备的VK - 162 G - Mouse USB GPS Dongle导航模块。
- 具备基本的AI知识。
- 在本地机器上配置好kubectl,用于Kubernetes云集群,避免使用 --kubeconfig 参数。
- 若想使用 kubectl apply 运行YAML配置,可克隆 此仓库 。查看代码目录中的python目录和ch14目录中的yaml目录以获取YAML配置。

2. 计算机视觉与智能交通系统

AI是计算机科学的一个领域,通过数学、统计、语言学、计算机科学等多学科模拟人类智能,也可定义为对理性智能体的研究。智能体接收来自环境的感知信息,这些信息由传感器捕获,经处理后通过执行器采取行动,行动由智能体内部规则决定。

内部规则可通过不同的机器学习(ML)范式实现,如监督学习(SL)、无监督学习(UL)和强化学习(RL)。ML是一种利用历史数据进行预测的AI类型,计算机视觉是ML的一个子集,用于图像和视频分析。

智能交通系统常用于市政部门,以提高安全性和街道交通流量。该系统有静态和动态两种模式,本文使用动态模式。系统可通过边缘计算系统的各层进行解释:
- 云层 :使用名为Traffic Manager的应用程序编程接口(API),将边缘检测到的所有物体存储在Redis实例中。存储的数据包含物体类型(汽车、卡车和行人)和GPS坐标,代表系统中的一级警告。这意味着车辆驾驶员会收到其他驾驶员先前检测到的物体警告。该层还包括一个名为Traffic Map Public的前端应用程序,可在地图上显示检测到的物体,供市政部门监控全市交通。
- 近边缘层 :拥有第四代(4G)/第五代(5G)长期演进(LTE)移动网络,用于将边缘收集的信息传输到互联网,再发送到云层。
- 远边缘层 :有一个Raspberry Pi,用于处理摄像头捕获的信息。该设备安装了K3s作为单节点集群,管理系统使用的所有服务。K3s可实现系统自动化,方便更新和维护系统,并可扩展以使用更多节点添加多个摄像头进行多角度物体检测。集群中的计算机视觉应用程序由两个显示器和两个API组成。一个显示器以Python脚本形式运行在K3s外部,负责捕获视频,使用OpenCV和预编译的TensorFlow Lite模型进行物体检测,实现计算机视觉。系统使用连接到设备的小型LCD触摸屏。另一个显示器是在浏览器上运行的前端应用程序,可在地图上显示检测到的物体,不仅显示本地物体,还显示半径500米内所有车辆检测到的物体。检测到的物体将由Inference API分类,根据驾驶员的警告级别分为三个级别:1级和2级表示警告,3级可忽略。Inference API包含一个预编译的决策树用于分类。GPS Queue API管理所有GPS坐标,并定期将代表警告的检测物体信息发送到云端,供其他驾驶员查看。整个应用程序使用Display、Traffic Map、Inference和GPS Queue组件处理和可视化检测到的物体。GPS Queue服务基于之前创建的GPS服务,有一些修改。可使用外部设备(如Google的Coral USB Accelerator、Rock Pi神经计算棒USB和NVIDIA Jetson Nano)加速神经网络(NN)处理,提高OpenCV的处理速度,增加每秒分析的帧数。
- 微边缘层 :有一个LCD屏幕,用于实时显示所有检测到的物体和驾驶员警告,还可找到VK - 162 G - Mouse GPS模块。

系统工作流程如下:

graph LR
    A[车辆摄像头捕获图像] --> B[OpenCV捕获视频帧或图像]
    B --> C[TensorFlow Lite分类]
    C --> D[Inference API分类警告级别]
    D --> E[本地LCD和浏览器显示信息]
    D --> F[GPS坐标数据发送到云端]
    F --> G[云端公共Web应用显示信息]
3. 使用Redis存储临时物体GPS位置

使用Redis存储通过计算机视觉检测到的所有物体的GPS坐标,需在云端部署Redis实例。使用地理空间索引表示数据,并利用Redis的时间到生存(TTL)功能实现数据的临时存储。具体安装步骤如下:
1. 创建Redis的PersistentVolumeClaim以持久化数据:

$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: db-pv-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
EOF
  1. 创建ConfigMap以配置Redis使用认证密码:
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-configmap
data:
  redis-config: |
    dir /data
    requirepass YOUR_PASSWORD
EOF
  1. 使用之前的redis - configmap ConfigMap和db - pv - claim - 1 PersistentVolumeClaim创建Redis部署,并设置资源限制:
$ cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: redis
  name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: redis
    spec: 
      containers: 
        - name: redis
          image: redis:6.2 
          command: 
            - redis-server 
            - /redisconf/redis.conf 
          ports: 
            - containerPort: 6379 
          resources: 
            limits: 
              cpu: "0.2"
              memory: "128Mi" 
          volumeMounts: 
            - mountPath: "/data" 
              name: redis-storage 
            - mountPath: /redisconf 
              name: config
      volumes:
        - name: config 
          configMap: 
            name: redis-configmap 
            items: 
              - key: redis-config 
                path: redis.conf 
        - name: redis-storage
          persistentVolumeClaim: 
            claimName: db-pv-claim-1
status: {}
EOF
  1. 创建Redis服务,打开端口6379:
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  labels:
    app: redis
  name: redis
spec:
  ports:
    - port: 6379
      protocol: TCP
      targetPort: 6379
  selector:
    app: redis
  type: ClusterIP
EOF
4. 部署计算机视觉服务以检测汽车障碍物
4.1 准备Raspberry Pi运行计算机视觉应用程序

在安装软件之前,需按以下步骤配置Raspberry Pi 4B:
1. 安装使用Debian Bullseye的Raspbian Pi OS(32位),发布时间至少为2022 - 04 - 04。运行TensorFlow Lite模型的代码需在ARMv7设备上运行,以支持Coral USB Accelerator设备和LCD屏幕,目前不支持ARM64。
2. 根据网络摄像头安装驱动程序,本文使用的Logitech C922 PRO网络摄像头可被Raspbian自动检测。
3. 连接并配置GPS模块,VK - 162 G - Mouse模块也可被Raspbian自动检测。
4. 配置网络使用无线连接,安装运行应用程序所需的所有软件包。之后可重新配置无线连接以连接到智能手机的接入点,但需删除 /etc/wpa_supplicant/wpa_supplicant.conf 文件中的先前连接。
5. 安装LCD屏幕的驱动程序,本文使用Miuzei高清多媒体接口(HDMI),可水平翻转屏幕并激活触摸功能(完成所有配置后进行此步骤)。可查看 此仓库 ,也可使用其他LCD屏幕。
6. 在安装K3s之前,在 /boot/cmdline.txt 文件中激活CGROUPS,在行末添加以下标志:

cgroup_memory=1 cgroup_enable=memory

如需了解更多关于CGROUPS的信息,请访问 此链接
7. 通过运行 ifconfig 获取当前互联网协议(IP)地址,查看wlan0接口:

$ ifconfig wlan0
  1. 运行以下命令安装K3s:
$ MASTER_IP=YOUR_PRIVATE_IP
$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--write-kubeconfig-mode 644" sh -s -
  1. 运行以下命令测试是否一切正常:
$ kubectl get nodes

此命令将返回正在运行的唯一节点。

4.2 部署推理服务以检测物体

推理服务用于预测和分类物体是否对驾驶员构成障碍,使用以下表格进行分类:
| n 字段ID | 物体类型 | 警告级别 |
| — | — | — |
| 1 | 汽车 | 1级 |
|… |… |… |

推理服务的源代码由两个文件组成: index.py create_model.py
create_model.py 文件的代码如下:

import pandas as pd
from sklearn import tree
from joblib import dump

df = pd.read_csv("safety_rules.csv", sep=',', header='infer', encoding='latin-1')
df = df.drop(['object'], axis=1)
df.head()
feature_cols = ["n"]
X = df.loc[:, feature_cols]
y = df.warning_level
clf = tree.DecisionTreeRegressor()
model = clf.fit(X, y)
dump(clf, 'safety_rules.model')

此代码读取 safety_rules.csv 文件,将其转换为DataFrame并删除 object 列,使用scikit - learn生成一个决策树模型 safety_rules.model 。每次构建容器时,通过调用API的Dockerfile中的 create_model.py 文件更新模型。

index.py 文件的服务代码如下:

<Import Flask and Scikit Learn libraries>
def loadModel():
    <Load the model safety_rules.model>
    <Assign the loaded model to the variable clf>

@app.route('/predict', methods=["POST"])
def predict():
    <Use clf variable to call the prediction method>
    <Return the prediction using JSON format>

<Inference service initialization on port 3000 by default>

通过调用 /predict URL,可根据 safety_rules.csv 文件中的规则从模型获取预测结果。可通过在文件中添加新值并重新生成带有新模型的容器来对图像进行更多分类。

部署推理服务到ARM设备的步骤如下:
1. 创建推理API的部署:

$ cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: inference
  name: inference
spec:
  replicas: 1
  selector:
    matchLabels:
      app: inference
  strategy: {}
  template:
    metadata:

后续内容将在博客的下半部分继续介绍,包括部署边缘应用程序以可视化警告和部署智能交通系统的全局可视化器等内容。

基于Python和K3s集群的智能交通计算机视觉系统

4.2 部署推理服务以检测物体(续)
      creationTimestamp: null
      labels:
        app: inference
    spec:
      containers:
        - name: inference
          image: your-inference-image:tag
          ports:
            - containerPort: 3000
          resources:
            limits:
              cpu: "0.2"
              memory: "128Mi"
EOF

上述代码完成了推理API部署的创建,指定了容器的镜像、端口和资源限制。

5. 部署边缘应用程序以可视化警告

在远边缘层,部署的边缘应用程序可基于计算机视觉检测结果为驾驶员可视化警告信息。该应用程序利用之前部署的各个组件,将检测到的物体信息以直观的方式展示给驾驶员。
- LCD屏幕显示 :通过连接到Raspberry Pi的小型LCD触摸屏,实时显示检测到的物体。这些物体根据Inference API分类的警告级别,以不同的方式呈现,如不同颜色或图标,让驾驶员能快速识别潜在危险。
- 浏览器前端应用 :在浏览器上运行的前端应用程序,不仅显示本地检测到的物体,还展示半径500米内所有车辆检测到的物体。这为驾驶员提供了更全面的交通信息,帮助他们提前做好应对准备。

以下是该边缘应用程序的工作流程mermaid流程图:

graph LR
    A[摄像头捕获图像] --> B[OpenCV处理图像]
    B --> C[TensorFlow Lite检测物体]
    C --> D[Inference API分类物体]
    D --> E[LCD屏幕显示物体及警告]
    D --> F[浏览器前端应用显示物体信息]
    E --> G[驾驶员接收警告]
    F --> G
6. 部署智能交通系统的全局可视化器

全局可视化器是智能交通系统的重要组成部分,它能让市政部门实时监控全市的交通状况。
- Traffic Map Public应用 :这是运行在云层的前端应用程序,通过连接到Traffic Manager API,获取边缘检测到的所有物体信息,并在地图上进行可视化展示。市政部门可以通过该应用查看各个区域的交通流量、物体分布等情况,以便及时采取措施优化交通。
- 数据更新机制 :GPS Queue API会定期将代表警告的检测物体信息发送到云端的Redis实例中,Traffic Map Public应用会实时从Redis中获取最新数据,保证地图上显示的信息是最新的。

以下是全局可视化器的部署步骤:
1. 创建Deployment

$ cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: traffic-map-public
  name: traffic-map-public
spec:
  replicas: 1
  selector:
    matchLabels:
      app: traffic-map-public
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: traffic-map-public
    spec:
      containers:
        - name: traffic-map-public
          image: your-traffic-map-image:tag
          ports:
            - containerPort: 80
          resources:
            limits:
              cpu: "0.2"
              memory: "128Mi"
EOF
  1. 创建Service
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  labels:
    app: traffic-map-public
  name: traffic-map-public
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: traffic-map-public
  type: ClusterIP
EOF

通过以上步骤,完成了智能交通系统全局可视化器的部署,市政部门可以通过访问该Service对应的URL,在浏览器中查看全市的交通状况。

总结

本文详细介绍了基于Python和K3s集群构建智能交通计算机视觉系统的全过程。从系统的技术要求、边缘设备的准备,到各个组件的部署和应用,包括使用Redis存储临时物体GPS位置、部署计算机视觉服务检测汽车障碍物、部署边缘应用程序可视化警告以及部署全局可视化器等。通过这些步骤和技术,能够实现一个高效、智能的交通监测和预警系统,为提高城市交通安全性和流量管理提供有力支持。

以下是整个智能交通系统的架构和工作流程总结表格:
| 系统层次 | 主要组件 | 功能描述 |
| — | — | — |
| 云层 | Traffic Manager API、Traffic Map Public | 存储边缘检测物体信息,提供全局交通可视化 |
| 近边缘层 | 4G/5G LTE移动网络 | 传输边缘数据到云端 |
| 远边缘层 | Raspberry Pi、K3s、OpenCV、TensorFlow Lite、Inference API、GPS Queue API | 处理摄像头数据,进行物体检测和分类,管理GPS坐标并发送数据到云端 |
| 微边缘层 | LCD屏幕、VK - 162 G - Mouse GPS模块 | 显示检测物体和警告信息,获取GPS坐标 |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值