【问题标题】:Human body detection using opencv, tensorflow and python使用opencv、tensorflow和python进行人体检测
【发布时间】:2018-06-01 11:06:59
【问题描述】:

我正在从事一个机器人项目,该项目涉及检测人体,我正在使用张量流和预定义的数据集来创建训练模型。由于我是机器学习的新手,因此我无法正确地从分类器中获取输出。我只需要人员检测,并希望避免检测到球、笔记本电脑或其他物体。 现在我的网络摄像头检测到所有物体,如球、球棒、笔记本电脑、电视等。我需要的输出只有得分在 80% 及以上的人。

我用于使用创建模型的代码是

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 utils import label_map_util

from utils import visualization_utils as vis_util

MODEL_NAME = 'ssd_mobilenet_v1_coco_11_06_2017'
MODEL_FILE = MODEL_NAME + '.tar.gz'
DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'


PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'
PATH_TO_LABELS = os.path.join('data', 'mscoco_label_map.pbtxt')

NUM_CLASSES = 90

if not os.path.exists(MODEL_NAME + '/frozen_inference_graph.pb'):
    print ('Downloading the model')
    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())
    print ('Download complete')
else:
    print ('Model already exists')

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='')

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)

import cv2
cap = cv2.VideoCapture(1)


with detection_graph.as_default():
  with tf.Session(graph=detection_graph) as sess:
   ret = True
   while (ret):
      ret,image_np = cap.read()
      image_np_expanded = np.expand_dims(image_np, axis=0)
      image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
      boxes = detection_graph.get_tensor_by_name('detection_boxes:0')      
      scores = detection_graph.get_tensor_by_name('detection_scores:0')
      classes = detection_graph.get_tensor_by_name('detection_classes:0')
      num_detections = detection_graph.get_tensor_by_name('num_detections:0')

      (boxes, scores, classes, num_detections) = sess.run(
          [boxes, scores, 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=8)
      cv2.imshow('image',cv2.resize(image_np,(1280,960)))
      if cv2.waitKey(27) & 0xFF == ord('q'):
          cv2.destroyAllWindows()
          cap.release()
          break

谁能解释一下我怎样才能只检测出准确度得分大于 80% 的人。

【问题讨论】:

    标签: python opencv image-processing tensorflow


    【解决方案1】:

    正如我从文档 here 中看到的,您只需检查 person 类。现在vis_util 检查所有类。您必须仅为 person 类添加 if 条件。下面给出了适当的标识符(取自文档)。 item { name: "/m/01g317" id: 1 display_name: "person" }

    【讨论】:

      【解决方案2】:

      标识符可以在数据文件夹中找到,该任务有 90 个不同的标识符。创建一个新的文本文件,例如“new.txt”,现在只需复制您需要显示的标识符,例如您需要显示人员, 复制

          item {
              name : "/m/01g317"
              id : 1
              display_name : "Person"
               }
      

      然后在您的最终代码中将类的数量从 90 更改为 1

      NUM_CLASSES = 1
      

      【讨论】:

        猜你喜欢
        • 2014-06-28
        • 1970-01-01
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        • 2017-10-02
        • 2016-05-01
        相关资源
        最近更新 更多