安裝
安裝tensorflow-gpu
最新版的tensorflow不支援cuda8.0, 是以,這裡安裝了tensorflow1.4,用清華的鏡像:
pip install \
-i https://pypi.tuna.tsinghua.edu.cn/simple/ \
https://mirrors.tuna.tsinghua.edu.cn/tensorflow/linux/gpu/tensorflow_gpu-1.4.0-cp27-none-linux_x86_64.whl
擷取 TensorFlow Models 源碼:
git clone https://github.com/tensorflow/models –recursive
cd models/
安裝必要的python包,如pillow,lxml,jupyter,matplotlib
手動編譯安裝Protobuf 3.3:
wget https://github.com/google/protobuf/archive/v3.3.0.tar.gz
tar zxvf v3.3.0.tar.gz
cd protobuf-3.3.0/
./autogen.sh
./configure
make -j8
make install
如果出錯,configure.ac:17: error: possibly undefined macro: AC_PROG_LIBTOOL,則安裝sudo apt-get install libtool
添加環境變量export LD_LIBRARY_PATH=/usr/local/lib
編譯proto:
(Folder tensorflow/models/research)
protoc object_detection/protos/*.proto –python_out=.
export PYTHONPATH=$PYTHONPATH:
:
pwd
/slim
pwd
測試是否成功
python object_detection/builders/model_builder_test.py
Ran 13 tests in 0.045s
OK
http://mp.weixin.qq.com/s/eN41M1sMLxvQMEl0IhyC9w
準備資料集,并轉成tfrecords, 利用腳本create_pet_tf_record.py即可,需要調整資料目錄
- images
- annotations
- xmls
- trainval.txt
python create_pet_tf_record.py –data_dir=../../Deep-Learning-master/tensorflow_toy_detector –output_dir=../../Deep-Learning-master/tensorflow_toy_detector –label_map_path=../../Deep-Learning-master/tensorflow_toy_detector/toy_label_map.pbtxt
其中,label_map是item { id: 1 name: ‘toy’}
修改配置檔案,object_detection/samples/configs,修改num以及路徑
訓練模型,我一開始用虛拟機訓練,可能記憶體不夠,程式直接被kill了,換到gpu上就可以了。另外,注意要先删掉logs,否則總是從上一次恢複運作。
錯誤:local variable ‘total_loss’ referenced before assignment
似乎是一個bug,可以直接在/usr/lib/python2.7/site-packages/tensorflow/contrib/slim/python/slim/learning.py那裡把total_loss=None
錯誤::Caught OutOfRangeError. Stopping Training.
檢查下dataset的路徑是否錯誤
python train.py --train_dir=../../../toy/Deep-Learning-master/tensorflow_toy_detector/logs/ --pipeline_config_path=../../../toy/Deep-Learning-master/tensorflow_toy_detector/faster_rcnn_resnet101_coco.config
測試模型eval.py
可以用tensorboard –logdir=eval_logs檢視訓練結果
将訓練好的模型導出,産生.pb的模型檔案,儲存在output檔案夾中
python export_inference_graph.py --input_type=image_tensor --pipeline_config_path=../../../toy/Deep-Learning-master/tensorflow_toy_detector/faster_rcnn_resnet101_coco.config --trained_checkpoint_prefix=../../../toy/Deep-Learning-master/tensorflow_toy_detector/logs/model.ckpt- --output_directory ../../../toy/Deep-Learning-master/tensorflow_toy_detector/output
使用儲存好的模型對圖檔進行物體檢測
我寫了一個腳本detection_pic.py:
import tensorflow as tf
from PIL import Image
import numpy as np
from utils import label_map_util
from utils import visualization_utils as vis_util
PATH_TO_CKPT = '.pb'
PATH_TO_LABELS = ''
NUM_CLASS =
flags = tf.app.flags
flags.DEFINE_string('ckpt_path', '', 'ckpt path')
flags.DEFINE_integer('num_class', , 'number of classes')
flags.DEFINE_string('label_path', '', 'label path')
flags.DEFINE_string('image_path', '', 'image path')
FLAGS = flags.FLAGS
def load_image_into_numpy_array(image):
(im_width, im_height) = image.size
return np.array(image.getdata()).reshape(
(im_height, im_width, )).astype(np.uint8)
def main(_):
ckpt_path = FLAGS.ckpt_path
num_class = FLAGS.num_class
label_path = FLAGS.label_path
image_path = FLAGS.image_path
# load tensorflow model into memory
detection_graph = tf.Graph()
with detection_graph.as_default():
od_graph_def = tf.GraphDef()
with tf.gfile.GFile(ckpt_path, 'rb') as fid:
serialized_graph = fid.read()
od_graph_def.ParseFromString(serialized_graph)
tf.import_graph_def(od_graph_def, name='')
# load label map
label_map = label_map_util.load_labelmap(label_path)
categories = label_map_util.convert_label_map_to_categories(label_map,
max_num_classes=num_class,
use_display_name=True)
category_index = label_map_util.create_category_index(categories)
# detection
with detection_graph.as_default():
with tf.Session(graph=detection_graph) as sess:
image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
detection_scores = detection_graph.get_tensor_by_name('detection_scores:0')
detection_classes = detection_graph.get_tensor_by_name('detection_classes:0')
num_detections = detection_graph.get_tensor_by_name('num_detections:0')
image = Image.open(image_path)
image_np = load_image_into_numpy_array(image)
image_np_expanded = np.expand_dims(image_np, axis=)
# Actial detection
(boxes, scores, classes, num) = sess.run(
[detection_boxes, detection_scores, detection_classes, num_detections],
feed_dict={image_tensor: image_np_expanded}
)
vis_util.visualize_boxes_and_labels_on_image_array(
image_np,
np.squeeze(boxes),
np.squeeze(classes).astype(np.int32),
np.squeeze(scores),
category_index,
use_normalized_coordinates=True,
line_thickness=
)
output_image = Image.fromarray(image_np)
output_image.save('out.jpeg')
if __name__ == '__main__':
tf.app.run()
運作以下指令:
python detection_pic.py --ckpt_path=../../../toy/Deep-Learning-master/tensorflow_toy_detector/output/frozen_inference_graph.pb --num_class= --label_path=../../../toy/Deep-Learning-master/tensorflow_toy_detector/toy_label_map.pbtxt --image_path=../../../toy/Deep-Learning-master/tensorflow_toy_detector/images/toy11.jpg
