项目作者: xincxiong

项目描述 :
ObjectDetection-Yolo-V3
高级语言: Jupyter Notebook
项目地址: git://github.com/xincxiong/ObjectDetection.git
创建时间: 2018-04-13T22:37:41Z
项目社区:https://github.com/xincxiong/ObjectDetection

开源协议:Other

下载


autonomous_driving

Summary:

  1. use object detectio on a car detection dataset.
  2. deal with bounding box.

  1. # need to write K.function(...)
  2. from keras import backend as K

  1. fileter with a threshold on class scores

    The model gives you a total of 19x19x5x85 numbers, with each box described by 85 numbers. It’ll be convenient to rearrange the (19,19,5,85) (or (19,19,425)) dimensional tensor into the following variables:

    • box_confidence: tensor of shape (19×19,5,1)(19×19,5,1) containing pcpc (confidence probability that there’s some object) for each of the 5 boxes predicted in each of the 19x19 cells.
    • boxes: tensor of shape (19×19,5,4)(19×19,5,4) containing (bx,by,bh,bw)(bx,by,bh,bw) for each of the 5 boxes per cell.
    • box_class_probs: tensor of shape (19×19,5,80)(19×19,5,80) containing the detection probabilities (c1,c2,…c80)(c1,c2,…c80) for each of the 80 classes for each of the 5 boxes per cell.

      Filters YOLO boxes by thresholding on object and class confidence.
      Arguments:
      box_confidence — tensor of shape (19, 19, 5, 1)
      boxes — tensor of shape (19, 19, 5, 4)
      box_class_probs — tensor of shape (19, 19, 5, 80)
      threshold — real value, if [ highest class probability score < threshold], then get rid of the corresponding box

      Returns:
      scores — tensor of shape (None,), containing the class probability score for selected boxes
      boxes — tensor of shape (None, 4), containing (b_x, b_y, b_h, b_w) coordinates of selected boxes
      classes — tensor of shape (None,), containing the index of the class detected by the selected boxes

      Note: “None” is here because you don’t know the exact number of selected boxes, as it depends on the threshold.
      For example, the actual output size of scores would be (10,) if there are 10 boxes.

  1. def yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = .6):
  2. # Step 1: Compute box scores
  3. box_scores = np.multiply(box_confidence, box_class_probs)
  4. # Step 2: Find the box_classes thanks to the max box_scores, keep track of the corresponding score
  5. box_classes = K.argmax(box_scores, axis=-1)
  6. box_class_scores = K.max(box_scores, axis=-1)
  7. # Step 3: Create a filtering mask based on "box_class_scores" by using "threshold". The mask should have the
  8. # same dimension as box_class_scores, and be True for the boxes you want to keep (with probability >= threshold)
  9. filtering_mask = K.greater_equal(box_class_scores, threshold)
  10. # Step 4: Apply the mask to scores, boxes and classes
  11. ### START CODE HERE ### (≈ 3 lines)
  12. scores = tf.boolean_mask(box_class_scores, filtering_mask)
  13. boxes = tf.boolean_mask(boxes, filtering_mask)
  14. classes = tf.boolean_mask(box_classes, filtering_mask)
  15. return scores, boxes, classes
  1. Non-max suppression
    Even after filtering by thresholding over the classes scores, you still end up a lot of overlapping boxes. A second filter for selecting the right boxes is called non-maximum suppression (NMS).
  1. def yolo_non_max_suppression(scores, boxes, classes, max_boxes = 10, iou_threshold = 0.5):
  2. # tensor to be used in tf.image.non_max_suppression()
  3. max_boxes_tensor = K.variable(max_boxes, dtype='int32')
  4. # initialize variable max_boxes_tensor
  5. K.get_session().run(tf.variables_initializer([max_boxes_tensor]))
  6. # Use tf.image.non_max_suppression() to get the list of indices corresponding to boxes you keep
  7. nms_indices = tf.image.non_max_suppression(boxes, scores, max_boxes_tensor, iou_threshold=iou_threshold)
  8. # Use K.gather() to select only nms_indices from scores, boxes and classes
  9. scores = K.gather(scores, nms_indices)
  10. boxes = K.gather(boxes, nms_indices)
  11. classes = K.gather(classes, nms_indices)
  12. return scores, boxes, classes
  1. wrapping up the filtering
    Implement yolo_eval() which takes the output of the YOLO encoding and filters the boxes using score threshold and NMS.
    Converts the output of YOLO encoding (a lot of boxes) to your predicted boxes along with their scores, box coordinates and classes.
    Arguments:
    yolo_outputs — output of the encoding model (for image_shape of (608, 608, 3)), contains 4 tensors:
    1. box_confidence: tensor of shape (None, 19, 19, 5, 1)
    2. box_xy: tensor of shape (None, 19, 19, 5, 2)
    3. box_wh: tensor of shape (None, 19, 19, 5, 2)
    4. box_class_probs: tensor of shape (None, 19, 19, 5, 80)
    image_shape — tensor of shape (2,) containing the input shape, in this notebook we use (608., 608.) (has to be float32 dtype)
    max_boxes — integer, maximum number of predicted boxes you’d like
    score_threshold — real value, if [ highest class probability score < threshold], then get rid of the corresponding box
    iou_threshold — real value, “intersection over union” threshold used for NMS filtering
    Returns:
    scores — tensor of shape (None, ), predicted score for each box
    boxes — tensor of shape (None, 4), predicted box coordinates
    classes — tensor of shape (None,), predicted class for each box
  1. def yolo_eval(yolo_outputs, image_shape = (720., 1280.), max_boxes=10, score_threshold=.6, iou_threshold=.5):
  2. # Retrieve outputs of the YOLO model (≈1 line)
  3. box_confidence, box_xy, box_wh, box_class_probs = yolo_outputs
  4. # Convert boxes to be ready for filtering functions
  5. boxes = yolo_boxes_to_corners(box_xy, box_wh)
  6. # Use one of the functions you've implemented to perform Score-filtering with a threshold of score_threshold (≈1 line)
  7. scores, boxes, classes = yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = score_threshold)
  8. # Scale boxes back to original image shape.
  9. boxes = scale_boxes(boxes, image_shape)
  10. # Use one of the functions you've implemented to perform Non-max suppression with a threshold of iou_threshold (≈1 line)
  11. scores, boxes, classes = yolo_non_max_suppression(scores, boxes, classes, max_boxes = max_boxes, iou_threshold = iou_threshold)
  12. return scores, boxes, classes
  1. Converts the output of YOLO encoding (a lot of boxes) to your predicted boxes along with their scores, box coordinates and classes.
  2. Arguments:
  3. yolo_outputs -- output of the encoding model (for image_shape of (608, 608, 3)), contains 4 tensors:
  4. box_confidence: tensor of shape (None, 19, 19, 5, 1)
  5. box_xy: tensor of shape (None, 19, 19, 5, 2)
  6. box_wh: tensor of shape (None, 19, 19, 5, 2)
  7. box_class_probs: tensor of shape (None, 19, 19, 5, 80)
  8. image_shape -- tensor of shape (2,) containing the input shape, in this notebook we use (608., 608.) (has to be float32 dtype)
  9. max_boxes -- integer, maximum number of predicted boxes you'd like
  10. score_threshold -- real value, if [ highest class probability score < threshold], then get rid of the corresponding box
  11. iou_threshold -- real value, "intersection over union" threshold used for NMS filtering
  12. Returns:
  13. scores -- tensor of shape (None, ), predicted score for each box
  14. boxes -- tensor of shape (None, 4), predicted box coordinates
  15. classes -- tensor of shape (None,), predicted class for each box

GRADED FUNCTION: yolo_eval

  1. def yolo_eval(yolo_outputs, image_shape = (720., 1280.), max_boxes=10, score_threshold=.6, iou_threshold=.5):
  2. # Retrieve outputs of the YOLO model (≈1 line)
  3. box_confidence, box_xy, box_wh, box_class_probs = yolo_outputs
  4. # Convert boxes to be ready for filtering functions
  5. boxes = yolo_boxes_to_corners(box_xy, box_wh)
  6. # Use one of the functions you've implemented to perform Score-filtering with a threshold of score_threshold (≈1 line)
  7. scores, boxes, classes = yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = score_threshold)
  8. # Scale boxes back to original image shape.
  9. boxes = scale_boxes(boxes, image_shape)
  10. # Use one of the functions you've implemented to perform Non-max suppression with a threshold of iou_threshold (≈1 line)
  11. scores, boxes, classes = yolo_non_max_suppression(scores, boxes, classes, max_boxes = max_boxes, iou_threshold = iou_threshold)
  12. return scores, boxes, classes

  • Input image (608, 608, 3)
  • The input image goes through a CNN, resulting in a (19,19,5,85) dimensional output.
  • After flattening the last two dimensions, the output is a volume of shape (19, 19, 425):
  • Each cell in a 19x19 grid over the input image gives 425 numbers.
  • 425 = 5 x 85 because each cell contains predictions for 5 boxes, corresponding to 5 anchor boxes, as seen in lecture.
  • 85 = 5 + 80 where 5 is because (pc,bx,by,bh,bw)(pc,bx,by,bh,bw) has 5 numbers, and and 80 is the number of classes we’d like to detect
  • You then select only few boxes based on:
  • Score-thresholding: throw away boxes that have detected a class with a score less than the threshold
  • Non-max suppression: Compute the Intersection over Union and avoid selecting overlapping boxes
  • This gives you YOLO’s final output.