【人工智能项目】ImageNet数据集介绍以及数字图像处理技术

imagenet数据集处理pytorch imagenet数据集有多大_imagenet


本次介绍一下imagenet数据集,并对imagenet数据集中的图片做一些数字图像处理预处理操作。那话不多说,搞起来!!!

imagenet数据集处理pytorch imagenet数据集有多大_灰度直方图_02

ImageNet数据集介绍

imagenet数据集处理pytorch imagenet数据集有多大_人工智能_03


ImageNet图像数据集始于2009年,当时李飞飞教授等在CVPR2009上发表了一篇名为《ImageNet: A Large-Scale Hierarchical Image Database》的论文,之后就是基于ImageNet数据集的7届ImageNet挑战赛(2010年开始),2017年后,ImageNet由Kaggle(Kaggle公司是由联合创始人兼首席执行官Anthony Goldbloom 2010年在墨尔本创立的,主要是为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台)继续维护。

WordNet是一个由普林斯顿大学认识科学实验室在心理学教授乔治·A·米勒的指导下建立和维护的英语字典。开发工作从1985年开始。由于它包含了语义信息,所以有别于通常意义上的字典。WordNet根据词条的意义将它们分组,每一个具有相同意义的字条组称为一个synset(同义词集合)。WordNet为每一个synset提供了简短,概要的定义,并记录不同synset之间的语义关系。WordNet中的每个有意义的概念(concept)(可能由多个单词或单词短语描述)被称为"同义词集(synonym set)“或"synset”。

ImageNet是根据WordNet层次结构组织的图像数据集。在ImageNet中,目标是为了说明每个synset提供平均1000幅图像。 每个concept图像都是质量控制和人为标注的(quality-controlled and human-annotated)。 在完成之后,希望ImageNet能够为WordNet层次结构中的大多数concept提供数千万个干净整理的图像(cleanly sorted images)

ImageNet是一项持续的研究工作,旨在为世界各地的研究人员提供易于访问的图像数据库。目前ImageNet中总共有14197122幅图像,总共分为21841个类别(synsets),大类别包括:amphibian、animal、appliance、bird、covering、device、fabric、fish、flower、food、fruit、fungus、furniture、geological formation、invertebrate、mammal、musical instrument、plant、reptile、sport、structure、tool、tree、utensil、vegetable、vehicle、person。

数据集下载

imagenet的下载方式如下:

imagenet数据集处理pytorch imagenet数据集有多大_人工智能_04


本次下载的数据集共3137张。

import os

imagenet_path = "./ImageNet"
print(len(os.listdir(imagenet_path)))

3137

import matplotlib.pyplot as plt
import cv2
%matplotlib inline

image_path = "./ImageNet/n02095314_261.png"

img = cv2.imread(image_path)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img)

imagenet数据集处理pytorch imagenet数据集有多大_imagenet_05

图像大小更正,相同大小

先查看目前的图片尺寸

image_path = "./ImageNet/n02095314_261.png"

img = cv2.imread(image_path)
print(img.shape)

(416, 400, 3)

image_path = "./ImageNet/n02095314_73.png"

img = cv2.imread(image_path)
print(img.shape)

可以看出目前的图片尺寸不同。

对该目录下所有图片进行修正尺寸。

src_path = "./ImageNet"
dst_path = "./ResizeImageNet/"
img_size = 224

for img_name in os.listdir(src_path):
    img_path = os.path.join(src_path,img_name)
    img = cv2.imread(img_path)
    img = cv2.resize(img,(img_size,img_size),interpolation=cv2.INTER_LINEAR )
    dst_img_path = dst_path + img_name
    cv2.imwrite(dst_img_path,img)

直方图的图像增强

图像增强主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来增加清晰。对比度增强有几种常用的方法,如线性变换、分段线性变换、伽马变换、直方图正规化、直方图均衡化、局部自适应直方图均衡化等。

在讲解图像增强的方法之前先来认识一下灰度直方图,灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。

# 读取图片
img_path = "./ResizeImageNet/n12985857_5691.png"
import cv2
import matplotlib.pyplot as plt
%matplotlib inline

# 绘制图像灰度直方图
def deaw_gray_hist(gray_img):
    '''
    :param  gray_img大小为[h, w]灰度图像
    '''
    # 获取图像大小
    h, w = gray_img.shape
    gray_hist = np.zeros([256])
    for i in range(h):
        for j in range(w):
            gray_hist[gray_img[i][j]] += 1
    x = np.arange(256)
    # 绘制灰度直方图
    plt.bar(x, gray_hist)
    plt.xlabel("gray Label")
    plt.ylabel("number of pixels")
    plt.show()

img = cv2.imread(img_path) # 这里需要指定一个 img_path
deaw_gray_hist(img[:,:,0])
img =  cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img)

imagenet数据集处理pytorch imagenet数据集有多大_人工智能_06


imagenet数据集处理pytorch imagenet数据集有多大_数据集_07


imagenet数据集处理pytorch imagenet数据集有多大_人工智能_08

# 对图像进行 线性变换
def linear_transform(img, a, b):
    '''
    :param img: [h, w, 3] 彩色图像
    :param a:  float  这里需要是浮点数,把图片uint8类型的数据强制转成float64
    :param b:  float
    :return: out = a * img + b
    '''
    out = a * img + b
    out[out > 255] = 255
    out = np.around(out)
    out = out.astype(np.uint8)
    return out
# a = 2, b=10
img = cv2.imread(img_path) # 这里需要指定一个 img_path
img = linear_transform(img, 2.0, 10)
deaw_gray_hist(img[:, :, 0])
img =  cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img)

imagenet数据集处理pytorch imagenet数据集有多大_人工智能_09


imagenet数据集处理pytorch imagenet数据集有多大_人工智能_10


选取100张图片进行此数据增强操作。

src_path = "./ResizeImageNet"
dst_path = "./Resize_Linear_ImageNet/"

i = 0
for img_name in os.listdir(src_path):
    img_path = os.path.join(src_path,img_name)
    img = cv2.imread(img_path)
    img = linear_transform(img, 2.0, 10)
    dst_img_path = dst_path + img_name
    cv2.imwrite(dst_img_path,img)
    i = i + 1
    if i == 100:
        break

imagenet数据集处理pytorch imagenet数据集有多大_数据集_11

# 对图像进行 均衡化
def equalize_transfrom(gray_img):
    return cv.equalizeHist(gray_img)

img = cv2.imread(img_path) # 这里需要指定一个 img_path
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
b_out = equalize_transfrom(b)
g_out = equalize_transfrom(g)
r_out = equalize_transfrom(r)
equa_out = np.stack((b_out, g_out, r_out), axis=-1)
deaw_gray_hist(equa_out[:, :, 0])
img =  cv2.cvtColor(equa_out,cv2.COLOR_BGR2RGB)
plt.imshow(img)

imagenet数据集处理pytorch imagenet数据集有多大_imagenet_12


imagenet数据集处理pytorch imagenet数据集有多大_数字图像处理技术_13


同样选取100张图片对其数据增强

src_path = "./ResizeImageNet"
dst_path = "./Resize_Equalize_ImageNet/"

i = 0
for img_name in os.listdir(src_path):
    img_path = os.path.join(src_path,img_name)
    img = cv2.imread(img_path)
    
    img = cv2.imread(img_path) # 这里需要指定一个 img_path
    b = img[:, :, 0]
    g = img[:, :, 1]
    r = img[:, :, 2]
    b_out = equalize_transfrom(b)
    g_out = equalize_transfrom(g)
    r_out = equalize_transfrom(r)
    img = np.stack((b_out, g_out, r_out), axis=-1)

    dst_img_path = dst_path + img_name
    cv2.imwrite(dst_img_path,img)
    i = i + 1
    if i == 100:
        break