首页 > 科技 > TensorFlow2学习21、使用目标检测API测试自己的图片

TensorFlow2学习21、使用目标检测API测试自己的图片

一、说明

本文实验环境:

  • TF2.0
  • google conlab
  • Python3 GPU

二、环境配置

安装依赖包

!pip install -U --pre tensorflow=="2.*"
!pip install pycocotools

下载tensorflow的模型

import os
import pathlib


if "models" in pathlib.Path.cwd().parts:
while "models" in pathlib.Path.cwd().parts:
os.chdir('..')
elif not pathlib.Path('models').exists():
!git clone --depth 1 https://github.com/tensorflow/models

使用protobufs安装目标检测包

%%bash
cd models/research/
protoc object_detection/protos/*.proto --python_out=.
%%bash 
cd models/research
pip install .

三、代码实现

1. 导入包

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
from PIL import Image
from IPython.display import display

2. 导入目标检测模型:

from object_detection.utils import ops as utils_ops
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util

tensorflow2.0的tf.gfile改到tf.io.gfile了,这里需要打个程序补丁

# patch tf1 into `utils.ops`
utils_ops.tf = tf.compat.v1

# Patch the location of gfile
tf.gfile = tf.io.gfile

3. 使用SSD wit Mobilenet模型

加载模型的函数

def load_model(model_name):
base_url = 'http://download.tensorflow.org/models/object_detection/'
model_file = model_name + '.tar.gz'
model_dir = tf.keras.utils.get_file(
fname=model_name,
origin=base_url + model_file,
untar=True)

model_dir = pathlib.Path(model_dir)/"saved_model"

model = tf.saved_model.load(str(model_dir))
model = model.signatures['serving_default']

return model

加载标签集合

# List of the strings that is used to add correct label for each box.
PATH_TO_LABELS = 'models/research/object_detection/data/mscoco_label_map.pbtxt'
category_index = label_map_util.create_category_index_from_labelmap(PATH_TO_LABELS, use_display_name=True)

简单起见,这个文件夹里只放了2个图片进行测试。如果要测试自己的图像,就把路径加到TEST_IMAGE_PATHS里。
这两个原始图片是这样的:

.

# 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 = pathlib.Path('models/research/object_detection/test_images')
TEST_IMAGE_PATHS = sorted(list(PATH_TO_TEST_IMAGES_DIR.glob("*.jpg")))
TEST_IMAGE_PATHS


4. 检测

下载ssd_mobilenet_v1模型

model_name = 'ssd_mobilenet_v1_coco_2017_11_17'
detection_model = load_model(model_name)


看看模型结构,它是3通道 unit8格式的图片:


调用模型的函数,赋值给本地变量。

输出的变量 output_dict 是个字典类型, 包含 :

  • num_detections
  • detection_classes
  • detection_masks
  • detection_boxes
  • detection_masks_reframed
def run_inference_for_single_image(model, image):
image = np.asarray(image)
# The input needs to be a tensor, convert it using `tf.convert_to_tensor`.
input_tensor = tf.convert_to_tensor(image)
# The model expects a batch of images, so add an axis with `tf.newaxis`.
input_tensor = input_tensor[tf.newaxis,...]

# Run inference
output_dict = model(input_tensor)

# All outputs are batches tensors.
# Convert to numpy arrays, and take index [0] to remove the batch dimension.
# We're only interested in the first num_detections.
num_detections = int(output_dict.pop('num_detections'))
output_dict = {key:value[0, :num_detections].numpy()
for key,value in output_dict.items()}
output_dict['num_detections'] = num_detections

# detection_classes should be ints.
output_dict['detection_classes'] = output_dict['detection_classes'].astype(np.int64)

# Handle models with masks:
if 'detection_masks' in output_dict:
# Reframe the the bbox mask to the image size.
detection_masks_reframed = utils_ops.reframe_box_masks_to_image_masks(
output_dict['detection_masks'], output_dict['detection_boxes'],
image.shape[0], image.shape[1])
detection_masks_reframed = tf.cast(detection_masks_reframed > 0.5,
tf.uint8)
output_dict['detection_masks_reframed'] = detection_masks_reframed.numpy()

return output_dict

在测试图片上显示结果

def show_inference(model, 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 = np.array(Image.open(image_path))
# 调用检测函数
output_dict = run_inference_for_single_image(model, image_np)
# 可视化.
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_reframed', None),
use_normalized_coordinates=True,
line_thickness=8)

display(Image.fromarray(image_np))
for image_path in TEST_IMAGE_PATHS:
show_inference(detection_model, image_path)


.

5. 使用resnet_v2图像分割

model_name = "mask_rcnn_inception_resnet_v2_atrous_coco_2018_01_28"
masking_model = load_model("mask_rcnn_inception_resnet_v2_atrous_coco_2018_01_28")

显示测试图片的标注结果



可以看出resnet_v2有更高的准确度。

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/235306.html