做个快乐的搬运工~
在此立下flag:等找到实习我就去跑一跑代码,认真读程序,认真的,真的……
----------------------------------------------------------------------------------------------------------------------------------------------------------------
译自:
YunYang1994/tensorflow-yolov3: pure tensorflow Implement of YOLOv3 with support to train your own dataset
上篇:
【膜拜大神】Tensorflow实现YOLO v3(TF-Slim) - haoqimao_hard的博客 - CSDN博客
在Tensorflow(TF-Slim)中实现了YOLO v3,该灵感来自PawełKapica。完整的细节在本文中。在此项目中,我们涵盖了以下几个部分:
GPU
和CPU都
支持的非极大值抑制此教程允许您快速了解YOLO 。
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
需要三个文件如下:
图片路径及标签信息文件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
(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
如果仍然不熟悉训练流程,可以到此处与作者进行讨论。
(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
YOLO代表 You Only Look Once,它用CNN学习的特征来检测物体。虽然我们已成功运行这些代码,但我们应该了解YOLO的原理。
题外话:关于yolov3原理的文章,网上也有很多了,相信大家也是了解了才来这里的哈哈
本文建议在边界框形状上使用聚类来找到适合数据的anchor。更多细节见这里
在这个项目中,我用了预训练权重。COCO数据集中有80个类, 1到80之间的每个整数表示相应的类标签。如果c=3
,则分类对象是 car
。由CNN学习的图像特征被传递到分类器和回归器上进行检测(边界框坐标,类别标签等)。详细信息请参见下图。(感谢Levio)
(Rx, Ry, Rw, Rh, Pc, C1..Cn)。
如上所述,bx, by, bw, bh
代表bounding box的信息,Pc
是置信度,n=80,即最后80个数字各自是对应类的概率。输出结果可能包含几个误检或重叠的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))
即使通过阈值过滤后,仍然会有很多重叠的框。
第二种方法是非极大值抑制。
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个重叠的边界框,输出只返回一个
欢迎与我(原作者)讨论。
- 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