Yolo3 如何只识别一个类别

原因:

  • 1.主要是想加快识别速度(在减小识别类别的情况下)
  • 2.减小数据库大小
  • 3.去掉不想要的类别
  • 4.仍然想用官方的weight(比我自己训练的精准)
  • 5.因为对keras不熟, 不知道怎么在convert.py时直接从数据库中阉割掉

过程:

yolo3不管是视频还是图片检测 调用的都是 yolo.py 中的 detect_image
yolo.pydetect_image 关于 类别self.classes

        out_boxes, out_scores, out_classes = self.sess.run(
            [self.boxes, self.scores, self.classes],
            feed_dict={
                self.yolo_model.input: image_data,
                self.input_image_shape: [image.size[1], image.size[0]],
                K.learning_phase(): 0
            })

generate(__init__调用)中的

        boxes, scores, classes = yolo_eval(self.yolo_model.output, self.anchors,
                len(self.class_names), self.input_image_shape,
                score_threshold=self.score, iou_threshold=self.iou)
        return boxes, scores, classes

中的yolo_eval(位于yolo3中的 model.py)中的下一段, 添加一条if语句即可(第二行注释掉的)

    for c in range(num_classes):
        #if c == 32: #32->sports ball 32是 model_data/coco_classes.txt 对应的行减一(从0开始)
            # TODO: use keras backend instead of tf.
            class_boxes = tf.boolean_mask(boxes, mask[:, c])
            class_box_scores = tf.boolean_mask(box_scores[:, c], mask[:, c])
            nms_index = tf.image.non_max_suppression(
                class_boxes, class_box_scores, max_boxes_tensor, iou_threshold=iou_threshold)
            class_boxes = K.gather(class_boxes, nms_index)
            class_box_scores = K.gather(class_box_scores, nms_index)
            classes = K.ones_like(class_box_scores, 'int32') * c
            boxes_.append(class_boxes)
            scores_.append(class_box_scores)
            classes_.append(classes)

综上在yolo3/model.py 213 行下添加if判断即可

ps: 作者还写了注释 use keras backend instead of tf 看来想脱离tf





ps:

1.数据库中数据一样是有的, 只是减少了查询次数, 有点点效果, 但是并不明显
2.因为想用官方的weight, 曾尝试阉割官方weight:

  • 测试修改了 coco_classes.txt 和对应的 yolov3.cfg 下的3个yolo下的classes(80->3)
  • 重新生成yolo.h5 文件
  • 运行...
    报错位于yolo.py
self.yolo_model.layers[-1].output_shape[-1] == num_anchors/len(self.yolo_model.output) * (num_classes + 5)

debug 如下:

self.yolo_model.layers[-1].output_shape[-1] ->255
num_anchors->9
len(self.yolo_model.output) ->3 
(num_classes + 5)->85   # num_classes 是 coco_classes.txt下的类别个数

不清楚self.yolo_model.layers[-1].output_shape[-1] 是什么东西, 怎么训练都是255
不敢乱删这句话 阉割数据库失败

你可能感兴趣的:(Yolo3 如何只识别一个类别)