# 加载函数库
import numpy as np
import pandas as pd
from PIL import Image
import matplotlib.pyplot as plt
import os
import itertools
# 显示配置
plt.rcParams['font.family']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 加载数据
imgFile = "./images/4_20.jpg"
img = Image.open(imgFile)
plt.figure(figsize=(8,8))
plt.imshow(img)
plt.title('水色样本 '+imgFile+' 分辨率为'+str(img.size)+" 类别标签 "+str(imgFile[9]))
plt.show()
# 我们需要选取仅包括水样的图像部分来进行分析
size = 100
cx, cy = (int(i/2) for i in img.size)
plt.figure(figsize=(8,8))
plt.imshow(img)
plt.plot([cx-50, cx+50], [cy+50, cy+50], 'r', linewidth=2)
plt.plot([cx+50, cx+50], [cy-50, cy+50], 'r', linewidth=2)
plt.plot([cx-50, cx+50], [cy-50, cy-50], 'r', linewidth=2)
plt.plot([cx-50, cx-50], [cy-50, cy+50], 'r', linewidth=2)
plt.annotate('选取的水样窗口', xy=(cx+50,cy-50), xytext=(cx+300, cy-300),
arrowprops=dict(facecolor='black', shrink=0.1))
plt.title('水色样本 '+imgFile+' 分辨率为'+str(img.size)+" 类别标签 "+str(imgFile[9]))
plt.show()
# 看起来对于基于典型机器学习的分类模型来说,100x100的图像将提供10000个特征用于建模 - 特征数量无疑是够用了,
# 甚至远远超过数据样本的数量。这意味着模型可能存在过拟合的风险。后续我们做分析的时候需要注意!
# 除此以外,我们可能还要关注另外一些问题:
# 是否存在一些尺寸特别小的图像,找出选取的水样窗口出错?
# 是否选取的水样窗口一定不会包括“非水样”部分?
# 上述两个问题其实是相关的,也就是我们需要快速的对图像数据进行分析,看看选取水样窗口的方式是否会造成有偏差的数据?我们可以进一步对数据进行检查;比如:
# 查看全体图像数据的尺寸分布
# 查看选取的水样窗口的像素值标准差(二阶)
# 加载图像统计信息模块(注:也可以直接通过颜色通道来计算)
from PIL import ImageStat
# 遍历全体图像进行快速检查
size = 100
imgPath = './images'
imgWidth = [] # 图像宽度
imgHeight = [] # 图像高度
imgRrange = [] # 图像红色通道极差
imgGrange = [] # 图像绿色通道极差
imgBrange = [] # 图像蓝色通道极差
newImgs = [] # 获得选取后的图像作为模型训练和验证数据
imgFiles = os.listdir(imgPath)
for imgFile in imgFiles:
img = Image.open(os.path.join(imgPath, imgFile))
imgWidth.append(img.size[0])
imgHeight.append(img.size[1])
# 获得图像中心区域大小为size的图像块
cx, cy = (int(i / 2) for i in img.size)
box = (cx - 50, cy - 50, cx + 50, cy + 50)
region = img.crop(box)
# 计算选取图像块的标准差
stat = ImageStat.Stat(region)
imgRrange.append(stat.extrema[0][1] - stat.extrema[0][0])
imgGrange.append(stat.extrema[1][1] - stat.extrema[1][0])
imgBrange.append(stat.extrema[2][1] - stat.extrema[2][0])
newImgs.append(region)
plt.figure(figsize=(12,6))
plt.subplot(121)
plt.plot(imgWidth, imgHeight, 'r*')
plt.grid()
plt.xlabel('图像宽度x')
plt.ylabel('图像高度y')
plt.title('图像分辨率分布 ('+str(len(imgFiles))+'张)')
plt.subplot(122)
plt.plot(imgRrange,'r*')
plt.plot(imgGrange,'g*')
plt.plot(imgBrange,'b*')
plt.grid()
plt.xlabel('图像张数')
plt.ylabel('像素极差')
plt.xlim([-1, 205])
plt.title('图像极差分布 ('+str(len(imgFiles))+'张)')
plt.show()
# 关注可能的异常数据
plt.figure(figsize=(12, 6))
iB = np.array(imgBrange)
nFiles = np.where(iB > 65)[0]
for i, j in enumerate(nFiles):
imgFile = imgFiles[j]
img = Image.open(os.path.join(imgPath, imgFile))
plt.subplot(1, len(nFiles), i + 1)
plt.imshow(img)
cx, cy = (int(i / 2) for i in img.size)
plt.plot([cx - 50, cx + 50], [cy + 50, cy + 50], 'r', linewidth=2)
plt.plot([cx + 50, cx + 50], [cy - 50, cy + 50], 'r', linewidth=2)
plt.plot([cx - 50, cx + 50], [cy - 50, cy - 50], 'r', linewidth=2)
plt.plot([cx - 50, cx - 50], [cy - 50, cy + 50], 'r', linewidth=2)
plt.annotate('选取的水样窗口', xy=(cx + 50, cy - 50), xytext=(cx + 300, cy - 300),
arrowprops=dict(facecolor='black', shrink=0.1))
plt.title('水色样本 ' + imgFile + ' 分辨率为' + str(img.size) + " 类别标签 " + str(imgFile[0]))
plt.show()
from numpy import random
rc = random.choice(np.arange(len(newImgs)),9)
plt.figure(figsize=(12,12))
for i, j in enumerate(rc):
print(rc," ",i," ",j)
plt.subplot(3,3,i+1)
plt.imshow(newImgs[j])
plt.title('水色样本 '+imgFiles[j]+" 类别标签 "+str(imgFile[0]))
plt.show()
# 构建训练数据集和分类标签
data = []
dy = []
for i, img in enumerate(newImgs):
r, g, b = np.split(np.array(img), 3, axis=2)
# 计算一阶矩
r_m1 = np.mean(r)
g_m1 = np.mean(g)
b_m1 = np.mean(b)
# 二阶矩
r_m2 = np.std(r)
g_m2 = np.std(g)
b_m2 = np.std(b)
# 三阶矩
r_m3 = np.mean(abs(r - r.mean()) ** 3) ** (1 / 3)
g_m3 = np.mean(abs(g - g.mean()) ** 3) ** (1 / 3)
b_m3 = np.mean(abs(b - b.mean()) ** 3) ** (1 / 3)
# 构造新数据集
df = np.array([r_m1, g_m1, b_m1, r_m2, g_m2, b_m2, r_m3, g_m3, b_m3])
data.append(df)
# 保存对应的分类标签
dy.append(int(imgFiles[i][0]))
dy = np.array(dy)
data = pd.DataFrame(np.array(data))
data.info()
print(data.head())
# 数据变换 - 采用L2-Norm/Z-score
# dataNorm = pd.DataFrame(preprocessing.normalize(data,norm='l2'))
dataNorm = (data - data.mean(axis=0))/(data.std(axis=0))
dataNorm.head()
# 2. 建模分析和性能评估
# 采用支持向量机(svm)来创建分类模型,将水样分为5个不同的类别;并评估模型的性能
# 分割数据为训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(dataNorm, dy, test_size=0.2, stratify=dy, random_state=2023)
# 导入svm分类模型并训练
from sklearn import svm
model = svm.SVC(C=200, gamma='auto') # 特别注意C值的选取
model.fit(X_train, y_train)
print("SVM模型在训练集上的准确率为", round(model.score(X_train, y_train),3))
# 评估模型在测试集上性能
from sklearn.metrics import confusion_matrix, accuracy_score
y_pred = model.predict(X_test)
print("SVM模型在测试集上的准确率为", round(accuracy_score(y_test, y_pred),3))
print("SVM模型在测试集上的混淆矩阵为\n",confusion_matrix(y_test, y_pred))
def plot_confusion_matrix(cm, classes,
normalize=False,
title='Confusion matrix',
cmap=plt.cm.Blues):
"""
This function prints and plots the confusion matrix.
Normalization can be applied by setting `normalize=True`.
"""
if normalize:
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
print("Normalized confusion matrix")
else:
print('Confusion matrix, without normalization')
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=0)
plt.yticks(tick_marks, classes)
fmt = '.2f' if normalize else 'd'
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, format(cm[i, j], fmt),
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")
plt.ylabel('Label')
plt.xlabel('Prediction')
plt.tight_layout()
plt.show()
# 进一步可视化混淆矩阵
cnf_matrix = confusion_mat
没有合适的资源?快使用搜索试试~ 我知道了~
图像分类检测数据集图像分类检测数据集
共213个文件
jpg:203个
xml:5个
环境:1个
需积分: 4 8 下载量 133 浏览量
2023-06-28
09:45:19
上传
评论 1
收藏 156.13MB RAR 举报
温馨提示
图像分类检测数据集
资源推荐
资源详情
资源评论
收起资源包目录
图像分类检测数据集图像分类检测数据集 (213个子文件)
.gitignore 50B
基于水质的水色图像分类-高质量精讲.iml 491B
3_67.jpg 1.27MB
3_64.jpg 1.24MB
3_70.jpg 1.23MB
3_61.jpg 1.21MB
2_11.jpg 1.16MB
4_16.jpg 1.13MB
3_6.jpg 1.11MB
3_63.jpg 1.09MB
1_50.jpg 1.09MB
3_62.jpg 1.08MB
3_68.jpg 1.07MB
4_23.jpg 1.07MB
3_69.jpg 1.07MB
4_18.jpg 1.07MB
4_20.jpg 1.07MB
2_16.jpg 1.07MB
3_60.jpg 1.06MB
4_5.jpg 1.06MB
4_4.jpg 1.05MB
4_19.jpg 1.05MB
3_41.jpg 1.05MB
1_29.jpg 1.05MB
4_24.jpg 1.05MB
4_2.jpg 1.04MB
4_22.jpg 1.04MB
4_1.jpg 1.03MB
4_8.jpg 1.03MB
3_4.jpg 1.03MB
4_15.jpg 1.02MB
3_54.jpg 1.02MB
3_39.jpg 1.02MB
4_3.jpg 1.02MB
3_33.jpg 1.02MB
3_37.jpg 1.01MB
3_24.jpg 1.01MB
3_1.jpg 1.01MB
2_25.jpg 1.01MB
3_35.jpg 1.01MB
3_36.jpg 1.01MB
4_12.jpg 1.01MB
4_17.jpg 1MB
3_2.jpg 1MB
3_38.jpg 1023KB
3_3.jpg 1021KB
3_7.jpg 1020KB
3_34.jpg 1020KB
3_42.jpg 1017KB
1_31.jpg 1016KB
3_21.jpg 1015KB
3_57.jpg 1014KB
3_56.jpg 1013KB
4_21.jpg 1012KB
4_11.jpg 1000KB
3_5.jpg 997KB
2_43.jpg 997KB
3_43.jpg 994KB
4_13.jpg 989KB
3_55.jpg 987KB
3_66.jpg 985KB
3_40.jpg 984KB
3_44.jpg 983KB
4_9.jpg 970KB
3_51.jpg 962KB
3_59.jpg 961KB
1_40.jpg 961KB
2_23.jpg 960KB
1_16.jpg 955KB
2_21.jpg 942KB
3_32.jpg 942KB
3_22.jpg 940KB
2_42.jpg 939KB
3_58.jpg 937KB
1_18.jpg 937KB
4_14.jpg 931KB
1_20.jpg 925KB
2_24.jpg 922KB
3_52.jpg 917KB
3_78.jpg 914KB
3_26.jpg 904KB
3_53.jpg 900KB
3_23.jpg 895KB
1_21.jpg 886KB
3_76.jpg 885KB
1_2.jpg 861KB
3_25.jpg 859KB
1_19.jpg 850KB
1_30.jpg 843KB
2_15.jpg 841KB
1_37.jpg 838KB
2_22.jpg 829KB
1_23.jpg 824KB
3_77.jpg 822KB
1_48.jpg 822KB
3_27.jpg 821KB
1_47.jpg 820KB
1_22.jpg 813KB
1_49.jpg 812KB
1_24.jpg 804KB
共 213 条
- 1
- 2
- 3
资源评论
程序员奇奇
- 粉丝: 3w+
- 资源: 295
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功