当前位置:网站首页>Common function detect_ image/predict

Common function detect_ image/predict

2022-07-07 07:07:00 Inverse summer 11111

detect_image

    #---------------------------------------------------#
    #  Test pictures 
    #---------------------------------------------------#
    def detect_image(self, image):
        start = timer()
        image_shape = np.array(np.shape(image)[0:2])
        crop_img, x_offset, y_offset = letterbox_image(image, (self.model_image_size[0], self.model_image_size[1]))
        photo = np.array(crop_img, dtype=np.float64)

        #  Image preprocessing , normalization 
        photo = preprocess_input(np.reshape(photo, [1, self.model_image_size[0], self.model_image_size[1], 3]))
        preds = self.ssd_model.predict(photo)

        #  Decode the prediction results 
        results = self.bbox_util.detection_out(preds, confidence_threshold=self.confidence)
        # print(results)

        if len(results[0]) <= 0:
            return image, []

        #  Screen out those whose scores are higher than confidence Box of 
        det_label = results[0][:, 0]
        det_conf = results[0][:, 1]
        det_xmin, det_ymin, det_xmax, det_ymax = results[0][:, 2], results[0][:, 3], results[0][:, 4], results[0][:, 5]
        top_indices = [i for i, conf in enumerate(det_conf) if conf >= self.confidence]
        top_conf = det_conf[top_indices]
        top_label_indices = det_label[top_indices].tolist()
        top_xmin, top_ymin, top_xmax, top_ymax = np.expand_dims(det_xmin[top_indices], -1), np.expand_dims(
            det_ymin[top_indices], -1), np.expand_dims(det_xmax[top_indices], -1), np.expand_dims(det_ymax[top_indices],
                                                                                                  -1)

        #  Remove the gray strip 
        boxes = retinanet_correct_boxes(top_ymin, top_xmin, top_ymax, top_xmax,
                                  np.array([self.model_image_size[0], self.model_image_size[1]]), image_shape)

        font = ImageFont.truetype(font='model_data/simhei.ttf',
                                  size=np.floor(3e-2 * np.shape(image)[1] + 0.5).astype('int32'))

        thickness = (np.shape(image)[0] + np.shape(image)[1]) // self.model_image_size[0]

        record_pred = []
        for i, c in enumerate(top_label_indices):
            predicted_class = self.class_names[int(c) - 1]
            score = top_conf[i]

            top, left, bottom, right = boxes[i]
            top = top - 5
            left = left - 5
            bottom = bottom + 5
            right = right + 5

            top = max(0, np.floor(top + 0.5).astype('int32'))
            left = max(0, np.floor(left + 0.5).astype('int32'))
            bottom = min(np.shape(image)[0], np.floor(bottom + 0.5).astype('int32'))
            right = min(np.shape(image)[1], np.floor(right + 0.5).astype('int32'))
            print(top, left, bottom, right)

            #  Picture frame 
            label = '{} {:.2f}'.format(predicted_class, score)
            draw = ImageDraw.Draw(image)
            label_size = draw.textsize(label, font)
            # label = label.encode('utf-8') #  If this place is going to become utf8
            print(label, (left, top), (right, bottom))
            record_pred.append(label + " %s %s %s %s" % (left, top, right, bottom))

            if top - label_size[1] >= 0:
                text_origin = np.array([left, top - label_size[1]])
            else:
                text_origin = np.array([left, top + 1])

            for i in range(thickness):
                draw.rectangle(
                    [left + i, top + i, right - i, bottom - i],
                    outline=self.colors[int(c) - 1])
            draw.rectangle(
                [tuple(text_origin), tuple(text_origin + label_size)],
                fill=self.colors[int(c) - 1])
            draw.text(text_origin, label, fill=(0, 0, 0), font=font)  #  If the previous label Switch to utf-8 Here should be changed back :str(label,'UTF-8')
            del draw

        end = timer()
        print("detect time:", end - start)
        return image, record_pred

Different models need to be changed only : boxes = ssd_correct_boxes(top_ymin,top_xmin,top_ymax,top_xmax,np.array([self.model_image_size[0],self.model_image_size[1]]),image_shape)
Remove the part of the gray strip ,ssd The model is ssd_correct,retinanet The model is retinanet_correct... By analogy

predict

from keras.layers import Input
from retinanet import Retinanet
from PIL import Image
import os

retinanet = Retinanet()

img_path = "data/train1/domain1" # TODO: Enter the image folder to test 
predict_path = "mAP/predict/"
filename_list = os.listdir(img_path)


for filename in filename_list:
    print(filename)
    img = input(filename)
    try:
        image = Image.open(img)
    except:
        print('Open Error! Try again!')
    else:
        r_image,record_pred = retinanet.detect_image(image)
        with open(predict_path + filename.split(".")[0] + '.txt', "w") as f:
            f.write("\n".join(record_pred))
        # r_image.save("mAP/predict_images/"+filename)


retinanet.close_session()   
原网站

版权声明
本文为[Inverse summer 11111]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207070214021064.html