目标检测之Tensorflow环境搭建

标签: 无 分类: 机器学习 创建时间:2024-08-31 04:03:27 更新时间:2024-12-03 13:01:38

1.前言

最近有一个项目就是实现视频识别的,于是就空闲的时候把这个东西弄一下了。我在网上弄了很久,尝试了很久,解决了不知道多少个问题,最后终于算是找到了一个可以实现的例子,大部分也都是官方的指导方案进行操作的,期间还是解决了不少的问题的。还有TensorFlow Object Detection API —— 开箱即用的目标检测API这篇文章也是很有用的,这里还提供了一个视频检测代码,整个过程和代码写的比较详细,但是也是让我费了很久的力气,才把问题搞定了。如果不进行尝试下,都不知道这个到底有多难。我主要是在 window 上测试的,linux上的步骤应该差不多了。

参考文章:
【1】.TensorFlow Object Detection API Installation 这是官方指导文档

2.创建虚拟环境

必要的时候,创建一个虚拟环境

1
2
3
4
5
6
7
8
# 查看
conda info --envs
# 创建虚拟环境
conda create --name tf python=3.9
# 激活
activate tf
# 切换
conda activate tf

3.安装tensorflow

1
2
3
4
5
# 安装
pip install --ignore-installed --upgrade tensorflow==2.5.0

# 测试
python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

4.安装GPU

(1)安装 英伟达的驱动

(2)找到驱动对应的 CUDA Toolkit 安装,使用: nvcc -V 命令查看

(3)找到对应的 cuDNN 安装,官方 可查对应版本。解压刚才下载的cuDNN压缩包,得到三个文件夹,复制上面红框中的三个文件夹,并粘贴到CUDA的安装目录下,即刚才装CUDA的位置,配置cuDNN的环境变量。

(4)配置环境变量
配置如下的环境变量,就是 上面的几个安装路径,这里我暂时没有修改,其实应该改成自己的路径。

1
2
3
4
5
<INSTALL_PATH>\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin
<INSTALL_PATH>\NVIDIA GPU Computing Toolkit\CUDA\v11.2\libnvvp
<INSTALL_PATH>\NVIDIA GPU Computing Toolkit\CUDA\v11.2\include
<INSTALL_PATH>\NVIDIA GPU Computing Toolkit\CUDA\v11.2\extras\CUPTI\lib64
<INSTALL_PATH>\NVIDIA GPU Computing Toolkit\CUDA\v11.2\cuda\bin

(5)安装pytorch-cuda
每一个虚拟环境都需要安装,可以直接使用命令进行安装,这里注意 cudnn 的版本,Pytorch下载官网 里面有针对不同的版本提供的命令,比如我使用 “nvidia-smi” 命令查看到的 cuda 版本是 12.1 版本

1
2
3
4
5
6
# 安装 pytorch
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

# 这个是仅安装 cudatookit
conda install cudatoolkit=12.1 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/
conda install cudnn=8.9.7 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/

(6)查看 gpu 是否可用。

1
2
3
4
5
6
7
# 如果报错可以加下面两行
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"

import torch
print(torch.__version__)
print(torch.cuda.is_available())
参考文章:
【1】.conda创建虚拟环境 和 用conda创建GPU的cuda、cudnn使用环境
【2】.conda安装gpu版pytorch后cuda调用失败 conda卸载pytorch,pip安装gpu版pytorch
【3】.ubuntu将虚拟环境中的cuda版本加入环境变量
【4】.如何查看 ananconda 的环境(虚拟环境)安装包位置
【5】.Windows11安装GPU版本的pytorch环境 1.查看电脑是否有最新显卡驱动并确定已安装。2.安装CUDA(需要找准GPU驱动版本与CUDA版本的对应关系进行选择)。3.安装cuDNN。4.安装anaconda及pycharm及配置。5.安装pytorch(一定要对应CUDA、CUDAA、Python的版本版本)。6.测试培养pytorch是否安装成功。
【6】.CUDA安装教程(超详细Windows版) 输入 nvidia-smi 回车得到以下窗口,这里的12.2就是驱动对应的最高版本,我们所安装的CUDA版本小于等于它即可,COUA下载官网(点击跳转) 选择任意版本号小于等于上述最高版本的即可。输入 nvcc -V (注意-前有空格)回车得到以下窗口,安装成功了!
【7】.【保姆级教程】Windows安装CUDA及cuDNN 查看是否存在CUDA的环境变量,如果没有,则添加,添加的内容就是刚才安装CUDA的位置;如果已经存在环境变量,则不用添加。 在cuDNN Archive界面下,查找适合CUDA11.6的cuDNN版本,如下,我选择的是cuDNN v.8.5.0版本,然后单击左键下载对应的压缩包即可。
【8】.如何在conda虚拟环境中配置cuda+cudnn+pytorch深度学习环境 1.查看CUDA版本:nvidia-smi命令查看cuda版本号.2.安装CUDATookit。3.安装Pytorch。
【9】.在conda虚拟环境中安装cuda和cudnn,解决pip install or python setup.py install 将安装包安装到全局环境中的问题(1.2部分)。 conda install cudatoolkit=10.1,conda install cudnn=7.6.5
【10】.GPU Support (Optional) 1.Install CUDA Toolkit;2.Install CUDNN;3.Environment Setup;4.Update your GPU drivers (Optional);

5.下载源码

从代码仓库,下载 代码库,解压 models-master 到 models,放到 Tensorflow 目录下。

1
2
3
4
5
6
7
TensorFlow/
└─ models/
├─ community/
├─ official/
├─ orbit/
├─ research/
└── ...

6.安装protobuf

下载和安装protoc,下载相应版本的软件,这里我折腾了很久,下载了 protoc-3.19.6-win64.zip 。解压后配置环境变量Path,增加 C:\Soft\protoc-28.0-win64\bin 目录。在工程object_detection文件夹中,找到文件夹protos,把这些proto文件转换为py文件。在 TensorFlow\models\research 目录开启 cmd,执行:

1
2
3
4
5
6
7
# 进入目录
cd TensorFlow/models/research/
# 执行
protoc object_detection/protos/*.proto --python_out=.

# 在window下的 TensorFlow/models/research/ 目录下执行
Get-ChildItem object_detection/protos/*.proto | foreach {protoc "object_detection/protos/$($_.Name)" --python_out=.}

注意,为了避免错误,最好安装的 protoc 的版本就是 3.19.6 版本

7.安装 COCO API

请注意,根据包的说明,必须安装 Visual C++ 2015 构建工具并位于您的路径上。如果没有,请确保从此处安装它们,可以从 这里 下载安装。我用官方的提示,还是失败了,没有安装成功,只能通过参考文章中的连接,获取了离线安装包,然后才安装成功的。

1
2
3
4
5
6
pip install cython
# 如果网络好的话,就执行这个
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

# 入股网络不好的话,就执行
pip install pycocotools

8.安装目标检测API

到目录 models\research,复制 object_detection/packages/tf2/setup.py 至目前目录 models/research,然后执行依赖安装

1
2
3
# From within TensorFlow/models/research/
cp object_detection/packages/tf2/setup.py .
python -m pip install .
1
2
3
4
5
6
# 这里可能会有问题,需要解决相关的问题,才能解决。
python -m pip install .

# 如果有问题,先执行下面的代码,然后再执行上面的代码
pip install "cython<3.0.0" wheel
pip install "pyyaml==5.4.1" --no-build-isolation

9.测试

执行测试步骤,如果输出 ok,说明就可以了。

1
2
# From within TensorFlow/models/research/
python object_detection/builders/model_builder_tf2_test.py
参考文章:
【1】.基于tensorflow2的目标检测完整实现过程 这里有部分自定义数据集的说明,还有自行标注的说明。1.数据准备:目标检测公开数据集、自行标注。2.环境准备及目标检测API安装;3.模型训练及调用:数据格式转换、模型训练、模型调用。标注文件格式转换:txt_to_xml、xml_to_txt
【2】.Window环境运行Tensorflow目标识别示例程序 Tensorflow提供了目标识别的API来支持通过各种深度学习网络实现目标识别的功能。通过访问Github项目https://github.com/tensorflow/models 可以看到Tensorflow目前支持的各种神经网络的模型实现,包括Resnet,Fast R-CNN,SSD等。其中包含的一些子目录内容如下。
【3】.目标检测第1步-运行tensorflow官方示例 这里的路径可能不正确需要修改。
【4】.object_detection_tutorial.ipynb 这里遇到了一个问题,那就是 %%bash 这个不存在

问题

1.error: subprocess-exited-with-error,Collecting pyyaml<6.0,>=5.1

在安装软件的时候,出现了这个问题

【尝试方案】
(1)尝试方案

1
pip install pyyaml --pre

(2)还有一个方案,这个我倒是没有尝试

1
pip install cython 和 pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

【解决方案】

1
2
3
4
5
pip install "cython<3.0.0" wheel
pip install "pyyaml==5.4.1" --no-build-isolation

# 重新执行依赖安装
python -m pip install .
参考文章:
【1】.用protoc编译.proto文件遇到的问题 怕自己打目录出错,就在proto文件夹下编译。目录层太低了,直接在research文件夹下运行就行。
【2】。cannot import name ‘runtime_version’ from ‘google.protobuf’
【3】.Error installing Pyyaml==5.4, Cython_sources 不少人说了这个有用:pip install “cython<3.0.0” && pip install –no-build-isolation pyyaml==5.4.1
【4】.Issue importing PyYAML, cltk 升级到 6.0.1
【5】.Installation error.

2.Could not install packages due to an OSError: [WinError 5] 拒绝访问

我在安装的时候,出现了这个问题。

【尝试方案】
(1)增加了 –user 参数
(2)使用管理员运行
(3)设置 C:\Users\hjkj\AppData\Roaming\Python\Python310\site-packages 文件夹权限
(4)修改了文件夹的权限,改为了 Every One,无效
(5)使用 –user 参数,无效
(6)更换pip版本,无效
(7)以管理员身份运行,无效

【解决方案】
重新创建了一个虚拟环境,解决了这个问题。

1
2
3
4
5
6
# 查看
conda info --envs
# 激活
activate tensorflow
# 切换
conda activate tensorflow
参考文章:
【1】.【Python问题解决】—- ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。 使用管理员身份运行 cmd
【2】.解决Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问 1.方法一:使用管理员权限运行;2.更改文件夹权限;3.使用虚拟环境。
【3】.tensoerflow安装拒绝 1.防火墙或者代理设置。2.端口冲突。3.权限限制。4.Tensorflow版本问题。
【4】.解决无法成功安装tensorflow包时 拒绝访问的问题 pip install –user package_name
【5】.ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问 1.以管理员身份运行命令提示符或终端;2.使用—user选项安装包;3.检查文件路径的权限;4.更换pip版本;5.检查环境变量
【6】.【Python问题解决】—- ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。 已管理员身份重新安装pip
【7】.完美解决:ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问 添加 –user选项赋予权限就可以搞定 python -m pip install –upgrade pip -i https://pypi.douban.com/simple –user
【8】.win下用conda切换python环境
【9】.Anaconda查看、创建、切换虚拟环境 你的本地创建了多个虚拟环境之后,加之又在不同的虚拟环境中安装了不同的第三方package,这样一来,虚拟环境的切换就很重要了。否则,当你再次打开jupyter notebook,通过import命令试图导入某个package的时候,总是会得到如期的错误Cannot import module. “No module named …”
【10】.使用pip安装Cartopy库时,出现报错:Getting requirements to build wheel did not run successfully. pip install –user pyshp-2.2.0-py3-none-any.whl

3.cannot import name ‘builder’ from ‘google.protobuf.internal’

【尝试方案】
(1)升级版本

1
2
3
4
5
pip install protobuf==3.20

pip install protobuf==3.9.2

pip install protobuf==3.19.6

【解决方案】
就是升级protobuf的版本

1
pip install --upgrade protobuf

4.No module named ‘tensorflow.python.distribute.distribution_strategy_context’

在执行 python 训练的时候,结果就是报错了

【尝试方案】
(1)尝试安装 tensorflow,结果无效

1
pip3 install tensorflow

【解决方案】
安装指定版本的 tensorflow

1
pip install tensorflow==2.15.0
参考文章:
【1】.解决pip安装tensorflow中出现的no module named tensorflow.python 问题
【2】.fix ModuleNotFoundError: No module named ‘tensorflow.python.distribute.distribution_strategy_context’ tensorflow.python.distribute.distribution_strategy_context seems to be a bug within tensorflow 2.16.1, downgrading to ver. 2.15.0 (pip install tensorflow==2.15.0) solved the issue for me.

5.cannot import name ‘runtime_version’ from ‘google.protobuf’

【尝试方案】
(1)安装了 numpy,结果无效

1
pip install numpy==1.26.4

(2)尝试降级 protobuf,无效

1
pip install protobuf==3.12.3

【解决方案】
保证 protobuf 版本和 pip 版本一直

1
2
3
4
# 卸载
pip uninstall protobuf
# 安装
pip install --upgrade protobuf
参考文章:
【1】.ImportError: cannot import name ‘runtime_version’ from ‘google.protobuf’ Downgrading protobuf less than 5 produces the error and upgrading it above 5 fixes it.
【2】.ImportError: cannot import name ‘runtime_version’ from ‘google.protobuf’ For my object detection project version 3.12.3 is working fine.
【3】.Ubuntu 22安装最新的protoc,并解决python运行报错ImportError: cannot import name ‘runtime_version’ from ‘google.pro 从错误信息来看,ImportError: cannot import name 'runtime_version' from 'google.protobuf' 说明你可能使用了不兼容版本的 protobuf Python 库。为了修复这个问题,请确保你使用的是最新版本的 protobuf 库,并且与所安装的 protoc 版本兼容。你可以按照以下步骤来解决这个问题:首先,卸载现有的 protobuf 库,然后,安装最新版本的 protobuf 库,如果你之前使用旧版本的 protoc 生成了 .py 文件,可能需要清理这些文件并使用最新的 protoc 重新生成。通过上述步骤,你应该能够解决ImportError的问题,并确保你的系统使用最新版本的 protocprotobuf 库。如果问题依然存在,请检查并确认所有步骤都正确执行。

6.No module named ‘official’

【解决方案】
重新安装 tf-models-official

1
pip install tf-models-official
参考文章:
【1】.ModuleNotFoundError: No module named ‘official’ 这里有人提到了 pip install tf-models-official 方法

7.If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0

If you cannot immediately regenerate your protos, some other possible workarounds are: Downgrade the protobuf package to 3.20.x or lower

【解决方案】
在命令行运行的时候,我重新创建了一个 虚拟环境

8.module ‘keras._tf_keras.keras.layers’ has no attribute ‘experimental’

【尝试方案】
(1)降级tensorflow ,但是这就是一个死循环了。

1
pip install tensorflow==2.13.1

(2)后来又想着升级tensorflow,结果还是不行

1
pip install --upgrade tensorflow

(3)尝试限制 tensorflow 的版本,重新执行安装,结果无效

1
'tf-models-official >=2.5.1, <2.16.0',

【解决方案】
我尝试将相关的代码进行修改了,models\research\object_detection\core\freezable_sync_batch_norm.py,里面的 class FreezableSyncBatchNorm(tf.keras.layers.experimental.SyncBatchNormalization):进行修改,改为了 class FreezableSyncBatchNorm(tf.keras.layers.BatchNormalization):

参考文章:
【1】.module ‘keras.layers’ has no attribute ‘experimental’ pip install tensorflow==2.13.1
【2】.AttributeError: module ‘keras.layers’ has no attribute ‘experimental’: M1 Mac Tensorflow Metal ‘tf-models-official >=2.5.1, <2.16.0’,
【3】.Unable to run Object Detection API i.e. AttributeError: module ‘keras._tf_keras.keras.layers’ has no attribute ‘experimental’ The temporary workaround for the issue is Could you please try to limit the versions of tf-models-official >=2.5.1, <2.16.0 and comment out keras in the research/object_detection/packages/tf2/setup.py. By default tensorflow v2.16.1 import keras3.0.
【4】.AttributeError: module ‘keras.layers’ has no attribute ‘experimental’ keras.layers.experimental.preprocessing instead of layers.experimental.preprocessing.

9.No module named ‘tensorflow.python.keras.layers.preprocessing’

【尝试方案】
(1)我尝试把 python 去掉,结果不行,找不到 tensorflow.keras.layers.preprocessing
(2)尝试修改代码

1
2
3
4
5
6
7
8
# 源代码
# from tensorflow.python.keras.layers.preprocessing import image_preprocessing as image_ops

# 尝试改为,结果无效
from keras.preprocessing import image_preprocessing as image_ops

# 尝试更改为
from tensorflow.keras.layers.preprocessing import image_preprocessing as image_ops

(3)尝试升级 tf-models-official 版本

1
pip install --upgrade tf-models-official

【解决方案】
这个问题最后我也没有解决,也就只能这么算了,重新从头开始测试整个的流程好了。

参考文章:
【1】.ModuleNotFoundError: No module named ‘keras.layers.preprocessing’
【2】.解决 ‘No module named ‘tensorflow.keras’’ 报错:理解 TensorFlow 与 Keras 的关系
【3】.No module named ‘tensorflow.python.keras.layers.preprocessing’ Kindly check the version of Tensorflow what your using make sure it should be compatible with the version of the object detection API. And check all required modules installed in your environment. If there are missing Modules like ‘official.legacy’ or ‘tensorflow.python.keras.layers.preprocessing’, please install by using pip.
【4】.TensorFlow 2 Object Detection API tutorial
【5】.ModuleNotFoundError: No module named ‘tensorflow.python.keras.preprocessing‘ 因为是跟着教学视频敲的,没有意识到版本可能不一样,还查了很多办法。谁知道把.python去掉就可以了。
【6】.ImportError: cannot import name ‘image_preprocessing’ from tensorflow.python.keras.layers.preprocessing import image_preprocessing as image_ops
【7】.‘tensorflow.python.keras.layers.preprocessing’ 在较新的版本中2.4.0及更高版本中,tensorflow.python.keras 已经简化为了 tensorflow.keras
【8】.ModuleNotFoundError:没有名为“tensorflow.python.ops.numpy_ops”的模块

1.Initializing libiomp5md.dll, but found libiomp5md.dll already initialized

安装完成python-cuda之后,结果出现这个问题。

【尝试方案】
(1)找到 libiomp5md.dll,删除其中一个。我这里有两个,我把第一个删除了,这个好像不管用

  • C:\Soft\anaconda3\Library\bin
  • C:\Soft\anaconda3\pkgs\intel-openmp-2021.4.0-haa95532_3556\Library\bin

(2)删除 pip 安装的 torch
因为我用 conda 和 pip 同时安装了 torch,我尝试卸载一个,这个导致了另外的问题,就是 gpu 无法使用,最后我只能切换虚拟环境,重新安装了环境,才解决了这个问题。

1
pip uninstall torch torchvision

【解决方案】
(1)代码前加入两行如下代码即可,这种方式可以解决,但是好像不好用。

1
2
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
参考文章:
【1】.解决 OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
【2】.Ran into this issue while executing os.environ[“KMP_DUPLICATE_LIB_OK”]=”TRUE”
【3】.yolov5中OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. 1.提前删除libiomp5md.dll。2.设置环境变量以允许程序继续进行`。
【4】.sklearn OMP: Error #15 (“Initializing libiomp5md.dll, but found mk2iomp5md.dll already initialized.”) when fitting models I tried manually deleting the old libiomp5md.dll file. This file is in your anaconda3/lib directory. You should remove the old libiomp5.dll file. Then it should work.
【5】.【深度学习】OMP Error #15 Initializing libiomp5md.dll, but found libiomp5md.dll already initialized 报错提示完美解决方案 Everything 搜索 libiomp5md.dll,发现有Anaconda目录下存在两个libiomp5md.dll。第一个路径是conda虚拟环境下的,第二个路径是torch下的,建议先备份路径,然后把第一个路径中的 libiomp5md.dll 剪切到其他地方问题完美解决
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。