前段时间在 qqwweee/keras-yolo3 的基础上改写出了一个支持TensorFlow 2.2版本的yolo3项目,我把它命名为tf2-keras-yolo3。
怎么说呢,用是肯定能用的,但操作步骤太过繁琐和反人性化,自己用起来嫌麻烦,别人用起来上手也有一定难度,于是,我萌生了重构并打包它的想法。
于是,就有了xyolo~
xyolo
可以通过pip一键安装,而且使用起来非常简单,只需要几行代码就可以训练自己的yolo3模型,或者调用训练好的模型进行目标检测。废话少说,一起来看一下吧!
GitHub地址:https://github.com/AaronJny/xyolo
转载请注明来源:https://blog.csdn.net/aaronjny/article/details/109540857
写在前面:
我使用的Python是Anaconda的Python 3.7发行版本,在shell里面进行了初始化(python和pip默认指向当前激活环境,而不是默认的python2),所以文章中的python和pip请根据自己的情况判断是否需要替换为python3和pip3。
一、安装
1、通用安装方法
xyolo
的安装非常简单,通过pip一键安装即可。请注意,xyolo
需要安装的TensorFlow版本>=2.2(未安装TensorFlow的话则会自动安装)
pip install --user xyolo
建议使用--user
参数,避免遇到权限问题。
当然,如果有条件的话,使用conda创建一个新环境,并在新环境中进行安装会更好,可以避免意料之外的依赖冲突问题。
2、GPU版本安装方法
如果你想使用TensorFlow的GPU版本,可以选择在安装xyolo之前,先安装2.2及以上的tensorflow-gpu。以conda举例,安装GPU支持的操作流程如下:
1.创建一个虚拟环境,名为xyolo。
conda create -n xyolo python=3.7
2.切换到刚创建好的环境里
conda activate xyolo
切换完成后,可以通过pip查看一下环境里安装的包:
pip list
结果不出预料,很干净,毕竟是一个新环境嘛:
Package Version
---------- -------------------
certifi 2020.6.20
pip 20.2.4
setuptools 50.3.0.post20201006
wheel 0.35.1
3.在新环境中安装tensorflow-gpu
注意,安装前需要先安装好和tensorflow版本对应的显卡驱动,这部分还有点麻烦,就不在这篇文章中说明了,我觉得会选择使用GPU跑xyolo的同学应该都已经掌握了这部分技能了吧?
毕竟如果完全没有接触过tensorflow-gpu的话,接触xyolo应该也会选择cpu版本更好上手。
我们通过conda来安装tensorflow-gpu,gpu版本的tensorflow存在cuda和cudnn依赖,使用conda可以自动解决这两者的版本依赖和配置问题。
conda install tensorflow-gpu=2.2
安静地等待一段时间,即可完成tensorflow-gpu的安装。
4.使用pip安装xyolo
pip install --user xyolo
通过再次执行pip list
,我们能够看到成功安装的xyolo及相关依赖。
Package Version
---------------------- -------------------
absl-py 0.11.0
aiohttp 3.6.3
astunparse 1.6.3
async-timeout 3.0.1
attrs 20.2.0
blinker 1.4
brotlipy 0.7.0
cachetools 4.1.1
certifi 2020.6.20
cffi 1.14.3
chardet 3.0.4
click 7.1.2
cryptography 3.1.1
cycler 0.10.0
gast 0.3.3
google-auth 1.23.0
google-auth-oauthlib 0.4.2
google-pasta 0.2.0
grpcio 1.31.0
h5py 2.10.0
idna 2.10
importlib-metadata 2.0.0
Keras-Preprocessing 1.1.0
kiwisolver 1.3.1
loguru 0.5.3
lxml 4.6.1
Markdown 3.3.2
matplotlib 3.3.2
mkl-fft 1.2.0
mkl-random 1.1.1
mkl-service 2.3.0
multidict 4.7.6
numpy 1.18.5
oauthlib 3.1.0
opencv-python 4.4.0.46
opt-einsum 3.1.0
Pillow 8.0.1
pip 20.2.4
protobuf 3.13.0
pyasn1 0.4.8
pyasn1-modules 0.2.8
pycparser 2.20
PyJWT 1.7.1
pyOpenSSL 19.1.0
pyparsing 2.4.7
PySocks 1.7.1
python-dateutil 2.8.1
requests 2.24.0
requests-oauthlib 1.3.0
rsa 4.6
scipy 1.4.1
setuptools 50.3.0.post20201006
six 1.15.0
tensorboard 2.2.2
tensorboard-plugin-wit 1.6.0
tensorflow 2.2.0
tensorflow-estimator 2.2.0
termcolor 1.1.0
tqdm 4.51.0
urllib3 1.25.11
Werkzeug 1.0.1
wheel 0.35.1
wrapt 1.12.1
xyolo 0.1.3
yarl 1.6.2
zipp 3.4.0
二、使用方法
咳咳,一切准备就绪,嗨起来!
1、使用官方预训练权重,进行目标检测测试
yolov3官方有提供预训练权重,如果我们要在和VOC数据集同分布或相似分布的图片上做目标检测的话,直接使用官方预训练权重也是可以的。
xyolo调用官方预训练模型的逻辑是:
- 1.从官网下载预训练权重(Darknet输出格式)
- 2.将Darknet的权重文件转成keras的权重文件(现在TensorFlow和Keras已经基本不分家啦)
- 3.构建模型,加载预训练权重
- 4.对选择的图片进行目标检测
好麻烦啊,是不是要写很多代码?当然不是~歪嘴.jpg
首先,准备一张用于检测的图片,假设它的路径是./xyolo_data/detect.jpg
,图片内容如下:
一个简单的示例如下:
# 导入包
from xyolo import YOLO, DefaultYolo3Config
from xyolo import init_yolo_v3
# 创建默认配置类对象
config = DefaultYolo3Config()
# 初始化xyolo(下载预训练权重、转换权重等操作都是在这里完成的)
# 下载和转换只在第一次调用的时候进行,之后再调用会使用缓存的文件
init_yolo_v3(config)
# 创建一个yolo对象,这个对象提供使用yolov3进行检测和训练的接口
yolo = YOLO(config)
# 检测并在图片上标注出物体
img = yolo.detect_and_draw_image('./xyolo_data/detect.jpg')
# 展示标注后图片
img.show()
输出如下:
2020-11-03 23:33:49.645 | DEBUG | xyolo.yolo3.yolo:detect_image:273 - Found 3 boxes for img
2020-11-03 23:33:49.648 | DEBUG | xyolo.yolo3.yolo:detect_image:289 - Class dog 0.99,Position (402, 176), (586, 310)
2020-11-03 23:33:49.650 | DEBUG | xyolo.yolo3.yolo:detect_image:289 - Class bicycle 0.96,Position (0, 80), (383, 412)
2020-11-03 23:33:49.652 | DEBUG | xyolo.yolo3.yolo:detect_image:289 - Class person 1.00,Position (9, 1), (200, 410)
2020-11-03 23:33:49.652 | DEBUG | xyolo.yolo3.yolo:detect_image:292 - Cost time 6.65432205500838s
同时,打开了一张图片(图片尺寸不一致是我截图和排版的问题):
这样,一次目标检测就完成了,舒服呀~
当然了,我相信肯定有不少同学已经在这段代码的执行过程中遇到困难或疑惑了,我来集中解答几个可能会遇到的。
1.预训练权重下载慢或无法下载
因为yolov3的官网在国外,所以国内下载慢也很正常。推荐使用代理,或从备份地址下载后指定预训练权重的地址。具体方法参考
2、预训练权重无法下载或下载速度慢的解决方案
。
2.提示权限问题
因为xyolo会自动下载预训练权重到安装目录下,在某些情况下可能会遇到权限问题。解决方法就是在安装部分说的,通过指定
--user
参数指明将包安装在用户目录下,一般就没问题了。
3.检测的速度慢
细心的同学可能发现了,上面对图片做的一次检测,竟然花了6秒!这也太慢了吧?
事实上,并不是这样的。TensorFlow 2.x版本,默认使用动态图,性能会稍弱于1.x的静态图。所以,我这里使用了tf.function对速度进行了优化,在第一次运算时,模型会自动生成静态图,这部分会比较消耗时间,但后续单次计算的时间都会极大地缩短。
假如我们接着进行几次识别,就能够发现单次识别的时间有了明显降低,一般只需要零点几秒或几十毫秒。
2、预训练权重无法下载或下载速度慢的解决方案
主要有两种方法能够解决,分别看一下。
1.设置代理
如果我们手上有能够加快访问速度的网络代理(你应该知道我在说啥~),可以通过设置代理的形式加快下载速度,示例如下:
from xyolo import YOLO, DefaultYolo3Config
from xyolo import init_yolo_v3
# 创建一个DefaultYolo3Config的子类,在子类里覆盖默认的配置
class MyConfig(DefaultYolo3Config):
def __init__(self):
super(MyConfig, self).__init__()
# 这是替换成你的代理地址
self.requests_proxies = {
'https': 'http://localhost:7890'}
# 使用修改后的配置创建yolo对象
config = MyConfig()
init_yolo_v3(config)
yolo = YOLO(config)</