因为最近HCM项目需要用到边缘计算,所以查看了挺多关于边缘计算相关的知识,在这里和大家分享一下
- 什么是边缘计算?
简单来说,边缘计算是一种把计算任务从“云端”移到“边缘”的技术。我们可以把它比喻成一种分布式计算模型。
云计算:所有计算任务都在“远程服务器”上进行,就像你把所有的工作交给了图书馆的工作人员,他们会帮你查资料、回答问题,但你需要一定时间才能拿到结果。
边缘计算:一些计算任务在“本地”完成,比如我们HCM项目的SOC终端–RK3588可以处理大部分数据,只在必要时把结果发到云端。这样响应速度快,数据传输量小。就像你可以自己查阅家里的资料,只有遇到查不到的内容才去求助图书馆。
边缘计算常用于需要低延迟 、实时响应 和数据隐私保护 的场景,比如智能制造、自动驾驶、智能城市等,当然也适用于我们的动物神经行为学分析
而边缘计算的主要算法包括以下几种:
- 数据处理与预处理算法
边缘设备需要从传感器或摄像头等采集数据,然后对数据进行过滤、压缩和处理,避免不必要的冗余数据传到云端。
- 数据过滤算法:筛选重要数据,比如只上传运动状态的图像,而不是每一帧图像。
我们可以用一个简单的阈值来筛选数据。以下代码示例展示如何在图像中检测亮度高于某个值的像素,并只保留这些信息。
import numpy as np
//创建一个模拟的图像数据 (5x5的灰度图像)
image_data = np.array([[34, 67, 89, 45, 100],
[123, 200, 150, 56, 75],
[90, 160, 255, 0, 30],
[85, 66, 44, 122, 143],
[10, 20, 70, 80, 90]])
//设置亮度过滤的阈值
threshold = 100
//数据过滤:只保留亮度高于阈值的像素点
filtered_data = np.where(image_data > threshold, image_data, 0)
print(“原始图像数据:\n”, image_data)
print(“过滤后的数据:\n”, filtered_data)
- 数据压缩算法:
如JPEG压缩图像,或使用更高效的压缩算法减少带宽。
def simple_compress(image):
# 将相邻 2x2 像素合并为一个像素点,取平均值
h, w = image.shape
compressed_image = image.reshape(h//2, 2, w//2, 2).mean(axis=(1, 3))
return compressed_image
compressed_image = simple_compress(image_data)
print(“压缩后的图像:\n”, compressed_image)
3.计算平均值、最大值、最小值等,再发送到云端。
以下示例展示了如何将传感器数据聚合为平均值、最大值和最小值。
sensor_data = [22, 24, 19, 21, 23, 24, 25, 22, 21, 20]
//计算平均值、最大值和最小值
avg_value = sum(sensor_data) / len(sensor_data)
max_value = max(sensor_data)
min_value = min(sensor_data)
print(f"传感器数据:{sensor_data}“)
print(f"平均值:{avg_value}, 最大值:{max_value}, 最小值:{min_value}”)
在深度学习模型中,剪枝和量化是用于减少模型复杂度的两种常见策略。以下是一个简单的神经网络模型剪枝的代码示例
import torch
import torch.nn as nn
//定义一个简单的神经网络模型
class SimpleNet(nn.Module):
def init(self):
super(SimpleNet, self).init()
self.fc1 = nn.Linear(100, 50)
self.fc2 = nn.Linear(50, 10)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
return x
// 剪枝:将小于某个阈值的权重置为零
def prune_weights(model, threshold=0.1):
with torch.no_grad():
for param in model.parameters():
param[torch.abs(param) < threshold] = 0
model = SimpleNet()
print(“剪枝前模型参数:”, model.fc1.weight)
prune_weights(model)
print(“剪枝后模型参数:”, model.fc1.weight)
- 任务分配与调度算法
在边缘计算中,一个重要的问题是如何将任务合理分配给边缘设备或云端。
-
动态任务调度:根据当前网络带宽和设备负载,动态分配任务。例如,在录制小鼠的行为视频,如果视频的计算任务量过大,可以将部分任务转移到附近的边缘服务器上处理。
-
卸载策略算法:决定某个任务是本地计算还是上传到云端处理。常用的算法包括贪心算法、强化学习算法等。
假设有三种类型的任务(轻量、中等、重度),我们需要根据边缘设备的当前计算能力来决定卸载策略。
//模拟边缘设备的计算能力
edge_device_capacity = 50 # 50单位计算能力
//定义任务列表 [(任务ID, 计算量)]
tasks = [(“task1”, 10), (“task2”, 20), (“task3”, 35), (“task4”, 15)]
//使用贪心算法进行任务调度
selected_tasks =
current_load = 0
for task in sorted(tasks, key=lambda x: x[1]):
if current_load + task[1] <= edge_device_capacity:
selected_tasks.append(task[0])
current_load += task[1]
print(“选择的任务:”, selected_tasks)
- 分布式协作算法
边缘设备通常不是单独工作的,而是与其他设备协同。要实现高效的分布式协作,需要用到以下算法:
-
联邦学习(Federated Learning):允许多个边缘设备共同训练一个模型,而不需要将数据上传到中心服务器,从而保护数据隐私。
-
共识算法:如在区块链网络中的边缘节点之间达成共识,保证数据的一致性。
在联邦学习中,各个边缘节点可以独立训练模型,并只共享模型参数。以下是一个基于PyTorch的简化联邦学习代码
- 边缘AI推理算法
边缘AI需要快速、实时地处理数据,如图像分类、目标检测和语音识别。常见的算法有:
轻量化神经网络模型:如MobileNet、Tiny-YOLO,这些模型专门为移动设备和嵌入式设备设计。
自动混合精度算法(Mixed Precision Training):通过在训练中使用不同精度的计算(如FP16和FP32混合),加快推理速度。
例子:无人机上使用轻量化的Tiny-YOLO算法,可以在飞行过程中实时检测障碍物,而不依赖云端服务器的支持。
上述算法中,边缘AI推理算法应该是最适合嵌入式结合神经行为学分析的,在SOC终端上面搭载Yolo11的小鼠神经行为分析模型,能够实时的处理数据和目标小鼠的检测,以上便是我个人对边缘计算的一些学习总结,欢迎大家补充和发表建议