Python图像识别实战(五):卷积神经网络CNN模型图像二分类预测结果评价(附源码和实现效果)

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用,分为分类问题(预测值是离散型)和回归问题(预测值是连续型)(具体见之前的文章)。

从本期开始,我将做一个关于图像识别的系列文章,让读者慢慢理解python进行图像识别的过程、原理和方法,每一篇文章从实现功能、实现代码、实现效果三个方面进行展示。

实现功能:

卷积神经网络CNN模型图像二分类预测结果评价

实现代码:

import os

from PILimport Image

import numpyas np

import matplotlib.pyplotas plt

import tensorflowas tf

from tensorflow.kerasimport datasets, layers, models

from collectionsimport Counter

from sklearn.metricsimport precision_recall_curve

from sklearn.metricsimport roc_curve, auc

from sklearn.metricsimport roc_auc_score

import itertools

from pylabimport mpl

import seabornas sns

class Solution():

#==================读取图片=================================

    def read_image(self,paths):

os.listdir(paths)

filelist = []

for root, dirs, filesin os.walk(paths):

for filein files:

if os.path.splitext(file)[1] ==".png":

filelist.append(os.path.join(root, file))

print(filelist)

return filelist

#==================图片数据转化为数组==========================

    def im_array(self,paths):

M=[]

for filenamein paths:

im=Image.open(filename)

im_L=im.convert("L")#模式L

            Core=im_L.getdata()

arr1=np.array(Core,dtype='float32')/255.0

            list_img=arr1.tolist()

M.extend(list_img)

return M

def CNN_model(self,train_images, train_lables):

# ============构建卷积神经网络并保存=========================

        model = models.Sequential()

model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1)))# 过滤器个数,卷积核尺寸,激活函数,输入形状

        model.add(layers.MaxPooling2D((2, 2)))# 池化层

        model.add(layers.Conv2D(64, (3, 3), activation='relu'))

model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(64, (3, 3), activation='relu'))

model.add(layers.Flatten())# 降维

        model.add(layers.Dense(64, activation='relu'))# 全连接层

        model.add(layers.Dense(2, activation='softmax'))# 注意这里参数,我只有两类图片,所以是2.

        model.summary()# 显示模型的架构

        model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

return model

if __name__=='__main__':

Object1=Solution()

# =================数据读取===============

    path1="D:\DCTDV2\dataset\\train\\"

    test1 ="D:\DCTDV2\dataset\\test\\"

    pathDir = os.listdir(path1)

print(pathDir)

pathDir=pathDir[1:5]

print(pathDir)

for ain pathDir:

path2=path1+a

test2=test1+a

filelist_1=Object1.read_image(path1+"Norm")

filelist_2=Object1.read_image(path2)

filelist_all=filelist_1+filelist_2

M=Object1.im_array(filelist_all)

train_images=np.array(M).reshape(len(filelist_all),128,128)#输出验证一下(400, 128, 128)

        label=[0]*len(filelist_1)+[1]*len(filelist_2)

train_lables=np.array(label)#数据标签

        train_images = train_images[..., np.newaxis]#数据图片

        print(train_images.shape)#输出验证一下(400, 128, 128, 1)

        print(train_lables.shape)

# ===================准备测试数据==================

        filelist_1T = Object1.read_image(test1+"Norm")

filelist_2T = Object1.read_image(test2)

filelist_allT = filelist_1T + filelist_2T

print(filelist_allT)

N = Object1.im_array(filelist_allT)

dict_label = {0:'norm', 1:'IgaK'}

test_images = np.array(N).reshape(len(filelist_allT), 128, 128)

label = [0] *len(filelist_1T) + [1] *len(filelist_2T)

test_lables = np.array(label)# 数据标签

        test_images = test_images[..., np.newaxis]# 数据图片

        print(test_images.shape)# 输出验证一下(100, 128, 128, 1)

        print(test_lables.shape)

# #===================训练模型=============

        model=Object1.CNN_model(train_images, train_lables)

CnnModel=model.fit(train_images, train_lables, epochs=20)

# model.save('D:\电池条带V2\model\my_model.h5')  # 保存为h5模型

        # tf.keras.models.save_model(model,"F:\python\moxing\model")#这样是pb模型

        print("模型保存成功!")

# history列表

        print(CnnModel.history.keys())

font = {'family':'Times New Roman','size':12,}

sns.set(font_scale=1.2)

plt.plot(CnnModel.history['loss'])

plt.title('model loss')

plt.ylabel('loss')

plt.xlabel('epoch')

plt.savefig('D:\\DCTDV2\\result\\V1\\loss' +"\\" +'%s.tif' % a,bbox_inches='tight',dpi=600)

plt.show()

plt.plot(CnnModel.history['accuracy'])

plt.title('model accuracy')

plt.ylabel('accuracy')

plt.xlabel('epoch')

plt.savefig('D:\\DCTDV2\\result\\V1\\accuracy' +"\\" +'%s.tif' % a,bbox_inches='tight',dpi=600)

plt.show()

# #===================预测图像=============

        predict_label=[]

prob_label=[]

for iin test_images:

i=np.array([i])

predictions_single=model.predict(i)

print(np.argmax(predictions_single))

out_c_1 = np.array(predictions_single)[:, 1]

prob_label.extend(out_c_1)

predict_label.append(np.argmax(predictions_single))

print(prob_label)

print(predict_label)

print(list(test_lables))

count = Counter(predict_label)

print(count)

TP = FP = FN = TN =0

        for iin range(len(predict_label)):

if predict_label[i]==1:

if list(test_lables)[i]==1:

TP=TP+1

                elif list(test_lables)[i]==0:

FP=FP+1

            elif predict_label[i]==0:

if list(test_lables)[i]==1:

FN=FN+1

                elif list(test_lables)[i]==0:

TN=TN+1

        print(TP,FP,FN,TN)

deathc_recall=TP/(TP+FN)

savec_recall=TN/(FP+TN)

print(deathc_recall)

print(savec_recall)

print("--------------------")

cm = np.arange(4).reshape(2, 2)

cm[0, 0] = TN

cm[0, 1] = FP

cm[1, 0] = FN

cm[1, 1] = TP

classes = [0, 1]

plt.figure()

plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)

plt.title('Confusion matrix')

tick_marks = np.arange(len(classes))

plt.xticks(tick_marks, classes, rotation=0)

plt.yticks(tick_marks, classes)

thresh = cm.max() /2.

        for i, jin itertools.product(range(cm.shape[0]), range(cm.shape[1])):

plt.text(j, i, cm[i, j], horizontalalignment="center", color="red" if cm[i, j] > threshelse "black")

plt.tight_layout()

plt.ylabel('True label')

plt.xlabel('Predicted label')

plt.savefig('D:\\DCTDV2\\result\\V1\\cm' +"\\" +'%s.tif' % a,bbox_inches='tight',dpi=600)

plt.show()

fpr, tpr, thresholds = roc_curve(list(test_lables), prob_label, pos_label=1)

Auc_score = roc_auc_score(list(test_lables), predict_label)

Auc = auc(fpr, tpr)

print(Auc_score, Auc)

plt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % Auc)# 生成ROC曲线

        plt.legend(loc='lower right')

plt.plot([0, 1], [0, 1], 'r--')

plt.xlim([0, 1])

plt.ylim([0, 1])

plt.ylabel('True positive rate')

plt.xlabel('False positive rate')

plt.savefig('D:\\DCTDV2\\result\\V1\\roc' +"\\" +'%s.tif' % a,bbox_inches='tight',dpi=600)

plt.show()

plt.figure()

precision, recall, thresholds = precision_recall_curve(list(test_lables), predict_label)

plt.title('Precision/Recall Curve')# give plot a title

        plt.xlabel('Recall')# make axis labels

        plt.ylabel('Precision')

plt.plot(precision, recall)

plt.savefig('D:\\DCTDV2\\result\\V1\\pr' +"\\" +'%s.tif' % a,bbox_inches='tight',dpi=600)

plt.show()

实现效果:

由于数据为非公开数据,仅展示几个图像的效果,有问题可以后台联系我。

本人读研期间发表5篇SCI数据挖掘相关论文,现在在某研究院从事数据挖掘相关工作,对数据挖掘有一定的认知和理解,会不定期分享一些关于python机器学习、深度学习、数据挖掘基础知识与案例。 致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。 关注V订阅号:数据杂坛可在后台联系我获取相关数据集和源码,送有关数据分析、数据挖掘、机器学习、深度学习相关的电子书籍。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容