tensorflow目标检测--识别赵丽颖

tensorflow目标检测--识别赵丽颖


因为在前面目标检测中,我训练 水果检测,没有取得很好的效果,所以就先找了个简单的例子,识别特定的人脸。这里使用赵丽颖(我的女神)为例。

1. 训练

数据准备、训练模型,参考我的博客《Tensorflow之目标检测Object Detection探索学习》。
在训练完成后,我们需要生成自己的模型文件。使用object_detection目录下的export_inference_graph.py python程序。具体如下:

 python .\export_inference_graph.py --input_type=image_tensor --pipeline_config_path=training/ssd_mobilenet_v1_coco.config --trained_checkpoint_prefix=training/model.ckpt-100000 --output_directory=zhaoly_detection

说明:将模型文件,保存到自己创建的zhaoly_detection目录中;trained_checkpoint_prefix使用前面训练好的training/model.ckpt-100000。
程序运行后,会在zhaoly_detection目录下,生成如下文件:
在这里插入图片描述
在如下测试章节,我们需要用到frozen_inference_graph.pb文件,来进行特定人脸目标检测。

2. 测试

修改官方测试程序object_detection_tutorial.ipynb。这里我将jupyter notebook改成py文件。先上代码:

import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile

from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
import pylab
from PIL import Image

# This is needed since the notebook is stored in the object_detection folder.
sys.path.append("..")
from object_detection.utils import ops as utils_ops

if tf.__version__ < '1.04.0':
  raise ImportError('Please upgrade your tensorflow installation to v1.4.* or later!')

# This is needed to display the images.
# %matplotlib inline
# Here are the imports from the object detection module.
import matplotlib
print(matplotlib.get_backend())
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util
print(matplotlib.get_backend())
import matplotlib; matplotlib.use('TKAgg')
print(matplotlib.get_backend())
# 2. model preparation
# 2.1 Variables
# What model to download.
MODEL_NAME = 'zhaoly_detection'
# MODEL_FILE = MODEL_NAME + '.tar.gz'
# DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'

# Path to frozen detection graph. This is the actual model that is used for the object detection.
PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'

# List of the strings that is used to add correct label for each box.
PATH_TO_LABELS = os.path.join('data', 'zhaoly.pbtxt')

NUM_CLASSES = 1

# 2.2 Download model. have finished
# if False:
#   print("ssss")
#   opener = urllib.request.URLopener()
#   opener.retrieve(DOWNLOAD_BASE + MODEL_FILE, MODEL_FILE)
#   tar_file = tarfile.open(MODEL_FILE)
#   for file in tar_file.getmembers():
#       file_name = os.path.basename(file.name)
#       if 'frozen_inference_graph.pb' in file_name:
#           tar_file.extract(file, os.getcwd())

# Load a (frozen) Tensorflow model into memory.
detection_graph = tf.Graph()
with detection_graph.as_default():
  od_graph_def = tf.GraphDef()
  with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
    serialized_graph = fid.read()
    od_graph_def.ParseFromString(serialized_graph)
    tf.import_graph_def(od_graph_def, name='')


# Loading label map. this package depend of object detection model
label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
category_index = label_map_util.create_category_index(categories)

# 3. Helper code. image data reshape
def load_image_into_numpy_array(image):
  (im_width, im_height) = image.size
  return np.array(image.getdata()).reshape(
      (im_height, im_width, 3)).astype(np.uint8)


# 4. Detection
# For the sake of simplicity we will use only 2 images:
# image1.jpg
# image2.jpg
# If you want to test the code with your images, just add path to the images to the TEST_IMAGE_PATHS.
PATH_TO_TEST_IMAGES_DIR = 'test_images_zhaoly'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'zly-{}.jpg'.format(i)) for i in range(101, 111) ]
# Size, in inches, of the output images.
IMAGE_SIZE = (12, 8)

def run_inference_for_single_image(image, graph):
  with graph.as_default():
    with tf.compat.v1.Session() as sess:
      # Get handles to input and output tensors
      ops = tf.compat.v1.get_default_graph().get_operations()
      all_tensor_names = {output.name for op in ops for output in op.outputs}
      tensor_dict = {}
      for key in [
          'num_detections', 'detection_boxes', 'detection_scores',
          'detection_classes', 'detection_masks'
      ]:
        tensor_name = key + ':0'
        if tensor_name in all_tensor_names:
          tensor_dict[key] = tf.compat.v1.get_default_graph().get_tensor_by_name(
              tensor_name)
      if 'detection_masks' in tensor_dict:
        # The following processing is only for single image
        detection_boxes = tf.squeeze(tensor_dict['detection_boxes'], [0])
        detection_masks = tf.squeeze(tensor_dict['detection_masks'], [0])
        # Reframe is required to translate mask from box coordinates to image coordinates and fit the image size.
        real_num_detection = tf.cast(tensor_dict['num_detections'][0], tf.int32)
        detection_boxes = tf.slice(detection_boxes, [0, 0], [real_num_detection, -1])
        detection_masks = tf.slice(detection_masks, [0, 0, 0], [real_num_detection, -1, -1])
        detection_masks_reframed = utils_ops.reframe_box_masks_to_image_masks(
            detection_masks, detection_boxes, image.shape[0], image.shape[1])
        detection_masks_reframed = tf.cast(
            tf.greater(detection_masks_reframed, 0.5), tf.uint8)
        # Follow the convention by adding back the batch dimension
        tensor_dict['detection_masks'] = tf.expand_dims(
            detection_masks_reframed, 0)
      image_tensor = tf.compat.v1.get_default_graph().get_tensor_by_name('image_tensor:0')

      # Run inference
      output_dict = sess.run(tensor_dict,
                             feed_dict={image_tensor: np.expand_dims(image, 0)})

      # all outputs are float32 numpy arrays, so convert types as appropriate
      output_dict['num_detections'] = int(output_dict['num_detections'][0])
      output_dict['detection_classes'] = output_dict[
          'detection_classes'][0].astype(np.uint8)
      output_dict['detection_boxes'] = output_dict['detection_boxes'][0]
      output_dict['detection_scores'] = output_dict['detection_scores'][0]
      if 'detection_masks' in output_dict:
        output_dict['detection_masks'] = output_dict['detection_masks'][0]
  return output_dict

print(TEST_IMAGE_PATHS)
for image_path in TEST_IMAGE_PATHS:
  image = Image.open(image_path)
  # the array based representation of the image will be used later in order to prepare the
  # result image with boxes and labels on it.
  image_np = load_image_into_numpy_array(image)
  # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
  image_np_expanded = np.expand_dims(image_np, axis=0)
  # Actual detection.
  output_dict = run_inference_for_single_image(image_np, detection_graph)
  # Visualization of the results of a detection.
  vis_util.visualize_boxes_and_labels_on_image_array(
      image_np,
      output_dict['detection_boxes'],
      output_dict['detection_classes'],
      output_dict['detection_scores'],
      category_index,
      instance_masks=output_dict.get('detection_masks'),
      use_normalized_coordinates=True,
      line_thickness=8)
  plt.figure(figsize=IMAGE_SIZE)
  plt.imshow(image_np)
  plt.show()
# matplotlib.pyplot.show()

修改如下:

  • 注释掉模型下载的实现代码
  • 修改测试模型路径、label路径和检测分类数量
 MODEL_NAME = 'zhaoly_detection' 和
 PATH_TO_LABELS = os.path.join('data', 'zhaoly.pbtxt')
 NUM_CLASSES = 1
  • 修改测试图像路径等
PATH_TO_TEST_IMAGES_DIR = 'test_images_zhaoly'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'zly-{}.jpg'.format(i)) for i in range(101, 111) ]

3. 测试效果

整体还可以,个别没有检测到。种种原因,后面待查。图像质量问题、模型选择问题。。。。。。
,上效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/duanyuwangyuyan/article/details/111772344
今日推荐