brack

  • 2025-04-01
  • 发表了日志: [嵌入式Rust修炼营] 初级 任务2:读写Cargo.toml 文件

  • 发表了主题帖: [嵌入式Rust修炼营] 初级 任务2:读写Cargo.toml 文件

    跟着hunter老师学习了几天Rust,今天小试一下,来完成任务2 ,用fs的API trait来读写一下 Cargo.toml文件 我先写的code是这样的:       在terminal 中 cargo run 一下,如下   看一下,仅仅println!()  就少了好几个“!”,小菜鸟起步的必经之路,呜呜。。。 Rust编译非常好用和友善,错误都有提示,根据错误提示一步一步改bug, 得到了下面的code   这一步有遇到了一个问题,就是所有权问题,使用clone 就可以了,看看提示   修改这个问题后,接下来应该ok了吧,no no no...   追查了一下发现,错误发生在尝试将 Rust 数据结构序列化回 TOML 格式时,原因是 TOML 格式要求所有的值(values)必须在表(tables)之前出现。继续修改,最终code如下: use anyhow::{Context, Result}; use serde::{Deserialize, Serialize}; use std::fs; use std::path::Path; /* // define a struct to represent Cargo.tom file #[derive(Debug, Serialize, Deserialize)] struct CargoTom { package: Package, dependencies: Option<toml::value::Table>, #[serde(rename = "dev-dependencies")] dev_dependencies: Option<toml::value::Table>, #[serde(rename = "build-dependencies")] build_dependencies: Option<toml::value::Table>, } */ // define a struct to represent Cargo.toml file #[derive(Debug, Serialize, Deserialize)] struct CargoTom { package: Package, dependencies: Option<toml::value::Table>, #[serde(flatten)] other: toml::value::Table, } #[derive(Debug, Serialize, Deserialize)] struct Package { name: String, version: String, authors: Option<Vec<String>>, edition: Option<String>, } fn main() -> Result<()> { let cargo_toml_path = Path::new("./Cargo.toml") ; // read the Cargo.toml file let content = fs::read_to_string(cargo_toml_path).context("Failed to read Cargo.toml")?; // parse the Cargo.toml file let mut cargo_toml: CargoTom = toml::from_str(&content).context("Failed to parse Cargo.toml")?; // print the parsed Cargo.toml file println!(" == original Cargo.toml file =="); println!("{:#?}", cargo_toml); // modify the parsed Cargo.toml file cargo_toml.package.version = "0.2.0".to_string(); // add a new dependency to the parsed Cargo.toml file if let Some(deps) = cargo_toml.other.get_mut("dependencies") { if let Some(table) = deps.as_table_mut() { table.insert("new_dep".to_string(), toml::value::Value::String("1.0.36".to_string())); } } else { let mut deps = toml::value::Table::new(); deps.insert("new_dep".to_string(), toml::value::Value::String("1.0.36".to_string())); cargo_toml.other.insert("dependencies".to_string(), toml::value::Value::Table(deps)); } // serialize the modified Cargo.toml file to string let mut update_content = String::new(); // firstly, serialize the package section let package_toml = toml::to_string(&cargo_toml.package).context("Failed to serialize package section")?; update_content.push_str(&package_toml); // then, serialize the dependencies section if let Some(deps) = cargo_toml.other.get("dependencies") { let deps_toml = toml::to_string(deps).context("Failed to serialize dependencies section")?; update_content.push_str("\n"); update_content.push_str(&deps_toml); } // finally, serialize the rest sections /*for (key, value) in cargo_toml.other.iter() { if key != "dependencies" { let section_toml = toml::to_string(value).context(format!("Failed to serialize section {}", key))?; update_content.push_str("\n"); update_content.push_str(&section_toml); } }*/ // 然后序列化其他部分 for (key, value) in cargo_toml.other { update_content.push_str(&format!("\n[{}]\n", key)); let section_toml = toml::to_string(&value) .context(format!("Failed to serialize {}", key))?; update_content.push_str(&section_toml); } // print the modified Cargo.toml file println!(" == modified Cargo.toml file =="); println!("{:#?}", update_content); // write the modified Cargo.toml file back to disk //fs::write(cargo_toml_path, update_content).context("Failed to write Cargo.toml")?; Ok(()) } /* Cargo.toml file content: [package] name = "task3" version = "0.1.0" edition = "2021" [dependencies] toml = "0.7" serde = { version = "1.0", features = ["derive"] } anyhow = "1.0" */ 来看看我的最终结果吧          看看,虽然不算完美,但也算是一个历程,后续继续加油!!

  • 2025-03-29
  • 发表了主题帖: [嵌入式Rust修炼营] 初级 任务1:冒泡排序法实现排序

    初步入门Rust,跟着大咖学习Rust 算法逻辑(使用双循环): 1.外层循环控制排序轮数 2.内层循环比较相邻数据大小 3.使用一个标志位,表示当前轮排序是否有变动,若没有变动,数据已经有序,可以提前结束 简单粗暴,直接上code: fn optimized_bubble_sort<T: PartialOrd>(arr: &mut [T]) { let len = arr.len(); // 外层循环控制排序轮数 for i in 0..len { // 设置标志位,表示本轮是否发生交换 let mut swapped = false; // 内层循环比较相邻元素 for j in 0..len - i - 1 { // 如果前一个元素比后一个大,则交换它们 if arr[j] > arr[j + 1] { arr.swap(j, j + 1); swapped = true; } } // 如果本轮没有发生交换,说明数组已经有序,可以提前结束 if !swapped { break; } } } fn main() { // 测试整数 let mut numbers = [64, 34, 25, 12, 22, 11, 90]; println!("排序前数组: {:?}", numbers); optimized_bubble_sort(&mut numbers); println!("排序后数组: {:?}", numbers); // 测试已经有序的数组 let mut already_sorted = [1, 2, 3, 4, 5]; println!("排序前数组: {:?}", already_sorted); optimized_bubble_sort(&mut already_sorted); println!("排序后数组: {:?}", already_sorted); } 测试结果如下:     实验心得: 基本语法的学习,初步使用泛型写函数,极大提升了编写效率  

  • 发表了日志: [嵌入式Rust修炼营] 初级 任务1:冒泡排序法实现排序

  • 2025-03-13
  • 回复了主题帖: 嵌入式Rust修炼营入围名单来啦,一起度过嵌入式Rust学习时光的小伙伴集合啦~

    个人信息无误

  • 2025-03-03
  • 回复了主题帖: 嵌入式Rust修炼营:动手写串口烧录工具和MCU例程,Rust达人Hunter直播带你入门Rust

    -参与理由&个人编程基础: 本人在做嵌入式开发,可以用c,c++,python做项目。业余了解过Rust也初略学习过,当时没有着手做项目,想找机会试试 -查看修炼任务和活动时间表,预估可以跟着完成几级任务(初级、中级、高级): 如果时间比较宽松的话,想一步一步来从初级到中级,再到高级, -如探索过Rust,请说明Rust学习过程遇到难点,希望在参与活动中收获什么? 学习Rust的最难的是对概念的理解和运用,需要循序渐进,就如张汉东老师所说,Rust学习要逐步层次递进式学习 如果有机会,愿意跟随大咖一步步来

  • 2025-01-06
  • 回复了主题帖: 【嵌入式AI挑战营 】scrfd模型剪枝尝试,以及添加到摄像头例程

    大咖有新发现啊,学习了

  • 2024-12-23
  • 发表了日志: 嵌入式AI人脸识别之---- insightface 之移植到 Luckfox Pico Max上

  • 2024-12-10
  • 发表了主题帖: 嵌入式AI人脸识别之----Luckfox Pico Max 的开箱小试

       感谢EEWORD提供的活动(https://bbs.eeworld.com.cn/thread-1297648-1-1.html),居然有机会拿到Luckfox Pico Max的开发板,第一次玩这个板子,先来试试手。    申请参与活动之后,就从 https://gitee.com/LuckfoxTECH/luckfox-pico.git 上下载了 Luckfox的SDK,至于与原厂的SDK有啥区别,请参见https://bbs.eeworld.com.cn/thread-1300247-1-1.html大咖的分析。     作为新手,当然是从搭建Luckfox的开发环境开始 1.Ubuntu 22.04 开发环境搭建   我使用的是win11  WSL Linux开发,遇到的第一问题是ubuntu 24.04的源的问题,因为大家总所周知的问题,需要更换国内的镜像源,  安装ubuntu 24.04的版本是:          于是找了如下源,通过 sudo vim /etc/apt/sources.list 更换为aliyun 源,如下   然后 运行sudo apt update之后,根据 上手教程 | LUCKFOX WIKI上的提示安装开发依赖库包: sudo apt-get install -y git ssh make gcc gcc-multilib g++-multilib module-assistant expect g++ gawk texinfo libssl-dev bison flex fakeroot cmake unzip gperf autoconf device-tree-compiler libncurses5-dev pkg-config bc python-is-python3 passwd openssl openssh-server openssh-client vim file cpio rsync 2. git 拉取最新源码  git clone https://gitee.com/LuckfoxTECH/luckfox-pico.git 3. 配置编译源码,根据host配置不同,编译时间可能会有不同,最后,顺利编译成功。       4.烧录SPI NAND Flash 1.打开下载的 Rockchip Soc ToolKit, 按着板子的boot button,使用type-C cable 连接开发板,选择对应的设备,添加刚刚编译的镜像,点击Download,我第一次烧录完成如下图:   4.验证摄像头 感谢Ai群友Mr.j 提供的vlc 网络播放器,得以验证摄像头的完好     刚拿到板子,初步尝试还算完美,验证摄像头正常使用,记录一下, 后续加用Insightface在Luckfox上实现人脸检测   再次感谢各位群友的帮助!!        

  • 2024-12-06
  • 回复了主题帖: Luckfox Pico Max 从开箱速通到自带的人脸识别例程

    过来跟大咖学习一下

  • 2024-11-22
  • 回复了主题帖: 入围名单公布:嵌入式工程师AI挑战营(进阶)的挑战者们,领取板卡啦

    个人信息已确认,领取板卡,可继续完成任务

  • 2024-11-18
  • 回复了主题帖: 嵌入式工程师AI挑战营(进阶):在RV1106部署InsightFace算法的多人实时人脸识别实战

    本帖最后由 brack 于 2024-11-18 08:12 编辑 申请理由: 之前想玩嵌入式边缘AI没有机会,感谢主办方提供的机会。 insightFace: InsightFace是由旷视科技(Megvii)开发的一款高效的人脸识别、人脸检测和人脸对齐算法库。它基于深度学习框架(如MXNet、OneFlow等),采用卷积神经网络(CNN)作为基础网络结构,通过多层卷积层、池化层和全连接层,提取输入图片中的人脸特征。InsightFace针对训练和部署进行了优化,支持多种硬件平台,包括CPU和GPU,能够实现快速、准确的人脸识别。同时,它提供了丰富的API,支持人脸检测、人脸识别、人脸对齐等多种功能,在多个领域得到了广泛应用,如金融支付、安防监控和手机解锁等。 1.环境准备: 确保RV1106开发板上的操作系统支持C/C++和相关依赖库的安装 评估RV1106的性能,选择合适的依赖库 2.Insightface 安装:   根据RV1106的硬件特性,选择合适的insightface版本进行安装,确保在CPU上高效运行   安装后,对insightface进行配置,主要针对人脸检测、识别和对齐功能的参数。 3.摄像头驱动与图象采集: 在RV1106上部署摄像头模块,实现图象采集。 配置摄像头参数,以满足多人实时人脸识别的需求。 4.算法优化与调试: 针对硬件特性,适当对insightface算法进行优化,以提高算法的运行效率 5.多人实时人脸识别: 利用insifhtface提供的API,实现多人实时人脸的识别。适当处理以区分不同的人脸 6.部署与测试 将优化后的算法部署到RV1106开发板上,进行测试确保其稳定性和可靠性。根据实际状况,进行验证和调试,满足实际需求。   感谢主办方提供的活动

最近访客

< 1/1 >

统计信息

已有12人来访过

  • 芯积分:43
  • 好友:--
  • 主题:3
  • 回复:6

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言