目标检测可视化结果对比--图片拼接

代码功能

目标检测可视化结果对比,使用场景是,将多张图片横向拼接起来(这里举例为3张图片拼接),对比不同模型的检测效果:

  • test_images 文件夹里面是输入图片,比如1.jpg,2.jpg,3.jpg,4.jpg,5.jpg
  • test_out01 文件夹里面是通过模型1的检测结果图片,比如1.jpg,2.jpg,3.jpg,4.jpg(有可能没有检测到,所以有些图片不会输出可视化的结果,test_out01里面的图片数量少于test_images)
  • test_out02 文件夹里面是通过模型2的检测结果图片,比如2.jpg,3.jpg,4.jpg,5.jpg(有可能没有检测到,所以有些图片不会输出可视化的结果,test_out01里面的图片数量少于test_images)
    在这里插入图片描述
    拼接效果示例:依次为 test_out01、test_out02、label
    在这里插入图片描述

代码使用方法

  • 把以下路径修改为自己的
    在这里插入图片描述
  • 可以通过修改 COL 和 ROW 的值,控制拼接方向(如下图这样设置,效果就是竖向拼接了)
    在这里插入图片描述

代码实现思路

  • 首先判断 保存拼接图片的文件夹OUT_NAME 是否存在,如果文件夹已经存在,则程序退出,请把已有文件夹删掉
  • 遍历label中的每一个图片,得到图片名字,与另外两个文件夹进行路径拼接,得到三张图片的“路径+名字”,送入concat_images()函数进行拼接(test_images、test_out01、test_out02、label中的图片名字是对应一致的,由于label中的图片最全,所以以label中的图片为主线进行遍历)
  • concat_images()函数的实现思路,见代码注解即可

代码

'''
把多张图片拼接起来,此脚本是3个图片横向拼接的示例
'''

import os
from traceback import print_tb
from PIL import Image
from random import sample, choices


# 超参数
test_images = "test22/images_24"            # 测试图片所在文件夹

test_out01 = "yolox_select/v0_x/test_out"   # 模型1图片所在文件夹
test_out02 = "yolox_select/v3_x/test_out"   # 模型2图片所在文件夹
lable_path='test22/xml_one_class_visual'    # label图片所在文件夹

OUT_NAME = "yolox_select/compare2" #拼接出的图片保存的文件夹

# 设置横向拼接,如果需要多个图片拼接,可以在此设置
PATH_list = [test_out01, test_out02, lable_path]
COL = 3 #指定拼接图片的列数,就是PATH_list的列数
ROW = 1 #指定拼接图片的行数,就是PATH_list的行数

SAVE_QUALITY = 100 #保存的图片的质量 可选0-100



def is_image_file(filename):
    return any(filename.endswith(extension) for extension in ['.png', '.jpg', '.jpeg', '.PNG', '.JPG', '.JPEG'])
    

#进行图片的复制拼接
def concat_images(image_names, out_name, ori_img):
    '''
    image_names:是待拼接图片的路径['test_out01/002592.jpg', 'test_out02/002592.jpg', 'lable_path/002592.jpg']
    out_name:拼接完成图片的路径+名字
    ori_img:'test_images/002592.jpg',用于填补test_out01和test_out02中图片不存在的情况
    '''
    image_files = []

    for index in range(COL*ROW):              
        # print("index = ", index)
        current_img = image_names[index]
        if os.path.exists(current_img):
            img = Image.open(current_img)
            UNIT_WIDTH_SIZE = img.width        #读取单张图片的宽
            UNIT_HEIGHT_SIZE = img.height      #读取单张图片的高
            image_files.append(img) #读取所有用于拼接的图片
        else:
            im2 = Image.open(ori_img) # 如果 test_out01 和 test_out02 不存在该图片,则使用原始的 test_images 填充
            image_files.append(im2)

    target = Image.new('RGB', (UNIT_WIDTH_SIZE * COL, UNIT_HEIGHT_SIZE * ROW)) #创建成品图的画布
    #第一个参数RGB表示创建RGB彩色图,第二个参数传入元组指定图片大小,第三个参数可指定颜色,默认为黑色
    for row in range(ROW):
        for col in range(COL):
            #对图片进行逐行拼接
            #paste方法第一个参数指定需要拼接的图片,第二个参数为二元元组(指定复制位置的左上角坐标)
            #或四元元组(指定复制位置的左上角和右下角坐标)
            target.paste(image_files[COL*row+col], (0 + UNIT_WIDTH_SIZE*col, 0 + UNIT_HEIGHT_SIZE*row))
    target.save(out_name, quality=SAVE_QUALITY) #成品图保存

if __name__ == '__main__':

    # 创建保存拼接图片的文件夹
    if not os.path.exists(OUT_NAME):
        os.makedirs(OUT_NAME)
    else:
        print("文件夹 %s 已存在,程序已退出,请处理..."%(OUT_NAME))
        exit(0)

    # 遍历 label 中的每一张图片,对一张进行拼接
    image_filenames = [x for x in os.listdir(lable_path) if is_image_file(x)]
    for image_filename in image_filenames:
        # 准备好要拼接的三张图片的 "绝对路径+图片名"
        image_names = []
        for img_path in PATH_list:
            image_names.append(os.path.join(img_path, image_filename))
        print("image_names = ", image_names)

        # 拼接图片
        concat_images(image_names, 
                      os.path.join(OUT_NAME, image_filename), 
                      os.path.join(test_images, image_filename))
### 实现目标检测神经网络中卷积层的可视化方法 #### 三维数据准备 为了能够直观展示卷积层的工作机制,通常会选取一些特定的数据集作为输入。这些数据可以是图片或其他形式的多维数组。对于图像处理任务而言,最常用的是RGB彩色图,其维度通常是高度×宽度×通道数(3)[^1]。 #### 特征映射提取 在构建好模型并完成训练之后,可以通过修改模型结构来获取中间特征映射(feature map)。具体来说,在Keras框架下,这一步骤可通过创建一个新的子模型(submodel),该子模型以原始模型的一部分为基础,并指定要观察的目标层作为输出层[^2]。 ```python from keras.models import Model layer_name = 'conv_layer_of_interest' intermediate_layer_model = Model(inputs=model.input, outputs=model.get_layer(layer_name).output) feature_maps = intermediate_layer_model.predict(image_data) ``` #### 数据预处理与标准化 由于不同层次产生的激活值范围差异较大,因此有必要先对得到的结果做适当调整再进行显示。一般做法是对每张特征图分别求最大最小值,然后将其线性变换到0~1区间内;或者采用全局直方图均衡化等更复杂的方法提升对比度效果[^3]。 ```python import numpy as np def scale_to_unit_interval(ndar, eps=1e-8): """ Scales all values in the ndarray ndar to be between 0 and 1 """ ndar = ndar.copy() ndar -= ndar.min() ndar *= 1.0 / (ndar.max() + eps) return ndar scaled_feature_maps = [] for fmap in feature_maps[0]: scaled_fmap = scale_to_unit_interval(fmap) scaled_feature_maps.append(scaled_fmap) scaled_feature_maps = np.array(scaled_feature_maps) ``` #### 图像拼接绘制 最后一步就是把经过上述操作后的多个低维矩阵重新组合成易于观看的形式。这里介绍一种简单的方式——将所有单通道灰度图横向排列构成一幅大图,这样既保留了空间位置关系又便于比较各滤波器响应特性之间的异同之处。 ```python import matplotlib.pyplot as plt n_plots = int(np.ceil(np.sqrt(len(scaled_feature_maps)))) fig, axes = plt.subplots(n_plots, n_plots, figsize=(12, 12)) axes = axes.flatten() for i, ax in enumerate(axes): if i < len(scaled_feature_maps): ax.imshow(scaled_feature_maps[i], cmap='gray') ax.axis('off') plt.tight_layout() plt.show() ``` 通过以上步骤即可实现对目标检测网络内部卷积层工作状态的有效监控与分析,有助于加深对其运作机理的理解以及优化调参过程中的决策制定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值