常用函数detect_image/predict

  • Post author:
  • Post category:其他



detect_image

    #---------------------------------------------------#
    #   检测图片
    #---------------------------------------------------#
    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)

        # 图片预处理,归一化
        photo = preprocess_input(np.reshape(photo, [1, self.model_image_size[0], self.model_image_size[1], 3]))
        preds = self.ssd_model.predict(photo)

        # 将预测结果进行解码
        results = self.bbox_util.detection_out(preds, confidence_threshold=self.confidence)
        # print(results)

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

        # 筛选出其中得分高于confidence的框
        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)

        # 去掉灰条
        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)

            # 画框框
            label = '{} {:.2f}'.format(predicted_class, score)
            draw = ImageDraw.Draw(image)
            label_size = draw.textsize(label, font)
            # label = label.encode('utf-8') # 这里如果要变成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)  # 如果前面label换成utf-8这里应该转变回来:str(label,'UTF-8')
            del draw

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

不同模型要换的只有:

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)


去掉灰条的部分,ssd模型就是ssd_correct,retinanet模型就是retinanet_correct。。。依次类推


predict

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

retinanet = Retinanet()

img_path = "data/train1/domain1" # TODO:输入的要测试的图片文件夹
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()   



版权声明:本文为weixin_43955530原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。