【膜拜大神】Tensorflow+YOLO v3训练自己的数据集合(TF-Slim)-下

做个快乐的搬运工~

在此立下flag:等找到实习我就去跑一跑代码,认真读程序,认真的,真的……

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

译自:

YunYang1994/tensorflow-yolov3: pure tensorflow Implement of YOLOv3 with support to train your own dataset

上篇:

【膜拜大神】Tensorflow实现YOLO v3(TF-Slim) - haoqimao_hard的博客 - CSDN博客  

划重点:如果我这样涉嫌侵权,请看到的读者提醒我或者联系我删除!!!

第1部分 简介

在Tensorflow(TF-Slim)中实现了YOLO v3,该灵感来自PawełKapica。完整的细节在本文中。在此项目中,我们涵盖了以下几个部分:

  •  YOLO v3架构
  •  权重转换器(用于将加载的COCO权重导出为TF的checkpoint)
  •  基本demo
  • GPUCPU都支持的非极大值抑制
  •  训练流程
  •  计算COCO mAP

此教程允许您快速了解YOLO 。

第2部分 快速入门

1.下载文件包

git clone https://github.com/YunYang1994/tensorflow-yolov3.git

 2. 安装依赖项

cd tensorflow-yolov3
pip install -r ./docs/requirements.txt

3. 将加载的COCO权重导出为TF checkpoint(yolov3.ckpt)和 frozen graph(yolov3_gpu_nms.pb)。yolov3的权重可以从这里下载:yolov3.weights,下载后将其放入./checkpoint目录中

python convert_weight.py --convert --freeze

4. 此时你会发现./checkpoint目录下多了一些.pb文件,运行demo脚本: 

python nms_demo.py
python video_demo.py # if use camera, set video_path = 0

【膜拜大神】Tensorflow+YOLO v3训练自己的数据集合(TF-Slim)-下_第1张图片

第3部分 训练自己的数据集

需要三个文件如下:

  • 图片路径及标签信息文件dataset.txt
xxx/xxx.jpg 18.19 6.32 424.13 421.83 20 323.86 2.65 640.0 421.94 20 
xxx/xxx.jpg 55.38 132.63 519.84 380.4 16
# image_path x_min y_min x_max y_max class_id  x_min y_min ... class_id 
  • 预设anchor文件anchors.txt
0.10,0.13, 0.16,0.30, 0.33,0.23, 0.40,0.61, 0.62,0.45, 0.69,0.59, 0.76,0.60,  0.86,0.68,  0.91,0.76
  • 类别名class.names
person
bicycle
car
...
toothbrush

3.1 训练浣熊数据集

(1)训练

为了帮助大家了解训练过程,我做了这个pipline的demo。浣熊数据集只有200个图像(训练180个,测试20个),我在./scripts文件夹下保存了一个shell脚本,可以让你获取数据并进行训练!

sh scripts/make_raccoon_tfrecords.sh
python show_input_image.py               # show your input image (optional)
python kmeans.py                         # get prior anchors and rescale the values to the range [0,1]
python convert_weight.py --convert       # get pretrained weights
python quick_train.py
tensorboard --logdir ./data

(2)测试和评估

正如你在tensor board中看到的那样,如果数据集太小或者训练时间太长,模型会开始过拟合,并从训练数据中学习不适用于测试数据的模式。

python convert_weight.py -cf ./checkpoint/yolov3.ckpt-2500 -nc 1 -ap ./data/raccoon_anchors.txt --freeze
python quick_test.py
python evaluate.py

如果仍然不熟悉训练流程,可以到此处与作者进行讨论。

3.2 训练其他数据集

(1)下载VOC PASCAL 数据

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

(2)下载COCO trainval和测试数据

wget http://images.cocodataset.org/zips/train2017.zip
wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip
wget http://images.cocodataset.org/zips/test2017.zip
wget http://images.cocodataset.org/annotations/image_info_test2017.zip 

第4部分 为什么YOLO算法如此神奇?

YOLO代表 You Only Look Once,它用CNN学习的特征来检测物体。虽然我们已成功运行这些代码,但我们应该了解YOLO的原理。

题外话:关于yolov3原理的文章,网上也有很多了,相信大家也是了解了才来这里的哈哈

4.1 anchor聚类

本文建议在边界框形状上使用聚类来找到适合数据的anchor。更多细节见这里 

4.2 结构细节

在这个项目中,我用了预训练权重。COCO数据集中有80个类, 1到80之间的每个整数表示相应的类标签。如果c=3,则分类对象是 car。由CNN学习的图像特征被传递到分类器和回归器上进行检测(边界框坐标,类别标签等)。详细信息请参见下图。(感谢Levio)

4.3 神经网络输入输出

  • 输入:[None,416,416,3]
  • 输出:矩形框中存在某目标的置信度,bounding box的位置和大小以及被检测到的目标类别(Rx, Ry, Rw, Rh, Pc, C1..Cn)。如上所述,bx, by, bw, bh代表bounding box的信息,Pc是置信度,n=80,即最后80个数字各自是对应类的概率。

4.4 使用分数阈值进行过滤

输出结果可能包含几个误检或重叠的bounding box,如果输入图像大小为[416, 416, 3],将获得(52*52+26*26+13*13)x3=10647框,因为YOLO v3使用9个anchor进行检测。(每个比例三个)。减少这些框的第一个方法是按分数阈值过滤它们。

输入参数

  • boxes:[10647,4]
  • scores[10647, 80],包含80个类的检测分数。
  • score_thresh:可变值,去掉分数低的框
# Step 1: Create a filtering mask based on "box_class_scores" by using "threshold".
score_thresh=0.4
mask = tf.greater_equal(scores, tf.constant(score_thresh))

4.5 非极大值抑制

即使通过阈值过滤后,仍然会有很多重叠的框。

第二种方法是非极大值抑制。

  • 舍弃所有 Pc <= 0.4的框
  • 如果还有剩余的框:
    • 选择Pc最大的那个框 
    • 舍弃与上一步框的IOU>=0.5的框

tensorflow中实现非极大值抑制:(更多细节见这里)

for i in range(num_classes):
    tf.image.non_max_suppression(boxes, score[:,i], iou_threshold=0.5) 

这是一个非极大值抑制的例子:在输入时,函数接收4个重叠的边界框,输出只返回一个

欢迎与我(原作者)讨论。

第5部分 其他实现

YOLOv3_TensorFlow

Implementing YOLO v3 in Tensorflow (TF-Slim)

Object Detection using YOLOv2 on Pascal VOC2012

Understanding YOLO

YOLOv3目标检测有了TensorFlow实现,可用自己的数据来训练

学员分享 | 小哥哥和用YOLOv3做目标检测的故事「文末送课」

目标检测|YOLOv2原理与实现(附YOLOv3)

YOLOv2は、2016年12月25日時点の、速度、精度ともに世界最高のリアルタイム物体検出手法です。

知乎专栏-目标检测yolov2

你可能感兴趣的:(yolov3,tensorflow,训练,yolo)