使用darknet和darkflow训练YOLO物体检测模型

使用darknet和darkflow训练YOLO物体检测模型

借助darknet和darkflow这个2个开源项目,我们可以训练出Tensorflow Android Demo缺失的YOLO模型graph-tiny-yolo-voc.pb,并在Tensorflow Android Demo中使用。
并且可以使用自己的数据, 训练自己的物体检测模型,并在手机上运行。

[图片上传失败...(image-1f870e-1531928198416)]

首先需要下载或clone darkflow和darknet源码

git clone  https://github.com/thtrieu/darkflow
git clone https://github.com/pjreddie/darknet

Android demo on Tensorflow's here

  1. 利用已经训练好的darknet/tiny-yolo-voc.weights生成pb,并在手机上运行物体检测Demo
    注意tiny-yolo-voc.weights是需要先下载的
flow --model cfg/yolo.cfg --load ../darknet/tiny-yolo-voc.weights --savepb

通过上面的命令就可以生成Android Tensorflow Demo能用的YOLO模型文件了,
把生成的built_graph\tiny-yolo-voc.pb 复制到tensorflow\tensorflow\examples\android\assets\tiny-yolo-voc.pb
,然后去tensorflow\tensorflow\examples\android\src\org\tensorflow\demo\DetectorActivity.java 修改YOLO相关的配置,
主要有下面几个

private static final String YOLO_MODEL_FILE = "file:///android_asset/tiny-yolo-5c.pb";
private static final DetectorMode MODE = DetectorMode.YOLO;

然后把apk安装到手机上,点击TF Detect,应该就可以看到能检测出VOC数据集的20类物体了。

  1. 利用VOC数据集训练指定分类的物体检测模型
    首先下载好Pascal VOC2012数据集, 地址是http://host.robots.ox.ac.uk/pascal/VOC/voc2012/
    编辑darkflow/labels.txt, 加入想要的分类, 注意是在VOC2012的20类里面选择啊, 需要想要训练其它的分类, 就需要按照VOC的格式准备图片和annotation xml文件了,这个工作量会比较大,需要在图片上标注物体的矩形坐标。
    VOC数据集的物体分类如下
"aeroplane",
"bicycle",
"bird",
"boat",
"bottle",
"bus",
"car",
"cat",
"chair",
"cow",
"diningtable",
"dog",
"horse",
"motorbike",
"person",
"pottedplant",
"sheep",
"sofa",
"train",
"tvmonitor"

我们暂时只训练5类,在darkflow/labels.txt写入

car
pottedplant
person
bottle
tvmonitor

新建文件 darkflow\cfg\tiny-yolo-5c.cfg, 并复制darkflow\cfg\tiny-yolo-voc.cfg中的全部内容,
修改最后的[region]层中的分类数classes=5, 修改倒数第二层[convolutional]卷积层的卷积核数量filters=50, 计算方法是
change filters in the [convolutional] layer (the second to last layer) to num * (classes + 5). In our case, num is 5 and classes are 3 so 5 * (3 + 5) = 40 therefore filters are set to 40.

然后运行下面的命令做fine tune

CUDA_VISIBLE_DEVICES=1,2  flow --model cfg/tiny-yolo-5c.cfg --load /data5/zxt/darknet/tiny-yolo-voc.weights    --train --dataset "/data5/zxt/voc/VOCdevkit/VOC2012/JPEGImages" --annotation "/data5/zxt/voc/VOCdevkit/VOC2012/Annotations"    --gpu 2.0

# 评估checkpoint 1000
 flow --model cfg/tiny-yolo-5c.cfg --load -1

# 导出pb
flow --model cfg/tiny-yolo-5c.cfg --load -1 --savepb

# 测试效果, 查看sample_img/out下面生成的带检测框的图片,可以加入自己的测试图片
flow --pbLoad built_graph/tiny-yolo-5c.pb --metaLoad built_graph/tiny-yolo-5c.meta --imgdir sample_img/

修改Android Demo, 修改tensorflow\tensorflow\examples\android\src\org\tensorflow\demo\TensorFlowYoloDetector.java中的
private static final String[] LABELS = {, 改为新的分类。

然后就可以参考第一步把pb模型放到demo里面, 在手机上测试运行demo了。

你可能感兴趣的:(使用darknet和darkflow训练YOLO物体检测模型)