深度学习图片数据集分析手段--个人经验小结

2023-10-27

当拿到一批图片数据集的时候,我应该做哪些分析?这里是我自己从业过程中的一些分析手段,从哪里学习的已经不可考,如果有其他的大家觉得有用的分析,可以和我分享一下,避免我自己闭门造车。

这里根据已知的信息量分类两种情况

1. 只有图片数据,没有标注数据,这种情况下,是针对纯图像进行一种无标注的分析,这种分析帮助我们熟悉这些图片,对一些异常的情况进行一个初步筛选。

2. 既有图片数据又有标注数据,这种情况的图片分析会影响我们选择什么样的数据增强策略,模型选择以及损失函数的选择。

一、纯图片无标注情况中的数据分析

1.1 图像size信息

这里指的是图像的像素点行列数量信息。统计数据集中每个图片的size信息:遍历得到每张图片的长*宽,就是图像的分辨率数值,然后绘制成直方图观察图像数据的尺寸;一般我喜欢绘制成10bin的直方图,考虑到有些数据集因为来源不同导致采集的数据大小不一,可以考虑绘制的时候x轴以log_10为底进行绘制。

简单的效果图如下

一般来说如果数据集的尺寸信息差别较大,那么研究者需要心中有数,这些数据往往是不同的设备采集得到的,因此数据集的分布往往不会呈比较统一的分布情况,如果需要划分训练集和测试集,需要有意识的将各种尺寸的数据进行较为平均的分配;不然很可能训练集的准确率指标和测试集相差较大。另外我们在进行目标检测等任务时,往往会把图片resize到统一的尺寸,如果图片尺寸比较奇怪的,可以在训练前删除或者分割。

1.2 图像亮度信息

亮度信息反应了像素点的明亮程度,一般图片是RGB通道表示的,每个通道上的像素点值范围在[0-255]之间,那么值越大,则越接近白色;值越小越接近黑色;如下面的两张图,左图的亮度为58,右图为154。

关于亮度的计算,因为图像可以表示为颜色三通道的RGB,也可以表示为HSV(色域、饱和度、亮度)。

我一般直接用RGB信道的方式对图片计算平均亮度,然后绘图统计一下图片的亮度分布,一般在做日夜景的目标检测时,会有意识看一下这个指标。


from PIL import Image,ImageStat
def brightness_method( im_file ):
    #返回像素平均亮度
   im = Image.open(im_file).convert('L')
   stat = ImageStat.Stat(im)
   return stat.mean[0]

1.3图像的横纵比

横纵比是以宽度/高度这种比率的形式表示的图像形状信息。大于0,无上界,但是一般不超过5,大部分集中在0.6~1.8之间。我们在进行目标检测等任务训练时,往往会把图片resize到统一的尺寸,如果图片尺寸比较奇怪的,可以在训练前删除或者分割。

1.4 图像的对比度/锐度

对比度或者锐度一般反应图像细节边缘变化的敏锐程度,一般来说高对比度的图像看起来更加清晰。

如图所示,左边的图片明显比右边的图片模糊一点,就是在物体边缘的处理上,右边图片像素值变换更大。

对比度计算的算法很多,比如传统CV中采用Laplace算子、sobel算子,SMD算子等等,总之他们的计算逻辑就是计算每个像素点的一阶导数或者二阶导数,这反映了像素点值变换的剧烈程度。一般按照不同的计算方式,数值范围都不同,但是数值越大往往表示像素的变化越大,也即是对比度越高。

比如下面两张图采用laplace得到的数值分别为左图22,右图140。

提供两种常用的对比度计算方式


import numpy as np
import cv2
def laplacian_method(im_path):
    '''
    部分图片无效
    '''
    image = cv2.imread(im_path)
    gray_image =cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    lap = cv2.Laplacian(gray_image,cv2.CV_64F).var()
    score = np.mean(lap)
    return score

def SMD2(img_path):
    '''
    :param img:narray 二维灰度图像
    :return: int 图像约清晰越大
    有效,但是时间开销长
    '''
    color_img = cv2.imread(img_path)
    img = cv2.cvtColor(color_img,cv2.COLOR_BGR2GRAY)
    img = cv2.resize(img,(0,0),fx=0.5,fy=0.5,interpolation=cv2.INTER_NEAREST)
    shape = np.shape(img)
    output = 0
    for x in range(0, shape[0]-1):
        for y in range(0, shape[1]-1):
            output+=math.fabs(int(img[x,y])-int(img[x+1,y]))*math.fabs(int(img[x,y]-int(img[x,y+1])))
    return output/(shape[0]*shape[1])

关于这个对比度指标,怎么说呢,你说他有意义吧,确实能够筛出一些明显清晰度不高的图片,但是不同数值的图片之间的清晰度并没有那么明确的关系,如果一张图片的清晰度数值高于另一张图片,并不能说就一定比另一张图片清晰,因为这些方法都和图像的梯度变换有关,不同图像的拍摄内容导致本身像素的梯度就各有不同。很难利用这个指标客观评估不同图像之间的清晰度区别。这个指标适合用于在做图片处理的锐化处理前和锐化处理后的图片之间的比较。

1.5 图像有损无法打开的情况

有时候部分图片可能会因为传输或者其他原因,根本无法打开。可以采用下面的代码进行图片的筛选,不需要自己逐一尝试。


import fleep
def judge_correct_image_type(image_path):
    anno_type = image_path.split('.')[-1].lower()
    if anno_type=='jpg':
        anno_type='jpeg'
    image_data = open(image_path,'rb').read()[:128]
    info = fleep.get(image_data)
    if info is not None and len(info.mime)==1:
        essential_type = info.mime[0].split('/')[-1]
        if len(essential_type)==0:
            essential_type = 'broken'
    else:
        essential_type='broken'
    return anno_type,essential_type

需要注意,上面的代码只能判断无法打开的图片,不能判断如下这种图片缺损的情况:下面这种图片问题,暂时没有找到可行的修复策略,如果有哪位高手有办法,非常期待获得新的知识~

1.6 图像格式分布以及标注图片格式错误的情况

图片的格式jpg/png/gif/pdf/bmp,样本的标注格式可能和实际的格式不一致。因此需要对图片进行格式分析,给与正确的后缀名称,未来训练过程中,处理输入的坑也可以少一点。

代码还是上面的代码。

1.7 颜色域直方图

有时候我们非常希望获得图片关于颜色分布的特征,但是很遗憾,CV中常用的RGB颜色直方图比较不直观,比如它会分别绘制出红绿蓝三个颜色的分布情况,但是大家知道红色和绿色混合构成黄色,黄色是蓝色的补色,两者混合构成白色。然后当绘制的颜色直方图任何一个分布都不能说明这种颜色占主导。有趣的是当我们把图像从RGB转为HSV格式之后,就可以进行视觉的量化了。

定义:将颜色空间按照人眼视觉特征量化为72个维度,统计图片中每个颜色的直方图。

范围:直方图值域范围[0-1]

单张图片的展示并没有什么特别的作用,顶多看看颜色分布情况,从左到右,颜色分布大致依次为红-->黄-->绿-->青-->蓝-->紫。

这个分析真正有用在于可以搜寻颜色空间相似的图片!比如每张图片缩减到72维度之后,利用向量之间的相似性计算公式(可以是余弦相似度或者是L1距离),可以得到每张图片颜色分布相似图片,巧妙利用阈值筛选,就可以得到某张图片的相似颜色图片集:

 

 核心代码1: 抽取图像颜色直方图,返回每个图片的vector,维度为72。入口函数colors


def quantilize(value):
    '''hsv直方图量化
    value : [21, 144, 23] h, s, v
    opencv中,h-[0,180], s-[0,255], v-[0,255]
    '''
    #
    value[0] = value[0] * 2
    hlist = [20, 40, 75, 155, 190, 270, 290, 316, 360]
    svlist = [21, 178, 255]
    for i in range(len(hlist)):
        if value[0] <= hlist[i]:
            h = i % 8
            break
    for i in range(len(svlist)):
        if value[1] <= svlist[i]:
            s = i
            break
    for i in range(len(svlist)):
        if value[2] <= svlist[i]:
            v = i
            break
    return 9 * h + 3 * s + v

def colors(imagepath):
    img = cv2.imread(imagepath)
    img = cv2.resize(img,(0,0),fx=0.1,fy=0.1)
    hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
    nhsv = np.zeros(hsv.shape[:2], dtype=np.uint8)
    t2 = datetime.now()
    for i in range(hsv.shape[0]):
        for j in range(hsv.shape[1]):
            nhsv[i][j] = quantilize(hsv[i][j])
            # nhsv[i][j] = color_quantilize(hsv[i][j])
    print(imagepath, datetime.now() - t2)
    hist = cv2.calcHist([nhsv], [0], None, [72], [0, 71])  # 40x faster than np.histogramfaster than np.histogram
    hist = hist / (hsv.shape[0] * hsv.shape[1])
    plt.plot(hist, color='r')
    plt.xlim([0, 72])
    plt.show()
    return hist.reshape(-1)

    

 1.8 暂不考虑的图像分析

其余暂时不考虑的图像分析维度:

1. 颜色矩,比如一阶颜色矩即均值。反映图像的整体明暗程度。值越大,图像越亮。

原因:和亮度重合,更加适用于单张图片的分析

2. 颜色直方图描述的是图像不同颜色在整幅图中像中所占的比例,反映了图像颜色分布的统计特性,

原因:一般用于图片的PS,单张图片的分析,色域调整,还可以用于图像的检测

3. 信噪比:理论上说,信噪比是对每个像素亮度变化的统计分析。直观的说就是那些图像中的“颗粒”,或者是颜色因为噪声产生波动变化的情况。这是由于成像原理或者设备干扰导致的。这是一个成像质量的判断依据。一般信噪比的计算需要在同一个画面拍摄多张图片,利用多张图片相同位置的均值方差来作为去噪效果,其他图片作为噪声图片,来计算针对这个场景的信噪比。如果是只有一张图片,需要选择一张图片上的ROI区域来计算信号的噪声情况。对于真实的样本图片来说,这个指标是否有意义?

 

参考文献

[利用ENVIIDL实现图像清晰度评价——点锐度算法](https://www.cnblogs.com/enviidl/p/16315698.html)

[Python图像处理之图像清晰度评价](Python图像处理之图像清晰度评价_python_脚本之家)

[python下对hsv颜色空间进行量化操作](python下对hsv颜色空间进行量化操作_python_脚本之家)

[关于HSV了解这些就够了,python-opencv获取图片精确hsv的值](关于HSV了解这些就够了,python-opencv获取图片精确hsv的值_hsv值_骑摩托的蜗牛的博客-CSDN博客)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习图片数据集分析手段--个人经验小结 的相关文章

随机推荐

  • nodejs npm 安装报错 无法安装 behind a proxy

    npm ERR Error connect ECONNREFUSED npm ERR at errnoException net js 878 11 npm ERR at Object afterConnect as oncomplete
  • Where-are-they-looking-PyTorch 代码Error: Bool value of Tensor with more than one value is ambiguous

    在Where are they looking PyTorch中的utils py中有一个判断 if temp lt best best temp 报出 Error Bool value of Tensor with more than o
  • Puppet

    1 Puppet简介 Puppet使用一种描述性语言来定义配置项 配置项中被称为 资源 描述性语言可以声明用户的配置状态 比如声明一个软件包应该被安装或一个服务应该被启动等 Puppet可以运行在一台服务器端 每个客户端通过SSL证书连接到
  • 机器学习在工业应用中的新思考

    人工智能在学术界默默发展了很多很多年 从最早的神经网络 到10年前风靡的SVM bagging and boosting 如今的深度学习 日新月异 各领风骚数几年 工业界的发展从最早应用于纯粹的互联网企业 近几年开始应用到更多更广泛的场景
  • Win32环境下两种用于C++的线程同步类

    线程同步是多线程程序设计的核心内容 它的目的是正确处理多线程并发时的各种问题 例如线程的等待 多个线程访问同一数据时的互斥 防死锁等 Win32提供多种内核对象和手段用于线程同步 如互斥量 信号量 事件 临界区等 所不同的是 互斥量 信号量
  • RPC流程一 - proto编写

    参考 https github com goyas goya rpc tree master src 对RPC中的Server端和Client端流程进行整理 代码目录 CMakeLists txt config cmake sample e
  • 手把手教你用代码实现 SSO 单点登录

    点击上方 Java基基 选择 设为星标 做积极的人 而不是积极废人 每天 14 00 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框
  • SSH连接慢的问题

    维护linux经常需要使用ssh进行连接 但是有时会很郁闷的发现ssh连接部分机器的时候特别的慢 之前写过一篇文章
  • 【数字IC精品文章收录】近500篇文章

    数字IC全站文章索引demo版 建议收藏慢慢看 一 项目说明 1 1 索引目的 1 2 收录原则 1 3 投稿方式 1 4 版本迭代 二 数字IC学习路线 三 通用技能篇 3 1 数字电路 3 2 硬件描述语言 Verilog 3 3 li
  • React常见面试题

    React常见面试题 1 说说你对react的理解 有哪些特性 2 说说Real DOM和Virtual DOM的区别 优缺点 3 说说React生命周期有哪些不同的阶段 每个阶段对应的方法 4 说说React中setState执行机制 5
  • 【应用笔记】Sub-1G系列产品CW32W031单片机CAD应用参考

    一 功能介绍 CW32W031 的射频部分支持 CAD 中断 从 Deepsleep 进入 STB3 开启 CAD 功能并进入 RX 模式后 CW32W031 会检测信道中是否会有 ChirpIOT 信号 如果存在将 CAD IRQ 置高
  • 袁红岗的程序员修炼之道

    袁红岗的程序员修炼之道 转载引言 袁红岗1994年加盟金蝶 1996年在整个行业还处在DOS时代时最早成功开发出基于Windows平台的金蝶财务软件 开创了依靠技术创新推动企业快速发展的典范 1998年成功开发出基于三层结构组件技术的金蝶K
  • 解决Jenkins报告在浏览器无法显示问题

    在使用jenkins定时启动并收集测试报告的过程中 发现在jenkins上配置的HTML Report打开之后样式不对 页面一片空白 打开开发者模式 发现页面有很多脚本报错 提示有很多资源文件被禁止加载了 百度之后 发现这个是jenkins
  • 【JavaScript】花点时间了解执行上下文

    引言 当我们在浏览器中运行JavaScript代码时 浏览器会先创建一个全局执行上下文 Global Execution Context 然后逐行解析和执行代码 执行上下文是JavaScript中非常重要的概念 它决定了代码的执行顺序和作用
  • Echarts图例legend选中select状态动态更新(踩坑)

    今天计划实现一个小功能 但是却在细节上浪费了大量的时间 特此记录 想要实现的功能是这样的 如下一个ECharts图 后台会一次性接收85条曲线的数据 但在初始化的时候只显示前7条曲线 官方文档 给出了 legend selected 这个属
  • U++ 截屏并拿到所有的截屏资源

    void APluginUseActor spotScreen TArray
  • Qt5下Qxlsx模块安装及使用

    文章目录 1 未安装Qxlsx的程序效果 2 安装Perl 编译Qxlsx源码用 2 1 下载 ActivePerl 5 28 2 2 安装 ActivePerl 5 28 3 下载并编译Qxlsx源码 3 1 下载Qxlsx源码 3 2
  • 树结构(有id和pid字段)数组,生成多层嵌套的json对象

    传入的数组有id和父节点pid字段 通过它们的关联构造成一棵或多棵树结构 param nodes 集合 param treeRootId 根节点的id function createTreeData nodes treeRootId var
  • 【模拟电路】电极驱动H桥

    H桥式驱动电路 是因为它的形状酷似字母H 如图 当Q1和Q4导通时 电机正转 当Q2和Q3导通时 电机反转 任何时候 H桥同一侧的晶体管不能同时导通 否则就会造成电源和地之间短路 电机正转 电机反转 一个双电机驱动电路 H桥 设计思路 使用
  • 深度学习图片数据集分析手段--个人经验小结

    当拿到一批图片数据集的时候 我应该做哪些分析 这里是我自己从业过程中的一些分析手段 从哪里学习的已经不可考 如果有其他的大家觉得有用的分析 可以和我分享一下 避免我自己闭门造车 这里根据已知的信息量分类两种情况 1 只有图片数据 没有标注数