借助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
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类物体了。
"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了。