CUDA+OPENCV+PYTHON tensorflow 源码环境搭建

2023-11-19

CUDA+OPENCV+PYTHON tensorflow 源码环境搭建

接上文caffe环境安装:
https://blog.csdn.net/u012350025/article/details/104589982
主机环境ubuntu18.04 x86/x64系统 (实体机)

一.bazel的安装

安装指南官网地址见https://docs.bazel.build/versions/master/install-ubuntu.html
二进制安装bazel
需要jdk1.8支持
请先安装java jdk1.8此处不做详细说明自行官网参考

继续
步奏1

sudo apt install g++ unzip zip

接下来可以按照官方给出安装java jdk。此处我是从java官网安装,也可参见此网方法安装

sudo apt-get install openjdk-11-jdk

bazel二进制下载地址
https://github.com/bazelbuild/bazel/releases
此时得到如此文件
bazel-0.26.1-installer-linux-x86_64.sh
安装方式为

./bazel-0.26.1-installer-linux-x86_64.sh \
     --prefix=/home/guan/tools/bazel/install_output \
     --bin=/home/guan/tools/bazel/install_output/bin \

此处将文件安装在当前bazel目录下面install_output文件夹里面
安装完成后如下bazel安装完成
envs文件里面添加bazel环境变量

export PATH=$PATH:/home/guan/tools/bazel/install_output/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/guan/tools/bazel/install_output/lib

执行

source envs

执行bazel
bazel使用图片
看到这个截图及安装完成

二.创建python3.6 tensorflow环境

请注释caffe环境变量

export PYTHONPATH=/home/guan/tools/caffe/build/install/python

我的环境变量设置参考
新建一个终端执行

source envs_python_36

envs_python_36 为修改后上述截图文件

执行

conda create -n tensorflow python=3.6 

等待创建完成

激活tensorflow环境

conda activate tensorflow

激活tensorfow

三.安装python-opencv4

进入已编译好的opencv4源码build/python_loader目录
build/python_loader目录执行

python setup.py build
python setup.py install

等待编译安装成功

1.OpenCV loader: missing configuration file: [‘config-3.6.py’, ‘config-3.py’]. Check OpenCV installation 错误

错误截图如下
opencv错误截图
报错config-3.6.py config-3.py缺失
尝试创建软链接将config-3.6.py ---->config.py

2.ERROR: recursion is detected during loading of “cv2” binary extensions. Check OpenCV installation

查看了半天资料分析得出:
上面的步奏1 2 均是错误
错误1
config-3.6.py config-3.py缺失
我打开了config.py文件对比了别人正常安装的config-3.6.py config-3.py文件
config py文件对比上图左边为config.py文件,右边为config-3.6.py文件
发现是BINARIES_PATHS PYTHON_EXTENSIONS_PATHS变量的区别。
从命名看3.6应该是python的扩展属性,但这里却缺少文件。

错误2
提示:cv2加载二进制扩展时检测到错误,先就这么理解吧。我英语水平不是咋样好 哈哈。
此时联系错误1顿时想起了是缺少扩展问题。

3.错误的解决

之后顿时想到了我已编译的opencv的python是caffe环境编译的为python2.7,而此时我的python环境为python3.6
此时我有以下几点注意情况
************************************************************
1.opencv python编译环境必须2.7对应caffe编译一套,3.6对应tensorflow编译一套针对环境使用。
2.重新编译opencv之后caffe或着tensorflow也必须重新编译。
3.caffe和tensorfow环境必须分两个envs环境变量使用
************************************************************
解决
步奏1
进入opencv源码目录创建build_py36文件夹

mkdir build_py36

修改安装目录
打开CMakeLists.txt
修改安装目录
修改如下文字(上图为已修改)

set(CMAKE_INSTALL_PREFIX "/home/guan/tools/opencv/build_py36/install_opencv4" CACHE PATH "Installation Directory" FORCE)

进入build_py36
接下来

cmake ..

python 错误

看上图python 为python2.7依然是有问题的
最终我分析cmake语言
见文件…/cmake/OpenCVDetectPython.cmake

cmake 寻找python版本其中代码:

if(PYTHON_DEFAULT_EXECUTABLE)
    set(PYTHON_DEFAULT_AVAILABLE "TRUE")
elseif(PYTHON2_EXECUTABLE AND PYTHON2INTERP_FOUND)
    # Use Python 2 as default Python interpreter
    set(PYTHON_DEFAULT_AVAILABLE "TRUE")
    set(PYTHON_DEFAULT_EXECUTABLE "${PYTHON2_EXECUTABLE}")
elseif(PYTHON3_EXECUTABLE AND PYTHON3INTERP_FOUND)
    # Use Python 3 as fallback Python interpreter (if there is no Python 2)
    set(PYTHON_DEFAULT_AVAILABLE "TRUE")
    set(PYTHON_DEFAULT_EXECUTABLE "${PYTHON3_EXECUTABLE}")
endif()

可以明显看出是如果查找到了python2则结束,只有在python2找不到的时候才去查找python3
于是我添加了下面代码:

#指定python3  0 python2   1 python3
set(PYTHON3_IS_ON 1)                                                                                                                                  
if(PYTHON3_IS_ON)
    set(PYTHON_DEFAULT_AVAILABLE "TRUE")
    set(PYTHON_DEFAULT_EXECUTABLE "${PYTHON3_EXECUTABLE}")
endif()

再次cmake …
python ok
如上图python 已经显示python3
此时想起之前的caffe环境若是也如此安装要千万注意编译opencv的python环境要和你使用的python环境相同

创建install_opencv4文件夹

mkdir install_opencv4

继续

make -j8
make install

修改envs_python_36文件中的python3的opencv编译环境变量

#opencv4
export OPENCV_HOME=/home/guan/tools/opencv/build_py36/install_opencv4       
export PATH=$PATH:$OPENCV_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$OPENCV_HOME/lib

opencv python3环境变量
envs_python_36为我的tensorflow所需要的环境变量文件
接下来

source ~/tools/envs_python_36

4.正式开始安装opencv4-python

进入opencv源码目录build_py36/python_loader
setup python执行

python setup.py build
python setup.py install

最后验证
我的擦错误!!!依然是
容我缓缓容我缓缓差点要崩溃了!!!!!!!!!!
但 !!! 我在caffe python2.7上面已按照上述方法测试成功了

看了CMakeList.txt 代码这里:
python 编译的状态
突然想起之前caffe的python输出比tensorflow这里多,我猜想应该是python3的编译开关没有打开。

顿时去搜索python2的环境变量:BUILD_opencv_python2
BUILD_opencv_python2
python3的环境变量:BUILD_opencv_python3
在这里插入图片描述对比我发现BUILD_opencv_python3这个宏被设置OFF了,但是发现没有任何一个代码来设置这宏,我纳闷了好久。网上查得,原来这种宏是在cmake 时采用-D 带入的参数
于是我脑子里浮现出代码

cmake .. -DBUILD_opencv_python3=ON 

结果
缺少库
缺少库 Libraries 为NO
我忽略继续编译&安装&安装opencv-python都成功,但最终Import cv2依然是上述错误。

于是我继续调试代码发现…/cmake/OpenCVDetectPython.cmake 这个文件中查找python库的函数find_python函数中:

 if(NOT ${found})

竟然不成立也就是也就是OpenCVDetectPython.cmake 这个文件更本就不起作用
我尼玛 。。。。。( 抱歉我得文明)
最后分析出
选中的变量选中的变量为OFF才能使刚刚那个主要查找python的函数起作用
继续分析

grep PYTHON3INTERP_FOUND -r ../

判断出PYTHON3INTERP_FOUND的值默认为ON
由于没有截到图我就不回去截图了哈
但这个变量依然没有代码设置,于是我猜它应该也是通过-D来输入变量值的吧。
于是我脑子有个大胆的想法

cmake .. -DBUILD_opencv_python3=ON -DPYTHON3INTERP_FOUND=OFF

结果
python36 ok界面

Libraries:                   /home/guan/tools/anaconda3/envs/tensorflow/lib/libpython3.6m.so (ver 3.6.10)

而上面变为NO 这符合代码分析
则继续

make -j8
mkdir install_opencv4
make install
cd ./python_loader/
python setup.py build
python setup.py install

都成功了
最终测试

import cv2

终于没有任何报错了 OK
附上截图一张
OK

5.opencv-python安装总结

上述代码中我通过修改了源码完成以下操作
1.修改安装目录
2.修改查找指定的python3
这样再编译caffe opencv时又得改回代码此处不理想

原则上编译最好不要去动源码来保证源码的干净
我网上查得
可以如下:

CMAKE_INSTALL_PREFIX=/usr #安装路径

上面代码没有验证

代码分析得出:

PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3.6 #你的python执行文件路径

PYTHON_DEFAULT_EXECUTABLE
这个代码的意思是上面的find_python函数执行完成后
PYTHON_DEFAULT_EXECUTABLE=你的python可执行文件路径而不再为空所以该if语句只执行了第一行赋值PYTHON_DEFAULT_AVAILABLE为TRUE
(find_python found 变量为ON时则PYTHON_DEFAULT_EXECUTABLE为空)
最终则

PYTHON_DEFAULT_AVAILABLE="TRUE"
PYTHON_DEFAULT_EXECUTABLE=你的python可执行文件路径

最终上述1 2问题都得到解决
所以此处不需要修改代码
最终得出无需修改任何源码执行命令

cmake .. -DBUILD_opencv_python3=ON -DPYTHON3INTERP_FOUND=OFF -DCMAKE_INSTALL_PREFIX=/home/guan/tools/opencv/build_py36/install_opencv4

四.编译tensorflow

进入tensorflow源码

编译

运行

./configure

选择ntensorflow编译
按照上面选择

注意下图这里选择N 不使用clang编译cuda
不使用clang编译cuda继续
在这里插入图片描述
没有报错
好现在我们开始使用bazel编译
编译指南见官网:
https://tensorflow.google.cn/install/source
编译指南
执行

bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

等待30分钟
结果错误1
Unknown option ‘-bin2c-path’
于是我搜索-bin2c-path

grep "\-bin2c\-path" -r ./

bin2cpath于是我查看了此文件
bin2c
猜测这个bin2c-path肯定是设置bin2c的路径的,于是我github下载了一个bin2c工程
并且将这个bin2c可执行文件加入环境变量,并且屏蔽该无法识别的’-bin2c-path’选项

如上截图已屏蔽(编译后报错,建议直接删掉吧 不知道咋屏蔽 哈哈)
接着继续
bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

等待2个小时…

结果错误2
No module named ‘keras_preprocessing’
解决方案:

pip install keras_preprocessing

再次继续
bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

编译OK
附上成功截图
tensorflow 编译成功

此处应有总结
1.编译tensorflow 需要安装opencv-python (建议和C版本相同,及从opencv源码安装)
2.需要bin2c可执行环境支持,请自行下载。并源码按照上述方案修改(去掉bin2c-path)。
3.安装keras_preprocessing
*******************************************************************
在这里插入图片描述编译打包完整版分支的包

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

编译打包master的包

./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg

我不懂打包为master是啥意思,果断选择 release分支
于是执行 release分支代码

安装

安装tensorflow

pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl

注意上面的version-tags请根据自己的版本名字来
安装完成附图一张:
tensorflow install ok

测试

import tensorflow

未来版本numpy
结果警告:in a future version of numpy, it will be understood as (type, (1,)) / ‘(1,)type’
提示numpy为未来版本意思是要版本降级。
仔细查看官网一开始的文字,我找到了解决问题的答案,同时keras_preprocessing的安装也在官网给出,抱歉,我没有仔细看官网说明。
附上官网截图:
pip安装包
其中keras_preprocessing的安装正确方式:

pip install -U --user keras_applications --no-deps
pip install -U --user keras_preprocessing --no-deps

注意当为虚拟机时应取消–user的选项
附上官网原话 : if using a virtual environment, omit the --user argument

keras_preprocessing我已经安装了,算了以后有问题再重新按照官网给出严格安装一遍吧。
–no-deps是在离线安装whl时去掉依赖包的安装时使用的参数

anaconda应该也算虚拟环境吧
于是我:

pip install -U  pip six numpy wheel setuptools mock 'future>=0.17.1' -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

来安装numpy

import tensorflow
结果依然错误:FutureWarning: Passing (type, 1) or ‘1type’ n a future version of numpy, it will be understood as (type, (1,)) / ‘(1,)type’
版本兼容我猜是numpy版本兼容的问题,可是已经按照官网的方案安装了numpy。疑惑半天我。
最终我看了一个python程序高手的博客给出的答案解决了问题。
方法:
修改
/home/guan/tools/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py 这个文件代码:
numpy 代码
上图为修改后的代码,请自行对照你自己的代码

 _np_qint8 = np.dtype([("qint8", np.int8, (1,))])                                                                                                                      
 _np_quint8 = np.dtype([("quint8", np.uint8, (1,))])
 _np_qint16 = np.dtype([("qint16", np.int16, (1,))])
 _np_quint16 = np.dtype([("quint16", np.uint16, (1,))])
 _np_qint32 = np.dtype([("qint32", np.int32, (1,))])

同时我给出那个哥们的截图
修改numpy代码
最终测试

import tensorflow

OK 到此安装成功
吃水不忘挖井人那哥们的解决方法地址:
https://blog.csdn.net/bigdream123/article/details/99467316

附上成功截图
tensflow ok至此完

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA+OPENCV+PYTHON tensorflow 源码环境搭建 的相关文章

随机推荐

  • 恒合仓库 - 商品管理模块、上传照片、添加采购单、添加出库单、商品分类

    商品管理模块 文章目录 商品管理模块 一 分页查询商品 1 1 实体类 1 1 1 Store 仓库 1 1 2 Brand 品牌 1 1 3 ProductType 商品分类 1 1 4 Supply 供应商 1 1 5 Place 产地
  • Linux网络连接出现问题

    报错截图 1 先查看NetworkManager是否启动 查看NetworkManager是否启动 systemctl status NetworkManager 在Linux系统中 可以通过以下命令启动NetworkManager服务 s
  • 小程序项目时间选择器用法

    项目需求是要实现这种形式 但是相信大家都试了各种插件 都不太合适 uView框架也不能满足自己的需要 推荐使用 uview ui plus 基本上小程序遇到的单选多选 日期 省市区 都可以完美的实现 可以通过插件市场安装使用 但是要实现ui
  • matplotlib画动态三维图

    从txt文本中读取数据并画动态三维点图 程序中实现动态三维图绘制 添加图标题 坐标轴标题 坐标轴数值范围 两种绘图模式 一种动态画图 所有点均保留 另一种每次仅显示一个点 三维坐标轴设置区间 需要通过Axes3D创建ax 否则其他方式无法设
  • Openface的安装和使用

    openface的安装与使用 环境 我的电脑是笔记本电脑 win10系统 用的是pycharm和annaconda 一 首先下载openface安装包 并且安装 1 下载地址 https codeload github com cmusat
  • FeignClient 在 oauth2 中与 hystrix 线程策略冲突问题造成的权限问题

    FeignClient 在 oauth2 中与 hystrix 线程策略冲突问题造成的权限问题 FeignClient 在 oauth2 中与 hystrix 线程策略冲突问题造成的权限问题 问题描述 问题原因 问题解决方法 方法1 直接禁
  • 关系型数据库的规范化

    规范化是通过修改表以减少冗余和矛盾的一系列动作 关系型数据库定义了3中范式 第一范式 列仅包含原子值 没有重复的组 第二范式 满足第一范式 非部分函数依赖 如果表中一些组合键的 但不是全部 值确定了一个非键列的值 则表包含部分函数依赖 第二
  • LeetCode Java 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

    给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那两个整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 你不能重复利用这个数组中同样的元素 方法一 遍历 看到这个题便想到数组遍历 就
  • 商城项目 pc----商品详情页

    目录 vue路由滚动行为 排他思想 放大镜 加入购物车操作 项目实战 Promise 特点 用法 then 执行顺序 拓展 async await Promise优缺点 Promise方法 浏览器缓存 为什么需要本地存储呢 window s
  • 思科路由器IPv6各种路由协议配置

    一 基础配置 R1 Router gt ena Router conf t Router config host R1 R1 config int g0 0 R1 config if ipv add 2001 3 1 64 R1 confi
  • Java多线程(四):什么是死锁以及如何解决死锁

    目录 1 什么是死锁 2 死锁产生的原因 3 如何解决死锁问题 3 1 改变环路等待条件 3 2 破坏请求并持有条件 1 什么是死锁 死锁 是指两个或两个以上的进程在执行过程中 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象 若无外力作
  • 【微信小程序】定时器超时处理设置方法【setInterval()和setTimeout()】

    2020年2月13日 0次阅读 共550个字 0条评论 0人点赞 QueenDekimZ Set Timeout Solution setTimeout和setInterval 函数都属于定时任务 一 settimeout延迟一段时间执行函
  • css中float用法

    float浮动 指将指定元素悬浮于所在整体之上 即将垂直排列的元素转换为水平同行显示 平时写出的HTML是具有先后顺序的 对于这个顺序我们称之为标准流 而浮动则是脱离标准流的另一个独立标准 下面给出float定义 float left 左浮
  • 阿里云大佬告诉你为什么学不会设计模式,归根到底还是方法不对

    最近总有读者在后台跟我说 工作几年 自己的代码质量似乎没有什么提升 我觉得他的情况非常典型 很多人应该或多或少都有过类似的经历 毕业几年 几乎一直在做复制黏贴的工作 偶尔会遇到原有业务扩展的需求 想简单应付一下完事的话 也不难 无非就是多加
  • 查询水果价格 (15分)

    给定四种水果 分别是苹果 apple 梨 pear 桔子 orange 葡萄 grape 单价分别对应为3 00元 公斤 2 50元 公斤 4 10元 公斤 10 20元 公斤 首先在屏幕上显示以下菜单 1 apple 2 pear 3 o
  • Hadoop学习——MapReduce的简单介绍及执行步骤

    MapReduce概述 MapReduce是一个分布式的计算框架 编程模型 最初由由谷歌的工程师开发 基于GFS的分布式计算框架 后来Cutting根据 Google Mapreduce 设计了基于HDFS的Mapreduce分布式计算框架
  • IDEA修改内存未生效原因和解决

    修改IDEA安装目录下的idea64 exe vmoptions server Xms1024m Xmx2048m XX ReservedCodeCacheSize 2048m 发现IDEA的内存修改并未生效 右下角显示依然是974M 原因
  • windows下进程间通信的(13种方法)

    Windows进程间的通信 迎风的祺 博客园 windows下进程间通信的 13种方法 phymat nico的专栏 CSDN博客 windows进程间通信
  • eclipse报错 parameterized types are only available if source level is 1.5 or greater

    preface 好久没有更新 blog 了 最近在 写新的项目 今天在用eclipse 出现了之前遇到的问题 这里记录下 问题 eclipse 控制台 报错 parameterized types are only available if
  • CUDA+OPENCV+PYTHON tensorflow 源码环境搭建

    CUDA OPENCV PYTHON tensorflow 源码环境搭建 接上文caffe环境安装 https blog csdn net u012350025 article details 104589982 主机环境ubuntu18