乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用

乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用

前言:本人穷,乞丐,无GPU,windows10破本一台,在此记录一下学习、部署、使用YOLO笔记

本文将描述描述内容:

  • 如何完成Yolo源码编译
  • 使用Yolo对图片测试识别定位效果
  • Python调用编译产物实现图像、视频目标定位,检测

1、啥是Yolo

文笔不好这里引用一位知乎大佬原话

5分钟GET AI - 用 Python 玩转 YOLO

YOLO 是时下最流行(state of the art)的物体检测(Object Detection) AI 模型之一,流行的原因是因为好用,好用的标准归纳为3条:

  1. 检测范围广:YOLO9000 覆盖了9000种常用分类,YOLOv2 覆盖了PASCAL VOC和COCO数据集分类。(说人话:就是可以检测出9000种常见物体)
  2. 检测准确率高
  3. 检测速度快:平民玩家用普通CPU就能运行低配乞丐版(Tiny YOLO),人民币玩家用GPU运行高配豪华版 (YOLOv2)。作者大神给出的参考值是 Tiny YOLO 可以达到200FPS,YOLOv2 达到40FPS,当然这是用 NVIDIA Titan X 传奇装备跑出来的分数。

*PASCAL VOC 和 COCO 数据集是什么?*数据集由成千上万张图片组成,AI通过学习数据集图片中包含的物体以及该物体的分类,最终能达到正确识别所有图片中的物体所属的分类。PASCAL VOC 和 COCO 是两个有名的图片物体分类数据集,同样有名的还有 ImageNet 数据集。

*200FPS 是什么?*可以理解为一秒钟处理200张图片,普通视频24FPS肉眼就不会感到卡顿

2、准备OpenCV

安装opencv依赖,安装3.+的,别出啥幺蛾子,能支持更多格式的图像,并且得到实时的显示,opencv使用用源码安装,熟悉一下

github https://github.com/opencv/opencv/tree/3.4

访问费劲,还是从镜像取吧

code china https://codechina.csdn.net/opencv/opencv.git

分支切好,别去最新版的opencv了

THinK@LAPTOP-OBP0I7V8 MINGW64 /d/test/yolo_learn/opencv (3.4.15)
$ git branch
* 3.4.15
  master

先给自己电脑装个CMAKE,链接里找到windows平台的msi下载下来双击安装即可,我下的是 cmake-3.20.0-windows-x86_64.msi,版本无所谓了,能用就行

  • 在opencv目录下新建build目录,打开cmake-gui

    • 1位置选在下载的opencv源码目录,我的是 D:\test\yolo_learn\opencv
    • 2位置选在刚刚新建的build目录,我的是 D:\test\yolo_learn\opencv\build
    • 3根据自己的vs版本和电脑选,我的如截图
      乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第1张图片
      乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第2张图片
  • Finish点完后,等下面的结果,得一小会
    乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第3张图片

  • 点击generate,出现如下语句,项目生成成功,在build文件夹下出现 项目文件 OpenCv.Sln

-----------------------------------------------------------------

Configuring done
Generating done

乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第4张图片

  • 右键ALL_BUILD生成
    乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第5张图片

  • 右键INSTALL,仅用于项目->仅生成INSTALL
    乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第6张图片

  • 这一番折腾就是为了给Darknet提供这个,生成的install目录, D:\test\yolo_learn\opencv\build\install
    乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第7张图片

3、Yolo源码获取

  • Yolo是一种物体检测模型,按照模型可以自由使用各种语言搭建。比如Python的Tensorflow实现,C和CUDA等等。

个人看到网上最火的应该是

Darknet: Open Source Neural Networks in C,一款基于Yolo算法的框架,好吧,就研究他了。

网站:

darknet https://pjreddie.com/darknet/

上面的链接提供了github地址:

https://github.com/pjreddie/darknet

  • 在Linux下,可以通过如下指令,编译部署,奈何本人破本win10已经跑的本子快冒烟了,就不考虑虚拟机装LINUX了
git clone https://github.com/pjreddie/darknet
cd darknet
make
  • windows下cmake编译darknet
  1. 带cmakelist的darknet源码地址,自己clone下来

    github地址 https://github.com/alexeyab/darknet

    本人网络环境访问github日常抽风,这里有个国内镜像

    code china https://codechina.csdn.net/mirrors/alexeyab/darknet.git

    这忘了说,没装git的话自己直接下载zip源码解压缩吧

4、Yolo源码编译

  1. 和编译OPENCV一样,但是要注意,由于没有GPU,把ENABLE_CUDA修改为不勾,OpenCV_DIR填写成刚才OPENCV编译产物 D:\test\yolo_learn\opencv\build\install,注意下面的提示 把 D:\test\yolo_learn\opencv\build\install\x64\vc15\bin 添加到环境变量PATH
  2. 打开 Darknet.sln 和编译OPENCV同理操作,DEBUG目录下出现 D:\test\yolo_learn\darknet_cmake_out\Debug\darknet.exe

乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第8张图片

乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第9张图片

5、测试编译成果

  • 把需要用的东西拷贝出来,放在任意一个地方

    • D:\test\yolo_learn\darknet\cfg
    • D:\test\yolo_learn\darknet\data
    • D:\test\yolo_learn\darknet\3rdparty\pthreads\bin\pthreadVC2.dll
  • 还需要下载别人训练好的权重 weights,去Yolo官网下载,电脑不行,就跑个YOLOV3-tiny,cfg文件在D:\test\yolo_learn\darknet\cfg\yolov3-tiny.cfg里面已经有了,不用下了。
    乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第10张图片

  • 集齐之后目录长这样

乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第11张图片

网上找个大象图片,保存在该目录 1.jpg,使用如下命令:

 .\darknet.exe detect .\yolov3-tiny.cfg .\yolov3-tiny.weights 1.jpg

看看效果,好厉害鼓掌!!

乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第12张图片

6、Python怎么调用

Darknet给我们提供了调用示例:

任意新建文件夹,拷贝以下文件过来:

  • D:\test\yolo_learn\darknet\darknet.py
  • D:\test\yolo_learn\darknet\darknet_images.py
  • D:\test\yolo_learn\darknet\darknet_video.py
  • D:\test\yolo_learn\darknet_cmake_out\Debug\darknet.exe
  • D:\test\yolo_learn\darknet_cmake_out\Debug\darknetd.dll
  • D:\test\yolo_learn\darknet\cfg
  • D:\test\yolo_learn\darknet\data
  • D:\test\yolo_learn\darknet\3rdparty\pthreads\bin\pthreadVC2.dll
  • yolov3-tiny.cfg
  • yolov3-tiny.weights

收集好了后长这样:
乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第13张图片

darknet.py提供了Python调用C接口的桥梁,注意源码中加载的dll名字不对,要改为 darknetd.dll

if os.name == "posix":
    cwd = os.path.dirname(__file__)
    lib = CDLL(cwd + "/libdarknet.so", RTLD_GLOBAL)
elif os.name == "nt":
    cwd = os.path.dirname(__file__)
    os.environ['PATH'] = cwd + ';' + os.environ['PATH']
    lib = CDLL("darknetd.dll", RTLD_GLOBAL)
else:
    print("Unsupported OS")
    exit

darknet_images.py调用darknet.py实现图像识别,darknet_video.py调用darknet.py实现视频识别

darknet_images.py 分析

  • 启动参数 --input指定识别的图像 --weights指定执行使用的权值 --config_file指定配置文件,我们可以按自己需要设置默认值,或命令行中指定。
def parser():
    parser = argparse.ArgumentParser(description="YOLO Object Detection")
    parser.add_argument("--input", type=str, default="",
                        help="image source. It can be a single image, a"
                        "txt with paths to them, or a folder. Image valid"
                        " formats are jpg, jpeg or png."
                        "If no input is given, ")
    parser.add_argument("--batch_size", default=1, type=int,
                        help="number of images to be processed at the same time")
    parser.add_argument("--weights", default="./yolov3-tiny.weights",
                        help="yolo weights path")
    parser.add_argument("--dont_show", action='store_true',
                        help="windown inference display. For headless systems")
    parser.add_argument("--ext_output", action='store_true',
                        help="display bbox coordinates of detected objects")
    parser.add_argument("--save_labels", action='store_true',
                        help="save detections bbox for each image in yolo format")
    parser.add_argument("--config_file", default="./yolov3-tiny.cfg",
                        help="path to config file")
    parser.add_argument("--data_file", default="./cfg/coco.data",
                        help="path to data file")
    parser.add_argument("--thresh", type=float, default=.25,
                        help="remove detections with lower confidence")
    return parser.parse_args()
  • 识别结果在,可以打印出detections看出结果
image, detections = image_detection(
            image_name, network, class_names, class_colors, args.thresh
            )

使用下面命令行试一试:

python .\darknet_images.py --input ./data/horses.jpg --weights .\yolov3-tiny.weights --config_file .\yolov3-tiny.cfg

打印detections的结果

[('horse', '27.55', (38.82840347290039, 198.037841796875, 97.55213928222656, 83.2736587524414)), ('horse', '31.6', (179.0945281982422, 216.92813110351562, 106.2730941772461, 166.52919006347656)), ('cow', '36.68', (278.2288818359375, 231.1339874267578, 83.64852905273438, 122.21803283691406)), ('cow', '49.55', (280.13873291015625, 230.17926025390625, 41.53354263305664, 75.0211181640625)), ('horse', '55.55', (39.60430908203125, 183.631591796875, 34.10652542114258, 43.73979949951172)), ('horse', '67.8', (278.2288818359375, 231.1339874267578, 83.64852905273438, 122.21803283691406)), ('horse', '70.22', (280.13873291015625, 230.17926025390625, 41.53354263305664, 75.0211181640625)), ('horse', '73.84', (85.5504150390625, 240.89239501953125, 163.40762329101562, 172.07479858398438))]

乞丐Windows笔记本学Yolo-Yolo源码编译、部署、Python调用_第14张图片

7 、后续

准备研究研究怎么训练自己的数据集。

你可能感兴趣的:(YOLO学习笔记,python,windows,opencv)