基于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
- 安装运行OpenCV和相机所需的缺失依赖项:
$ /bin/bash install_deps.sh
- 配置设备以运行对象检测程序:
$ /bin/bash setup.sh
- 运行脚本安装桌面快捷方式:
$ /bin/bash install_shortcuts.sh
- 点击新的检测器桌面快捷方式测试安装。
-
点击交通桌面快捷方式测试本地交通地图应用程序,这将在
http://localhost:5000打开Chromium。 -
重新配置无线网络,使用智能手机的接入点连接,并通过删除
/etc/wpa_supplicant/wpa_supplicant.conf配置文件中的network {}条目来重置该文件,以使用智能手机的互联网连接。 - 配置触摸屏(以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
- 重启设备:
$ sudo restart
-
点击检测快捷方式启动对象检测服务。可以通过取消注释
ch14/code/python/object_detection/run.sh文件中的--enableEdgeTPU标志来加速视频帧分析。 - 点击交通快捷方式启动交通地图应用程序,如果检测到对象,它们将在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
数组,添加新的对象类型和对应的值。
|
通过以上步骤和分析,你可以成功搭建一个基于计算机视觉的智能交通系统,并根据实际需求进行拓展和优化。希望本文对你有所帮助!
超级会员免费看
667

被折叠的 条评论
为什么被折叠?



