raspberry pi 3b+ 编译opencv

raspberry pi 3B+ 在安装openvino 时需要编译opencv

其间首先需要先安装如何依赖库

sudo apt install build-essential libclang-11-dev clang-11 clang-format-9 libssl-dev

sudo apt install git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libatlas-base-dev python3-scipy

然后使用如下 configure 参数

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..

然后就是 make

这里有个坑,因为raspberry pi 3b+ 只有1G内存,而编译opencv 在某个库需要超过1G内存,差不多达到2G的内存需求,而raspberry OS 默认只有100 M 的虚拟内存,所以会因为内存不足导致卡死,这里需要修改虚拟内存大小,最好加到4G 来保存编译通过

sudo dphys-swapfile swapoff
sudo vim /etc/dphys-swapfile
CONF_SWAPSIZE=4096

下面哪个MAX也需要改到4096

sudo dphys-swapfile setup

sudo reboot

Raspberry pi 上安装Intel NCS2 的坑

查了google ,问了chatGPT 以为万无一失了。根据chatGPT的提示打开了Intel 关于在Raspberry pi 上安装 OpenVINO的官网,然后再接照官网的说明一步一步执行完成各安装脚本命令,但在python 中运行

使用openvino查看可使用设备

只有CPU ,真是日了狗了。

然后翻查了各个外国文档,然后找到,尼玛,官网的openVINO没有Raspberry pi 的插件所以不使用官网的这个版本的openVINO只有CPU,fuck。然后必须要使用从github上下载的源码编译才能生成出有Raspberry Pi 插件的版本。

cmos像元计算方法

1英寸等于16mm ,但不能适用所有的尺寸,小于1/2英寸的CIS,则要用1英寸等于18mm来换算。比如索尼1/2.8 的IMX415 对角线长度为6.43mm,英1英寸等于18mm则刚好。所以对于海康等监控摄像头,使用1英寸等于18mm来计算对角线尺寸,然后再通过4:3 的比例计算物理的长宽尺寸。

18*1/2.8=6.429mm

4x*4x+3x*3x=6.429*6.429

按4:3,则长为5.143mm,则像元为5.143/1920=2.68um

c++通过代码动态加载库文件并调用库里的类和方法

首先需要先在库文件的工程定义extern “c”

/**
 * 因在开发阶段发现tensorflow 与 海康的sdk 存在冲突,在还没有找到更好的解决方法时,使用动态加载so库的方法解决,
 * 以下是为了使动态加载能找到函数标识符而加入的接口函数,通过函数调用FrameProcessHelper类
*/
extern “C”{
    FrameProcessHelper * create(std::string names_file,std::string cfg_file,std::string weights_file);
//    void detect_and_track(cv::Mat org_frame,FrameProcessHelper & helper);
    std::vector<bbox_t> get_detect_track_result(cv::Mat & org_frame,FrameProcessHelper & helper);
    void draw_frame(cv::Mat & org_frame,bbox_t & dets, ais_data & ais,std::string & ocr_result,double & speed,FrameProcessHelper & helper);
}
CMakeList 定义输出的类型
add_library(new_detect SHARED
xxxx.cpp
xxxx.h
c++动态调用库文件代码截图说明

pip 离线安装本地包

因为服务器所在网络环境原因,不得不需要离线安装python 依赖包

使用如下方法,只下载需要的依赖包:

python -m pip download -r requirements.txt -d 目录

这方法会自动下载依赖包的依赖包,然后整个打包到目标服务器,然后在解压包所在目录运行

python -m pip install –no-index –find-links=目录名 -r requirements.txt

完成

Docker:将docker容器保存为docker镜像(打成tar包)

将docker容器保存为 tar 包
1、docker commit <容器id> <镜像名>:<tag> —- 将容器保存成镜像

保存后 docker images 便可以看到镜像

2、docker save -o <tar包名>.tar <镜像名>:<tag> —- 将镜像保存为.tar文件,默认保存在当前目录

· 从 tar 包导入docker镜像
1、docker load -i <tar包名>.tar —- 从 tar 包导入镜像

导入镜像后,通过 docker images 便可看到导入的镜像。

2、docker run -itd -p <本地端口>:<容器端口> <镜像名>:<tag> —- 通过镜像起容器

· 案例
1、docker commit 294oajfhfnci abcdef:latest —- 将294oajfhfnci容器保存为镜像abcdef

2、docker save -o abcdef.tar abcdef:latest —- 将镜像abcdef保存为abcdef.tar

3、docker load -i abcdef.tar —- 从 abcdef.tar 导入镜像

4、docker run -itd -p 8888:80 –restart=always abcdef:latest —- 通过abcdef镜像启动容器
————————————————
版权声明:本文为CSDN博主「普通网友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_54866636/article/details/126327700

实现tensorflow 2.11离线编译的一种方法

因为服务器所在网络环境的原因,不得不在无法连接外网的环境下编译tensorflow 。过程有点痛苦,走了不少弯路,最后还是实现了。具体方法是,先在一台能连接互联网的机器上使用正常的方法用官方提供的bazel 编译一遍。然后,编译过程中他会自动下载所有需要的包到~/.cache/baxel/_bazel_(用户名)这个目录。(足足差不多10G!),然后把这个目录整个打包复制到不能连接外网的目标机器。放在相同目录下,注意目录需要改为当前用户名。然后把 tensorflow-2.11(源码所在目录)/tensorflow/ 里的 workspace 0 – 3. bzl 文件里的包改为本地目录位置,方法可以是,改为file://xxxxx/ 这样的方式,也可以是搭建一个web 服务,然后改为 http://xxxx/xxx.tar.gz  这样的方式。这个自行发挥了。最后他还有个提示,说有个什么目录文件存在,所以编译不了,直接把哪个目录删了就行。还有一个问题是他会提示验证golang sdk 版本,这个问题很奇怪,我试了两台机,一台不用管,直接跳过了。另一台是强行修改了一个sdk.bzl  文件,把他要打开的一个go 版本校验js  手工下载并改到这个sdk.bzl 文件里才能通过。这个看他提示照着办了。

bazel 编译参数说明

bazel build –config=opt –local_cpu_resources=70 –local_ram_resources=8192 //tensorflow:libtensorflow_cc.so

其中 –local_cpu_resources=70 是使用CPU的核数,–local_ram_resources=8192 是使用内存数,为了使用多核CPU的多个核同时参与编译,须要加入–local_cpu_resources ,否则默认只使用单核,这样效率非常低。另外需要注意的是–local_ram_resources 这个参数不能太大,这个参数似乎并不是指总的利用内存数,而是单个进程在编译时使用的内存数,如果设得太大,会因为内存耗尽导致系统卡死。