一、创建网络配置文件
1.打开configs文件夹
具体路径:anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/models-master/research/object_detection/samples/configs
2.创建configs文件
选择ssd+resnet+fpn作为主干网络,所以复制ssd_resnet50_v1_fpn_shared_box_predictor_640x640_coco14_sync.config配置文件,给复制后的文件命名为ssd_resnet50_v1_fpn_shared_box_predictor_640x640_coco14_sync_face.config
3.修改配置文件
1.修改第15行,num_classes
的值修改为1
num_classes为检测的类别数且不包含背景,这里我们只做人脸检测
2.修改第178-198行tf_record_input_reader
,eval_input_reader
参数的值,对应自己的路径
3.注释139行
fine_tune_checkpoint: "PATH_TO_BE_CONFIGURED/model.ckpt"
不使用预训练模型
二、训练网络模型
打开终端在tensorflow环境,进入到research
目录下,运行research/object_detection/model_main.py
python3 research/object_detection/model_main.py --pipeline_config_path=/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/models-master/research/object_detection/samples/configs/ssd_resnet50_v1_fpn_shared_box_predictor_640x640_coco14_sync_face.config --model_dir=/media/gqw/Sduty/Linux_tensorflow/widerface/resnet50v1-fpn --num_train_steps=100000 --alsologtostder
pipeline_config_path=
网络结构配置文件对应的路径
model_dirmodel=
对应的路径
num_train_steps=
训练总的迭代次数
alsologtostder
生成的logo日志
报错1
Traceback (most recent call last):
File "/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/models-master/research/object_detection/model_main.py", line 109, in <module>
tf.app.run()
File "/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 125, in run
_sys.exit(main(argv))
File "/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/models-master/research/object_detection/model_main.py", line 71, in main
FLAGS.sample_1_of_n_eval_on_train_examples))
File "/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/models-master/research/object_detection/model_lib.py", line 566, in create_estimator_and_inputs
config_override=config_override)
File "/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/models-master/research/object_detection/utils/config_util.py", line 95, in get_configs_from_pipeline_file
proto_str = f.read()
File "/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/lib/io/file_io.py", line 125, in read
self._preread_check()
File "/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/lib/io/file_io.py", line 85, in _preread_check
compat.as_bytes(self.__name), 1024 * 512, status)
File "/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/python/util/compat.py", line 61, in as_bytes
(bytes_or_text,))
TypeError: Expected binary or unicode string, got None
解决
国内对这个错误可参考的博客数不是很多,只有这一个小哥遇到了相同的错误。于是去google了一下,此篇参考价值比较好。总结后主要是三个方案
1.命令是否输入正确
2.检查路径是否正确,保括斜线的方向,完整的路径必须在一行不能回车,完整的路径必须在一行不能空格
3.更改为决定路径
外国小哥看完了drecryptost大哥的回答后重启了一下,竟然好了
中国小哥大概也是这个意思
我核对我的路径没有错误,决定更改决定路径试试
依然报错
一阵沮丧之后,决定仔细看看报错信息,发现可能与配置文件有关。
create_estimator_and_inputs
config_override=config_override)
File "/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/models-master/research/object_detection/utils/config_util.py", line 95, in get_configs_from_pipeline_file
proto_str = f.read()
尝试检查配置文件,但打开后发现配置文件全报红了。状况惨烈如下图所示:
一度以为是运行时不通过引起的配置文件报红。
这个错误持续许久,当我再次打开PyCharm时,发现弹出了一个对话框
想起来第一次打开配置文件时,提示我是否安装插件,让我安装三个,其中就要Illuminated Cloud
点击Retry失败,然后让我激活注册,但是无论怎么激活,再次打开还是提示这个框。在我核对完时间正确之后,开始研究这是个啥?
看不懂,选择卸载,卸载方法参考了此博客
然后,配置文件就变正常了心里很是欢喜,继续运行
model_main.py
报错2
2020-12-06 14:27:09.418454: I tensorflow/core/kernels/data/shuffle_dataset_op.cc:95] Filling up shuffle buffer (this may take a while): 1535 of 2048
2020-12-06 14:27:12.260443: I tensorflow/core/kernels/data/shuffle_dataset_op.cc:131] Shuffle buffer filled.
Segmentation fault (core dumped)
具体如下
提示缓存区满了,同时电脑变的异常卡顿
解决
重启电脑,再次尝试执行!
报错3
依然出错
查看报错信息
Caused by op 'PyFunc_3', defined at:
File "/home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/models-master/research/object_detection/model_main.py", line 109, in <module>
tf.app.run()
最后提示
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
解决
1)解决第一个报错信息
打开research/object_detection/model_lib.py
脚本
修改第438行 eval_metric_ops
,参数修改为(eval_config, list(category_index.values()), eval_dict)
1)解决第二个报错信息
查找资料,原因为显存不够,于是查看显存,具体方法详见这篇博客。
我们采取的方法是降低训练轮数,直到电脑不报错为止。
打开ssd_resnet50_v1_fpn_shared_box_predictor_640x640_coco14_sync_face
配置文件,减小训练轮数
修改第140行,batch_size
值为1
再次训练
报错4
提示找不到train.record
文件,这里没有保存报错信息。
解决
可能因为我是record文件和项目不在一个盘,我的电脑的解决办法就是在运行执行前先打开train.record
所在的文件夹,提前让电脑知道它在这,然后报错解决。
再次运行
运行成功!!!
训练一段时间后打印出日志信息,
我们查看此时的显存使用情况
这里查看显存的占用率,这个轮数是可以的。
报错5
发现训练时被killed,无奈。
解决
再次运行。
经过大约10个小时,终止了训练(再次运行可以恢复到原处继续训练),我们查看训练好的模型。
我们看到,此时已经训练了49258次。
打开checkpoint
文件
看到最后一次训练确实定位在了49258次。
三、查看训练参数
利用TensorBoard
查看精确值,召回率,IOU值,loos值,学习率等
具体含义,推荐:
博客1
博客2
准备工作,点击此篇博文
我们查看训练到所呈现出来的效果。
1.精确率
2.召回率
3.IOU
4.loos
5.学习率
效果不是很理想,这里暂且不做优化,继续进行!
上篇:利用TensorBoard观察训练曲线
下篇:Anaconad+Ubuntu16.4下tensorflow+SSD人脸检测 将模型转为pb文件