Oct1a

YOLOv3 实时检测人像

YOLO是怎么运行的?

yolo将单个神经网络应用于完整图像。该网络将图像划分为区域并预测每个区域的边界框和概率。这些边界框由预测的概率加权。
先前的检测系统重新利用分类器或定位器来执行检测。他们将模型应用于多个位置和比例的图像。图像的高评分区域被认为是检测。

v3有什么新功能?

YOLOv3使用一些技巧来改进训练并提高了性能,包括:多尺度预测,更好的骨干分类器等。

快速体验YOLOv3

  • 先安装个Darknet

    Darknet 由 C 语言和 CUDA 实现, 对GPU显存利用效率较高(CPU速度差一些, 通过与SSD的Caffe程序对比发现存在CPU较慢,GPU较快的情况). Darknet 对第三方库的依赖较少,且仅使用了少量GNU linux平台C接口,因此很容易移植到其它平台,如Windows或嵌入式设备.

git clone https://github.com/pjreddie/darknet
cd darknet
make

现在我们的cfg目录中就拥有了yolo的配置文件了

  • 下载作者训练好的重量模型文件(由于我机子太渣了,就下个非常小的模型玩)

    wget https://pjreddie.com/media/files/yolov3-tiny.weights
    

    需要其他模型可以进官网,点击后面的权重就可以下载,记得解压
    模型下载

  • 试着检测单张图片

    ./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
    

    会输出这样的结果

    layer     filters    size              input                output
      0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32  0.299 BFLOPs
      1 conv     64  3 x 3 / 2   416 x 416 x  32   ->   208 x 208 x  64  1.595 BFLOPs
      .......
    105 conv    255  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 255  0.353 BFLOPs
    106 detection
    truth_thresh: Using default '1.000000'
    Loading weights from yolov3.weights...Done!
    data/dog.jpg: Predicted in 0.029329 seconds.
    dog: 99%
    truck: 93%
    bicycle: 99%
    

    结果已经出来了,不过没显示效果对吧,因为我们没有用Opencv编译Darknet,不能实时检测。
    但刚才的结果已经保持在predictions.png,可以打开图片看下效果。

  • 检测多张图片

    ./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights
    

    会提示你输入图片路径尝试不同图像,按Ctrl+c退出

    layer     filters    size              input                output
      0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32  0.299 BFLOPs
      1 conv     64  3 x 3 / 2   416 x 416 x  32   ->   208 x 208 x  64  1.595 BFLOPs
      .......
    104 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
    105 conv    255  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 255  0.353 BFLOPs
    106 detection
    Loading weights from yolov3.weights...Done!
    Enter Image Path:
    
  • 更改检测阈值

    ./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg -thresh 0
    

摄像头实时检测

  • 先安装CUDA

    因为我们默认是使用cpu运行,但我们要是在GPU上运行,速度会更快

使用命令行sudo pacman -S cuda
或者去NVIDIA官网查看版本下载

安装过程可能会遇到很多坑。。可惜我忘了记录了
使用nvidia-smi命令查看是否列出你的显卡

更改默认显卡

./darknet -i 1 imagenet test cfg/alexnet.cfg alexnet.weights

都装完之后

修改配置文件(Makefile)

把GPU,Opencv都修改1

GPU=1    ## using GPU for train or test
CUDNN=0  ## using CUDNN to improve speed
OPENCV=1   ## using opencv
OPENMP=0
DEBUG=0  ## the arch of your GPU
##如果电脑性能低的话就改低一点
ARCH = -gencode arch=compute_60,code=sm_60 \
            -gencode arch=compute_61,code=sm_61 \
      -gencode arch=compute_62,code=compute_62

保存后执行命令make,要想提高编译速度可以用make -j4或者make -j8
每次修改完都要记得编译

连接摄像头

./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -c 0

已经更改Makefile中的选项编译了CUDA,但又想用CPU运算咋办?

加个-nogpu命令即可

./darknet -nogpu imagenet test cfg/alexnet.cfg alexnet.weights

参考资料:http://juw.me/?id=38
https://pjreddie.com/darknet/yolo/

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。