簡體   English   中英

結合兩種不同的深度學習模型進行評估

[英]Combining two different deep learning models for evaluation

我有兩種不同的缺陷檢測深度學習模型。一種是對象檢測模型,另一種是語義分割模型。 目的是將兩者集成到單個預測算法中。 我正在尋找結合這兩個模型以預測結果的最佳方法。 我主要想以組合形式評估這兩個模型並計算平均精度(mAP)有什么辦法可以做到。 我無法評估,因為我在代碼的預測部分被卡住了。

def _get_detections(generator, model, unetmodel=None, score_threshold=0.05, max_detections=100, save_path=None):
    """ Get the detections from the model using the generator.

    The result is a list of lists such that the size is:
        all_detections[num_images][num_classes] = detections[num_detections, 4 + num_classes]

    # Arguments
        generator       : The generator used to run images through the model.
        model           : The model to run on the images.
        score_threshold : The score confidence threshold to use.
        max_detections  : The maximum number of detections to use per image.
        save_path       : The path to save the images with visualized detections to.
    # Returns
        A list of lists containing the detections for each image in the generator.
    """
    all_detections = [[None for i in range(generator.num_classes()) if generator.has_label(i)] for j in range(generator.size())]
    all_inferences = [None for i in range(generator.size())]

    for i in progressbar.progressbar(range(generator.size()), prefix='Running network: '):
        test_class = generator.load_annotations(i)['test_class']
        print("------")
        if test_class == 'scratches':
            usemodel = unetmodel
            print("Using unetmodel")
            raw_image    = generator.load_image(i)
            image, scale = generator.resize_image(raw_image.copy())
            image = generator.preprocess_image(image)

            if keras.backend.image_data_format() == 'channels_first':
                image = image.transpose((2, 0, 1))

            # run network
            start = time.time()
            #print (unetmodel.predict_on_batch(np.expand_dims(image, axis=0))[:3])
            #prediction = unetmodel.predict_on_batch(np.expand_dims(image, axis=0))[:3]
            boxes, scores, labels = (unetmodel.predict_on_batch(np.expand_dims(image, axis=0))[0,:,:,0] > 0.4).astype(np.uint8)
            #boxes, scores, labels = unetmodel.predict_on_batch(np.expand_dims(image, axis=0))[:3]
            inference_time = time.time() - start

            # correct boxes for image scale
            boxes /= scale

            # select indices which have a score above the threshold
            indices = np.where(scores[0, :] > score_threshold)[0]

            # select those scores
            scores = scores[0][indices]

            # find the order with which to sort the scores
            scores_sort = np.argsort(-scores)[:max_detections]

            # select detections
            image_boxes      = boxes[0, indices[scores_sort], :]
            image_scores     = scores[scores_sort]
            image_labels     = labels[0, indices[scores_sort]]
            image_detections = np.concatenate([image_boxes, np.expand_dims(image_scores, axis=1), np.expand_dims(image_labels, axis=1)], axis=1)    

        else:
            usemodel = model
            print("Using retinanetmodel")
        
            raw_image    = generator.load_image(i)
            image, scale = generator.resize_image(raw_image.copy())
            image = generator.preprocess_image(image)

            if keras.backend.image_data_format() == 'channels_first':
                image = image.transpose((2, 0, 1))

            # run network
            start = time.time()
            boxes, scores, labels = model.predict_on_batch(np.expand_dims(image, axis=0))[:3]
            inference_time = time.time() - start

            # correct boxes for image scale
            boxes /= scale

            # select indices which have a score above the threshold
            indices = np.where(scores[0, :] > score_threshold)[0]

            # select those scores
            scores = scores[0][indices]

            # find the order with which to sort the scores
            scores_sort = np.argsort(-scores)[:max_detections]

            # select detections
            image_boxes      = boxes[0, indices[scores_sort], :]
            image_scores     = scores[scores_sort]
            image_labels     = labels[0, indices[scores_sort]]
            image_detections = np.concatenate([image_boxes, np.expand_dims(image_scores, axis=1), np.expand_dims(image_labels, axis=1)], axis=1)

        if save_path is not None:
            draw_annotations(raw_image, generator.load_annotations(i), label_to_name=generator.label_to_name)
            draw_detections(raw_image, image_boxes, image_scores, image_labels, label_to_name=generator.label_to_name, score_threshold=score_threshold)

            cv2.imwrite(os.path.join(save_path, '{}.png'.format(i)), raw_image)

        # copy detections to all_detections
        for label in range(generator.num_classes()):
            if not generator.has_label(label):
                continue

            #all_detections[i][label] = np.concatenate([image_detections_unet[image_detections_unet[:, -1] == label, :-1]], [image_detections_rnet[image_detections_rnet[:, -1] == label, :-1]])
            all_detections[i][label] = image_detections[image_detections[:, -1] == label, :-1]

        #all_inferences[i] = np.concatenate(inference_time1, inference_time2)
        all_inferences[i] = inference_time   

    return all_detections, all_inferences

我做了一些修改。 請提出任何更改。 因為我收到以下錯誤。

WARNING:tensorflow:Model was constructed with shape (None, 256, 256, 3) for input Tensor("input_4:0", shape=(None, 256, 256, 3), dtype=float32), but it was called on an input with incompatible shape (1, 800, 800, 3).
Traceback (most recent call last):
  File "C:\Users\user\venv1\keras-retinanet\keras_retinanet\bin\evaluate_new.py", line 200, in <module>
    main()
  File "C:\Users\user\venv1\keras-retinanet\keras_retinanet\bin\evaluate_new.py", line 177, in main
    save_path=args.save_path
  File "C:\Users\user\venv1\keras-retinanet\keras_retinanet\bin\..\..\keras_retinanet\utils\eval_new1.py", line 219, in evaluate
    all_detections, all_inferences = _get_detections(generator, model, unetmodel, score_threshold=score_threshold, max_detections=max_detections, save_path=save_path)
  File "C:\Users\user\venv1\keras-retinanet\keras_retinanet\bin\..\..\keras_retinanet\utils\eval_new1.py", line 94, in _get_detections
    boxes, scores, labels = (unetmodel.predict_on_batch(np.expand_dims(image, axis=0))[0,:,:,0] > 0.4).astype(np.uint8)
ValueError: too many values to unpack (expected 3)

任何幫助表示贊賞。 先感謝您。

您可以使用tf.keras.layers.Concatenate Keras API 中的 tf.keras.layers.Concatenate 來組合兩個模型

# Concatenate last layer of model1 and model2
concat = tf.keras.layers.Concatenate()([dense_1, dense_2])

n_classes = 10
# output layer
output = tf.keras.layers.Dense(units=n_classes,
                               activation=tf.keras.activations.softmax)(concat)

Complete _model = tf.keras.Model(inputs=[input_1, input_2], outputs=[output])

complete _model.summary()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM