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

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

1. 代理测试

可以通过运行以下命令来测试代理:

$ curl http://localhost:5000/<REMOTE_PATH>

其中,远程路径可以是 /traffic ,这是一个URL,交通管理服务会返回驾驶员全局检测到的所有对象。

2. 部署基于计算机视觉的边缘应用以可视化警告

视觉应用由两部分组成:一个是显示使用智能交通系统的所有驾驶员数据的Web应用程序,另一个是实时显示检测到的对象的桌面应用程序。下面开始安装Web应用程序,以可视化不同驾驶员检测到的对象。

2.1 安装交通地图应用程序

已经设置了必要的API来可视化设备检测到的内容,接下来继续部署Web应用程序,在地图上可视化这些对象,这就是交通地图应用程序的用武之地。在部署之前,先查看代码:

<imported libraries>
<app_initialization>
<CORS configuration>
@app.route("/")
def map():
    return render_template(<Render map.html
        Using environment variables
        GPS_QUEUE,TRAFFIC_MANAGER,
        LATITUDE and LONGITUDE>) 
<Starting the web application on port 3000>

这个应用程序与之前的Web应用地图类似,但它调用GPS队列服务来获取边缘设备上运行的当前GPS坐标,并从交通管理服务的公共端点获取数据,需要使用自定义代理服务来访问,以防止CORS访问限制。每次页面加载时,它还可以选择在开始时将地图居中。

2.2 交通地图Web部分代码

Web部分使用 map.html 文件,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<Load Javascript libraries>
<Load page styles>
<body>
    <div id='map'></div>
<script>
    <Load Map in an initial GPS position>
    var marker
    var markers = []
    var osm = L.tileLayer(
        'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
        {  
            <Set Open Street Map Initial
            Configuration using Leaflet>
        });    
    osm.addTo(map);        
    setInterval(() => {
        $.getJSON("http://{{ GPS_QUEUE }}:3001/gps", 
        function(gps) {    
            <Delete current markers>
            <Get current position of your device 
            and show it in the map>
            $.getJSON(
                "http://{{ TRAFFIC_MANAGER }}:5000"+
                "/traffic/unit/km/r/0.5/lat/<LATITUDE>"
                "/lng/<LONGITUDE>", function(pos) {
                <This gets all the detected objects 
                in a radius of 0.5 km>
                <For each object returned show it in 
                the map using 
                markPosition(object,lat,lng,o_type,warning)
                function>
            });
        });
    }, 5000);

    <Configure the icons to visualize if an object is a
    person, car or a truck>
    function markPosition(object,lat,lng,o_type,warning)
    {
        <Create a maker with the appropriate Icon showing
        the object name, latitude, longitude, type of object
        and warning level>
    }    
</script>    
</body>
</html>

这段代码将地图以初始的纬度和经度坐标为中心,在蓝色地球仪中显示设备的当前位置,并使用图标显示检测到的对象,显示对象名称、GPS坐标、对象类型和警告级别。

2.3 部署交通地图Web应用程序

执行以下命令部署交通地图Web应用程序:

$ cat <<EOF | kubectl apply -f - 
apiVersion: apps/v1
kind: Deployment
metadata:
    creationTimestamp: null
    labels:
        app: traffic-map
    name: traffic-map
spec:
    replicas: 1
    selector:
        matchLabels:
            app: traffic-map
    strategy: {}
    template:
        metadata:
            creationTimestamp: null
            labels:
                app: traffic-map
        spec:
            containers:
            - image: sergioarmgpl/traffic_map
                name: traffic-map
                imagePullPolicy: Always
                env:
                - name: LATITUDE
                    value: "<YOUR_LATITUDE_COORDINATE>"
                - name: LONGITUDE
                    value: "<YOUR_LONGITUDE_COORDINATE>"
                - name: GPS_QUEUE
                    value: "localhost" #<GPS_QUEUE_IP>
                - name: TRAFFIC_MANAGER
                    value: "<TRAFFIC_MANAGER_IP>"
                resources: {}
status: {}
EOF

此部署包含以下环境变量:
| 环境变量 | 说明 |
| ---- | ---- |
| LATITUDE | 用于将地图居中的初始GPS纬度坐标 |
| LONGITUDE | 用于将地图居中的初始GPS经度坐标 |
| GPS_QUEUE | gps - queue服务的IP地址端点,本地运行时默认设置为localhost |
| TRAFFIC_MANAGER | 交通管理应用程序的IP地址端点,使用代理服务可通过localhost调用,防止CORS限制 |

3. 使用OpenCV、TensorFlow Lite和scikit - learn进行计算机视觉对象检测

执行计算机视觉的服务包含在 detect.py 文件中,它将在边缘设备上运行。在准备设备运行此程序之前,查看文件中的代码:

<Imported libraries to run OpenCV in TensorFlow Lite>

#Array to map detected objects
obj_values = {"car":1,"cat":2,"person":3
,"dog":4,"semaphore":5,"truck":6,"other":1000}

def run():
    <Initialize Video Capture for the camera>
    <Set screen size to capture>
    <Initialize the object detection model>
    #Array to store detected objects
    items = []
    while Camera is Opened:
        detection_result = detector.detect(input_tensor)
        items.clear()
        <store detected objects in the items arrays>
        <Show the FPS evaluated>
        <Count objects detected per type of object>
        <Get the classification of each object calling
        /predict endpoint from the gps-api>
        if the warning count of the group <= 2:
            <A real warning is detected
            we push this information calling
            /traffic/event and warning is incremented>
        if warning:
            <show unique objects found
            warning is set to zero>
        else:
            <show No warnings>

        if <ESC key is pressed>:
            <break the cycle>
        <Set cv2 window size to show the capture>
    <Close the Camera Capture>
    <Destroy all windows>

def main():
    <Parse parameters to run the program>
    <Call run() function to start analyzing video capture>

if __name__ == '__main__':
    <call the main() function of the program>

此代码启动视频捕获,将图像以TensorFlow Lite可以分析的格式发送。TensorFlow Lite检测对象的坐标并对对象进行分类。程序使用 efficientdet_lite0_edgetpu_metadata.tflite 模型,重点关注汽车、人、狗、信号灯和卡车等对象,这些对象对驾驶员来说是潜在的障碍物和警告。如果检测到的对象不在列表中,则分类为其他并忽略警告。若要添加更多对象,只需修改 obj_values 数组。

4. 安装对象检测服务

在边缘设备上安装对象检测服务的步骤如下:
1. 将边缘设备连接到可访问的网络。
2. 登录边缘设备:

$ ssh your_user@<EDGE_DEVICE_IP>

可以通过以下命令获取设备的IP地址:

$ ifconfig wlan0

可通过将设备连接到HDMI屏幕,并连接键盘和鼠标来运行此命令。
3. 克隆存储库:

$ git clone https://github.com/PacktPublishing/Edge-Computing-Systems-with-Kubernetes
$ cd Edge-Computing-Systems-with-Kubernetes/ch14/code/python/object_detection
  1. 安装运行OpenCV和相机所需的缺失依赖项:
$ /bin/bash install_deps.sh
  1. 配置设备以运行对象检测程序:
$ /bin/bash setup.sh
  1. 运行脚本安装桌面快捷方式:
$ /bin/bash install_shortcuts.sh
  1. 点击新的检测器桌面快捷方式测试安装。
  2. 点击交通桌面快捷方式测试本地交通地图应用程序,这将在 http://localhost:5000 打开Chromium。
  3. 重新配置无线网络,使用智能手机的接入点连接,并通过删除 /etc/wpa_supplicant/wpa_supplicant.conf 配置文件中的 network {} 条目来重置该文件,以使用智能手机的互联网连接。
  4. 配置触摸屏(以Miuzei LCD 4.0英寸HDMI显示屏为例):
$ sudo rm –rf LCD-show
$ git clone https://github.com/goodtft/LCD-show.git
$ chmod –R 755 LCD-show
$ cd LCD-show
$ sudo ./MPI4008-show
  1. 重启设备:
$ sudo restart
  1. 点击检测快捷方式启动对象检测服务。可以通过取消注释 ch14/code/python/object_detection/run.sh 文件中的 --enableEdgeTPU 标志来加速视频帧分析。
  2. 点击交通快捷方式启动交通地图应用程序,如果检测到对象,它们将在30秒后出现在Web应用程序中。
5. 部署智能交通系统的全局可视化工具

交通地图公共服务是交通地图的静态版本,仅显示半径5公里内检测到的对象。该服务部署在云端,可视化效果与交通地图服务类似,但不显示实时GPS位置。要部署此服务,执行以下步骤:

5.1 创建交通地图公共部署
$ 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:
            - image: sergioarmgpl/traffic_map_public
                name: traffic-map-public
                imagePullPolicy: Always
                env:
                - name: LATITUDE
                    value: "<YOUR_LATITUDE_COORDINATE>"
                - name: LONGITUDE
                    value: "<YOUR_LONGITUDE_COORDINATE>"    
                - name: TRAFFIC_MANAGER
                    value: "<TRAFFIC_MANAGER_IP>"
                resources: {}
status: {}
EOF

此部署的环境变量与之前的交通地图部署类似。

5.2 创建负载均衡器服务
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
    creationTimestamp: null
    labels:
        app: traffic-map-public
    name: traffic-map-public-lb
spec:
    ports:
    - port: 3000
        protocol: TCP
        targetPort: 3000
    selector:
        app: traffic-map-public
    type: LoadBalancer
status:
    loadBalancer: {}
EOF

可以使用 $ kubectl logs pod/<POD> -f <CONTAINER_NAME> 命令来排查部署问题。

5.3 获取负载均衡器IP
$ TRAFFIC_MAP_PUBLIC="$(kubectl get svc traffic-map-public -o=jsonpath='{.status.loadBalancer.ingress[0].ip}')"

可以通过以下命令查看环境变量的值:

$ echo $TRAFFIC_MAP_PUBLIC

等待负载均衡器的IP地址分配完成,可以通过以下命令检查服务状态:

$ kubectl get svc traffic-map-public-lb
5.4 访问交通地图公共应用程序
http://<TRAFFIC_MAP_PUBLIC>:3000

现在系统已运行,可以驾驶带有边缘设备的汽车来捕获对象,系统将在几秒内显示这些对象。

总结

通过上述步骤,我们学会了如何使用AI分析摄像头捕获的视频,检测可能对驾驶员构成障碍的对象。利用Kubernetes和K3s的强大功能,在树莓派边缘设备上实现了这一系统。这种方法创建了一个解耦的系统,使用容器更容易进行升级。还了解了这种系统如何在现实场景中用于监控交通行为,提高驾驶员的安全性,以及如何在边缘和云端分布处理和显示信息,以改善驾驶体验。

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

6. 关键技术原理与优势分析
6.1 计算机视觉技术原理

在本系统中,计算机视觉主要依靠OpenCV、TensorFlow Lite和scikit - learn实现。OpenCV用于视频捕获和图像处理,它提供了丰富的函数库,能够对摄像头捕获的视频帧进行预处理,如调整图像大小、颜色空间转换等。TensorFlow Lite则是轻量级的深度学习框架,适合在边缘设备上运行。它使用预训练的模型(如 efficientdet_lite0_edgetpu_metadata.tflite )对视频帧中的对象进行检测和分类。scikit - learn可用于辅助分类和数据分析,例如对检测到的对象进行进一步的特征提取和分类。

以下是计算机视觉处理流程的mermaid流程图:

graph TD;
    A[视频捕获] --> B[图像预处理];
    B --> C[对象检测];
    C --> D[对象分类];
    D --> E[警告判断];
    E --> F[信息推送];
6.2 K3s集群的优势

K3s是轻量级的Kubernetes发行版,非常适合在边缘设备上运行。它具有以下优势:
- 资源占用少 :K3s对系统资源的需求较低,能够在资源有限的边缘设备(如树莓派)上稳定运行。
- 易于部署 :相比传统的Kubernetes,K3s的部署过程更加简单快捷,减少了部署时间和复杂度。
- 高可用性 :K3s支持集群部署,能够提供高可用性和容错能力,确保系统的稳定运行。

7. 常见问题及解决方案
7.1 网络连接问题

在部署和运行过程中,可能会遇到网络连接问题,如无法访问服务、CORS限制等。解决方案如下:
- 检查网络配置 :确保边缘设备和云端服务都连接到可访问的网络,检查IP地址和端口配置是否正确。
- 使用代理服务 :如文中所述,使用自定义代理服务可以解决CORS访问限制问题。

7.2 模型性能问题

如果对象检测的准确率或速度不理想,可以考虑以下解决方案:
- 更换模型 :尝试使用不同的预训练模型,选择更适合当前场景的模型。
- 优化模型参数 :对模型的参数进行调整,如学习率、批量大小等,以提高模型的性能。
- 硬件加速 :如前文提到的,使用Coral USB Accelerator等硬件设备可以加速视频帧分析。

8. 拓展与展望
8.1 功能拓展

可以在现有系统的基础上进行功能拓展,例如:
- 增加对象类型 :通过修改 obj_values 数组,增加更多的对象类型,如自行车、摩托车等。
- 实时数据分析 :结合大数据和机器学习技术,对检测到的对象数据进行实时分析,提供更精准的交通预测和建议。
- 与其他系统集成 :将智能交通系统与城市交通管理系统、导航系统等进行集成,实现更高效的交通管理。

8.2 应用场景拓展

除了智能交通领域,该系统还可以应用于其他场景,如安防监控、工业检测等。在安防监控中,可以使用计算机视觉技术检测异常行为和目标;在工业检测中,可以检测产品缺陷和设备故障。

9. 总结回顾

本文详细介绍了基于Python和K3s集群的计算机视觉智能交通系统的搭建过程,包括代理测试、边缘应用部署、对象检测服务安装以及全局可视化工具部署等步骤。通过使用AI技术和K3s集群,实现了在边缘设备上对交通对象的实时检测和可视化,提高了交通安全性和管理效率。同时,还分析了系统的关键技术原理、优势、常见问题及解决方案,并对系统的拓展和应用场景进行了展望。

10. 常见问题解答
问题 解答
如何加快视频帧分析速度? 可以通过取消注释 ch14/code/python/object_detection/run.sh 文件中的 --enableEdgeTPU 标志,使用Coral USB Accelerator等硬件设备加速。
如何解决CORS访问限制问题? 使用自定义代理服务,通过localhost调用Traffic Manager服务,防止CORS限制。
如何添加更多的对象类型? 修改 detect.py 文件中的 obj_values 数组,添加新的对象类型和对应的值。

通过以上步骤和分析,你可以成功搭建一个基于计算机视觉的智能交通系统,并根据实际需求进行拓展和优化。希望本文对你有所帮助!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值