[英]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.