原因:
- 1.主要是想加快识别速度(在减小识别类别的情况下)
- 2.减小数据库大小
- 3.去掉不想要的类别
- 4.仍然想用官方的weight(比我自己训练的精准)
- 5.因为对keras不熟, 不知道怎么在convert.py时直接从数据库中阉割掉
过程:
yolo3不管是视频还是图片检测 调用的都是 yolo.py 中的 detect_image
yolo.py
中 detect_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
不敢乱删这句话 阉割数据库失败