月度归档: 2022 年 8 月

  • 在铁威马Nas上运行Rust多语言混合项目

    在铁威马Nas上运行Rust多语言混合项目

    手上有一台铁威马Nas,4盘位双核CPU,X86架构的机器。铁威马的硬件还可以,性价比比较足,但是生态很一般,对于相册的管理方面,官方的不怎么满意,在外网找了几个要么功能太简陋,要么内存占用太高,带不动。

    搞来搞去还是自己弄一个,考虑到性能和开销问题,最后选择的是Rust语言,想着横竖都能编译到机器上运行,实在不行Nas还支持Docker,也能解决一部分问题。由于照片太多,所以使用了Tensorflow框架配合MobileNetV2模型进行照片分类和人脸识别,模型都是S规模的,开销可控。

    在开发机器上开发好以后直接打包成Docker准备试试,由于使用了Vue作为前端,所以打包分两部分,先构建前端,然后构建后端,最后产出最终镜像。Dockerfile文件如下:

    FROM node:16 as front
    WORKDIR /usr/src/pototd
    COPY ./webapp ./webapp
    RUN cd webapp && npm install && npm run build
    
    FROM rust:1.62.1 as builder
    COPY --from=front /usr/src/pototd/webapp/dist /usr/src/pototd/webapp/dist
    
    RUN apt update && apt install -y libssl-dev musl-tools libsqlite3-dev 
  • 在Rust中使用TensorFlow

    TensorFlow是一个开源的机器学习框架,上手简单,且在大量商业场景使用,可靠性高。

    机器学习常用的语言主要是python、c,官方也提供了Java版本sdk,示例也很丰富。对于Rust语言,虽然官方文档没有写,其实官方也提供了rust版本的绑定,项目名称就是rust。

    在Cargo.toml中配置版本,这里的0.18.0对应TensorFlow 2.8.0

    tensorflow = "0.18.0"

    这个依赖中的-sys模块会根据实际情况进行处理,如果本地没有Tensorflow的库文件,就会自动下载。如果没有预编译好的库文件,或者用户指定要从源码编译,那就会在本地编译。

    我这里使用的是frozen graph,在rust代码中新建一个Graph进行加载即可。

    let mut graph = Graph::new();
            let model_file = MODEL_DIR
                .get_file("mobilenet/mobilenet_v2_1.4_224_frozen.pb")
                .unwrap();
            let label_file = MODEL_DIR.get_file("mobilenet/label.txt").unwrap();
            graph
                .import_graph_def(model_file.contents(), &ImportGraphDefOptions::new())
                .unwrap();

    为了最后打包方便,这里使用了include_dir包,会把模型和最终产物打包到一起。

    这里的模型是一个mobilenet的图片分类模型,输入为224像素。图片的处理使用image包。

    let img = image::open(photo.get_store_path())?;
            let resized = image::imageops::thumbnail(&img, 224,