Rust实现网络摄像头上应用AI(人脸识别、80种目标检测)

缘起

  1. 嵌入式开发对开发人员要求比较高,哪怕是老手。其中包括内存管理和多线程等问题
  2. 比较大的规模,单一的大工程对团队协作不方便
  3. 固件定制多,单一大工程在版本上比较难维护
  4. 很多领域,对于AI的落地有需求

想法

    用rust 做一个通用摄像头的应用层,解决或改善上述问题。

遇到的问题

  • rust编译出的二进制文件比较大
  • sdk基本是c/c++编写,需要考虑rust与c/c++交互

实际上,rust经过优化(lto等优化)后编译出来的文件比gcc工具链编译的要小些,试过的人可以看到这个惊喜.

实现

  • AI:人脸检测、识别;物体检测
  • 编码和osd配置保存读取
  • osd(主码流显示,子码流因为显示AI的画框,代码已经注释掉)
  • rtsp(基于rockchip库)
  • 消息服务
  • rv1106g 平台实现

    可能的微末价值:

  • rust 在嵌入式方面的应用参考
  • rust 与c交互
  • 最小化二进制大小
  • ip camera 大致架子及媒体层抽象
  • ai 在rockchip rknn上的应用展示

效果

详见:https://item.taobao.com/item.htm?id=793373350571&spm=a213gs.v2success.result.1.12624831WGQtnY

文档

 详见文章开始部分 或者 使用文档

源码获取

大家有兴趣可以去看看(😀️): https://item.taobao.com/item.htm?id=793373350571&spm=a213gs.v2success.result.1.12624831WGQtnY

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Rust是一快速、安全、并发的系统编程语言,非常适合实现高性能的机器学习算法。在这里,我们将介绍如何使用Rust实现一个简单的卷积神经网络。 首先我们需要安装Rust编程语言。安装方法请参考官方文档:https://www.rust-lang.org/tools/install 接下来,我们需要安装依赖库,包括rand和ndarray。这两个库分别用于生成随机数和数组操作。我们可以在Rust项目的Cargo.toml文件中添加这两个库的依赖: ```toml [dependencies] rand = "0.8.3" ndarray = "0.15.1" ``` 接着,我们可以创建一个名为convnet的Rust工程,并分别创建src/main.rs和src/network.rs两个源文件。 在network.rs中,我们可以定义一个神经网络结构体,包含卷积层和全连接层: ```rust use ndarray::{Array, Array2}; struct ConvLayer { filters: Array2<f32>, bias: f32, stride: usize, padding: usize, } impl ConvLayer { fn new(filters: Array2<f32>, bias: f32, stride: usize, padding: usize) -> Self { ConvLayer { filters: filters, bias: bias, stride: stride, padding: padding, } } fn forward(&self, x: &Array2<f32>) -> Array2<f32> { let (height, width) = x.dim(); let (filter_height, filter_width) = self.filters.dim(); let padded_height = height + 2 * self.padding; let padded_width = width + 2 * self.padding; let mut output = Array::zeros(((padded_height - filter_height) / self.stride + 1, (padded_width - filter_width) / self.stride + 1)); for i in (0..padded_height - filter_height + 1).step_by(self.stride) { for j in (0..padded_width - filter_width + 1).step_by(self.stride) { let mut sum = 0.0; for k in 0..filter_height { for l in 0..filter_width { sum += self.filters[[k, l]] * x[[i + k, j + l]]; } } output[[i / self.stride, j / self.stride]] = sum + self.bias; } } output } } struct DenseLayer { weights: Array2<f32>, bias: Array2<f32>, } impl DenseLayer { fn new(weights: Array2<f32>, bias: Array2<f32>) -> Self { DenseLayer { weights: weights, bias: bias, } } fn forward(&self, x: &Array2<f32>) -> Array2<f32> { self.weights.dot(x) + &self.bias } } struct NeuralNetwork { conv_layer: ConvLayer, dense_layer: DenseLayer, } impl NeuralNetwork { fn new(conv_layer: ConvLayer, dense_layer: DenseLayer) -> Self { NeuralNetwork { conv_layer: conv_layer, dense_layer: dense_layer, } } fn forward(&self, x: &Array2<f32>) -> Array2<f32> { let conv_output = self.conv_layer.forward(x); self.dense_layer.forward(&conv_output) } } ``` 在main.rs中,我们可以随机生成一些数据并利用定义的神经网络进行训练和预测: ```rust use rand::Rng; use ndarray::{Array, Array2}; use convnet::{ConvLayer, DenseLayer, NeuralNetwork}; fn main() { let mut rng = rand::thread_rng(); let input = Array::from_shape_fn((28, 28), |_| rng.gen_range(0.0, 1.0)); let filters = Array::from_shape_fn((3, 3), |_| rng.gen_range(-1.0, 1.0)); let bias = rng.gen_range(-1.0, 1.0); let conv_layer = ConvLayer::new(filters, bias, 1, 1); let weights = Array::from_shape_fn((10, 26 * 26), |_| rng.gen_range(-1.0, 1.0)); let bias = Array::from_shape_fn((10, 1), |_| rng.gen_range(-1.0, 1.0)); let dense_layer = DenseLayer::new(weights, bias); let network = NeuralNetwork::new(conv_layer, dense_layer); let output = network.forward(&input); println!("{:?}", output); } ``` 这样,我们就成功地用Rust实现了一个简单的卷积神经网络
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值