本文是笔者在Windows 10上用python3.6 + Tensorflow gpu 1.9.0以egohand(一份手部检测数据集)训练过程中遇到的问题:
从头开始说起,笔者看到github上的一份已训练实现的手部识别源码
https://github.com/victordibia/handtracking
跑通一遍。实际已经运行成功了。只是用的是原有已训练完的模型。

第二步,是希望在源训练数据集上用Tensorflow重新训练一遍。

简述一下步骤:

  1. 下载手部检测数据
    来自于
    http://vision.soic.indiana.edu/projects/egohands/

  2. 整理数据
    不需要手动解压这个压缩包,而是使用代码去完成数据的解压和整理工作
    git库中的egohands_dataset_clean.py依次完成以下几项工作

如果当前目录下没有egohands_data.zip则下载,即调用download_egohands_dataset() 建议此步骤分成自己手动先下载好压缩包后再拷贝进来,避免下载过程中断续
否则解压egohands_data.zip并得到egohands文件夹,并对其中的图片数据执行rename_files()
rename_files()会将所有的图片重命名,加上其父文件夹的名称,避免图片名重复,并调用generate_csv_files()
generate_csv_files()读取每个场景下的图片,调用get_bbox_visualize(),根据标注文件polygons.mat绘制手部轮廓和Anchor Box并显示,同时将图片标注转换并存储为csv文件,全部处理完后,再调用split_data_test_eval_train()
split_data_test_eval_train()完成训练集和测试集的分割,在images文件夹中新建train和test两个文件夹,分别存放对应的图片和csv标注
完成以上工作后,便可以手动删除一开始解压得到的egohands文件夹

3.调用generate_tfrecord.py(不在该git中,从https://github.com/datitran/raccoon_dataset/blob/master/generate_tfrecord.py
直接拷贝过来),将训练集和测试集整理成TFRecord文件

由于这里只需要检测手部,因此物体类别只有一种即hand,如果需要定制其他物体检测任务,generate_tfrecord.py中修改以下代码即可

def class_text_to_int(row_label):
    if row_label == 'hand':
        return 1
    else:
        None

接下来将generate_tfrecord.py放到与egohands_dataset_clean.py同级目录中,运行
python generate_tfrecord.py --csv_input=images/train/train_labels.csv --output_path=train.record
报如下错误:
Traceback (most recent call last):
File "generate_tfrecord.py", line 100, in <module>
tf.app.run()
File "D:\PycharmProjects\OpenCV_Tensor_Env\lib\site-packages\tensorflow\python\platform\app.py", line 125, in run
_sys.exit(main(argv))
File "generate_tfrecord.py", line 91, in main
tf_example = create_tf_example(group, path)
File "generate_tfrecord.py", line 46, in create_tf_example
encoded_jpg = fid.read()
File "D:\PycharmProjects\OpenCV_Tensor_Env\lib\site-packages\tensorflow\python\lib\io\file_io.py", line 125, in read
self._preread_check()
File "D:\PycharmProjects\OpenCV_Tensor_Env\lib\site-packages\tensorflow\python\lib\io\file_io.py", line 85, in _preread_check
compat.as_bytes(self.__name), 1024 * 512, status)
File "D:\PycharmProjects\OpenCV_Tensor_Env\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 519, in exit
c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.NotFoundError: NewRandomAccessFile failed to Create/Open: CARDS_COURTYARD_B_T_frame_0011.jpg : ϵͳ\udcd5Ҳ\udcbb\udcb5\udcbdָ\udcb6\udca8\udcb5\udcc4\udcceļ\udcfe\udca1\udca3
; No such file or directory

最后一行错误 创建、打开CARDS_COURTYARD_B_T_frame_0011.jpg文件失败
CARDS_COURTYARD_B_T_frame_0011.jpg文件在images/train/目录下,相信花时间找generate_tfrecord中读文件的路径修改下即可。
本人偷了下懒,既然是获取本目录下的图片文件,那么只要将generate_tfrecord移动到images/train/目录下
再运行
python generate_tfrecord.py --csv_input=train_labels.csv --output_path=train.record
生成train.record成功。

网上stackflow中,有提到改变系统环境,用linux运行。这个步骤耗费太大,建议先按笔者的步骤尝试看看。