Ускорение и понимание Python Keras предсказать анализ результатов метода - PullRequest
0 голосов
/ 30 апреля 2020

Я использую Keras и Tensorflow для обнаружения объектов, используя стандарт Yolov3, а также Yolov3-Tiny (примерно в 10 раз быстрее). Все работает, но производительность довольно низкая, я получаю примерно один кадр каждые 2 секунды на GPU и один кадр каждые 4 секунды или около того на процессоре. При профилировании кода оказывается, что метод decode_netout занимает много времени. Обычно я следовал этому учебнику в качестве примера.

  1. Может ли кто-нибудь помочь мне разобраться с тем, что он делает?
  2. Существуют ли альтернативные методы, запеченные в Tensorflow (или другие библиотеки) что могли сделать эти расчеты? Я поменял некоторые пользовательские Python для tf.image.non_max_suppression, например, и это немного помогло с точки зрения производительности.
# https://keras.io/models/model/
yhat = model.predict(image, verbose=0, use_multiprocessing=True)
# define the probability threshold for detected objects
class_threshold = 0.6
boxes = list()
for i in range(len(yhat)):
    # decode the output of the network
    boxes += detect.decode_netout(yhat[i][0], anchors[i], class_threshold, input_h, input_w)
def decode_netout(netout, anchors, obj_thresh, net_h, net_w):
    grid_h, grid_w = netout.shape[:2]
    nb_box = 3
    netout = netout.reshape((grid_h, grid_w, nb_box, -1))
    boxes = []
    netout[..., :2]  = _sigmoid(netout[..., :2])
    netout[..., 4:]  = _sigmoid(netout[..., 4:])
    netout[..., 5:]  = netout[..., 4][..., np.newaxis] * netout[..., 5:]
    netout[..., 5:] *= netout[..., 5:] > obj_thresh

    for i in range(grid_h*grid_w):
        row = i / grid_w
        col = i % grid_w
        for b in range(nb_box):
            # 4th element is objectness score
            objectness = netout[int(row)][int(col)][b][4]
            if(objectness.all() <= obj_thresh): continue
            # first 4 elements are x, y, w, and h
            x, y, w, h = netout[int(row)][int(col)][b][:4]
            x = (col + x) / grid_w # center position, unit: image width
            y = (row + y) / grid_h # center position, unit: image height
            w = anchors[2 * b + 0] * np.exp(w) / net_w # unit: image width
            h = anchors[2 * b + 1] * np.exp(h) / net_h # unit: image height
            # last elements are class probabilities
            classes = netout[int(row)][col][b][5:]
            box = BoundBox(x-w/2, y-h/2, x+w/2, y+h/2, objectness, classes)
            boxes.append(box)
    return boxes
...