训练过程参考object_detection下的官网教程:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_pets.md
一、下载代码库、设置环境变量、预编译:
1、本次代码使用tensorflow官方代码,代码地址如下:
https://github.com/tensorflow/models/tree/r1.5
注意这里是
仅保留如下目录
tensorflow/models/research/object_detection/
tensorflow/models/research/slim/
> 因为最新的代码做了一些变化,需要使用pycocotool这个库,但是这个库的安装很复杂,目前暂时无法在tinymind上进行,所以这里使用比较老的r1.5版本的代码。
2、主要使用的是research/object_detection目录下的物体检测框架的代码。这个框架同时引用slim框架的部分内容,需要对运行路径做一下设置,不然会出现找不到module的错误。
设置运行路径的方式有两种:
- 直接在代码中插入路径,使用**sys.path.insert**,请自行查找相关资料
&&参考https://blog.csdn.net/dcrmg/article/details/79546962 未实践
- 使用环境变量PYTHONPATH,参考https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md
# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
>本次代码中,run.sh已经做好相关的path设置工作,在tinymind上运行可以不用考虑这个问题。
3、代码中需要预先编译一些proto buffer的class,不然会出现如下错误
```
Traceback (most recent call last):
File "Data_preprocessing.py", line 16, in <module>
from object_detection.utils import label_map_util
File "/path/to/object_detection/utils/label_map_util.py", line 22, in <module>
from object_detection.protos import string_int_label_map_pb2
ImportError: cannot import name string_int_label_map_pb2
```
解决方式是直接在research目录下运行如下代码
```
sudo apt install protobuf-compiler
protoc object_detection/protos/*.proto --python_out=.
```
编译一次后就不用再编译了。
二、下载数据、课程代码及预训练模型
数据:https://gitee.com/ai100/quiz-w8-data.git
课程代码:课件里quiz-object-detection,或者码云下载
三、生成tfrecord文件
python3 quiz-object-detection/create_data.py --label_map_path=./quiz-w8-data/labels_items.txt --data_dir=./quiz-w8-data --output_dir=./
creat_data.py为课程给的代码
label_map_path是类比标签labels_items.txt的全路径,data_dir是jpg数据集的全路径,output_dir是生成的tfrecord的存放路径
四、开始训练
1、修改配置文件ssd_mobilenet_v1_pets.config,有了这个配置文件就不用在终端中设置参数了。
(1)分类数目:num_classes: 5
(2)输入图片的尺寸(44行):image_resizer
(3)修改funetune文件的路径(158行处):fine_tune_checkpoint: "/data/ai100/quiz-w8/model.ckpt"
(4)训练数据的全路径(175行):input_path: "/data/ai100/quiz-w8/pet_train.record"
(5)标签的全路径(179行):label_map_path: "/data/ai100/quiz-w8/labels_items.txt"
(6)验据的条数(183行):num_examples: 47
(7)验证的轮数(186行):max_evals: 1
(8)验证数据的全路径(191行):input_path: "/data/ai100/quiz-w8/pet_val.record"
注意:以上路径需为相对路径,绝对路径会找不到!
2、将下述文件放到data文件夹中:标签文件、三个预训练的ckpt文件、训练集和验证集tfrecord文件、config配置文件。
服务器运行:将data文件价与models文件夹(modes/research下有object_detection、slim库)传到服务器上
3、本地训练
#models及data所在目录下
python3 ./models/research/object_detection/train.py --train_dir=./train_dir --pipeline_config_path=./data/ssd_mobilenet_v1_pets.config
train_dir为存放训练结果的目录,pipeline_config_path为训练所用config配置文件所在路径
4、本地验证
#models及data所在目录下
python ./models/research/object_detection/eval.py --checkpoint_dir=./train_dir --eval_dir=./eval_dir --pipeline_config_path=./data/ssd_mobilenet_v1_pets.config
checkpoint_dir为存放训练结果的目录,eval_dir为存放验证结果的目录,pipeline_config_path为config配置文件(与训练时同一文件)路径
注:本文为将tinymind的output/train的输出下载到本地进行验证,需要修改checkpoint中的路径
改为:
5、查看训练及验证结果
tensorboard --logdir ./train_dir
./train_dir为存放训练结果的目录
tensorboard --logdir ./eval_dir
./eval_dir为存放验证结果的目录
6、模型导出
python ./object_detection/export_inference_graph.py --input_type image_tensor --pipeline_config_path /path/to/pipeline_config_file --trained_checkpoint_prefix /path/to/train_dir/model.ckpt-[last_chekpoint_number] --output_directory /path/to/output_dir/exported_graphs
此处路径未更改,./object_detection/export_inference_graph.py为object_detection模块代码,--input_type image_tensor为固定的参数,--pipeline_config_path /path/to/pipeline_config_file为训练时的config文件,--trained_checkpoint_prefix /path/to/train_dir/model.ckpt-[last_chekpoint_number] 为训练后的checkpoint文件,--output_directory /path/to/output_dir/exported_graphs为模型导出后存放的路径
.pb文件为导出的模型
五、使用导出的模型
将课程里的inference.py放到object_detection中,再运行如下代码
python ./inference.py --output_dir=/path/to/output_dir --dataset_dir=/path/to/dataset_dir
--output_dir=/path/to/output_dir为上一步导出的.pb文件的路径,--dataset_dir=/path/to/dataset_dir为输入图像的路径,需要事先在该路径下放一张图片,名字取为test.jpg。模型输出放到了output_dir中,名字为output.png。
六、使用tinymind运行时,本课程提供了run.sh和run.py两个脚本,解决了训练和验证不能同时进行的问题。
1、上传数据集dataset_dir
包括tfrecord文件、预训练的模型文件、config文件,需要一个一个上传
注:config文件要放在dataset_dir里,见run.sh代码,注意修改config文件中数据的路径../data/jasonxu/数据集名称
2、上传代码
代码上传的是压缩文件
压缩包里需要有一层文件目录,否则上传后解压时会自动创建一个目录,不受控制。
设置载入点,载入点的先导就是上面的压缩包里的文件目录,载入点为:文件目录/XX.py
run.py和run.sh、验证导出的模型的reference.py要和slim库、objection_dection库一起放到week12-object_detection目录下一起压缩
需要更改run.sh中的数据集目录,为tinymind上的数据集目录
注:tinymind启动脚本时是直接从根目录启动的(即运行时当前目录为根目录),而不是从脚本所在目录,因此run.py和run.sh有操作将当前目录转到脚本所在目录。
3、本例没有要设置的参数,都在config文件和run.py、run.sh中
4、保存模型并运行
将tinymind上output/train中的训练结果全部下载到./train_dir目录中,输出本地验证代码
python3 ./models/research/object_detection/eval.py --checkpoint_dir=./train_dir --eval_dir=./eval_dir --pipeline_config_path=./data/ssd_mobilenet_v1_pets.config
报错:
查找ssd_mobilenet_v1_pets.config、eval.py、eval.util.py均无此错误,发现是./train_dir中从tinymind上下载的checkpoint文件里的路径不对
将路径修改为"./train_dir/model.ckpt*后报如下错误
将路径改成如下后正常运行
使用tensorboard查看验证结果
$tensorboard --logdir ./eval
可以看出水桶的map(平均准确率?)值为0.9518,还是很准
由于只是验证了第500步的数据,故只有一个点。