python图像识别二分类(以2021MCM数学建模美赛C题为例,附全代码+思路)

模型构建

import os
from PIL import Image
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from keras import regularizers
from keras.layers.core import Dropout


def read_image(paths):
    os.listdir(paths)
    filelist = []
    for root, dirs, files in os.walk(paths):
        for file in files:
            if os.path.splitext(file)[1] == ".jpg":
                filelist.append(os.path.join(root, file))
    return filelist


path_1 = 'CNN/positive_copy/'
path_2 = 'CNN/negative_copy/'
filelist_1 = read_image(path_1)
filelist_2 = read_image(path_2)


def im_xiangsu(paths):
    filelist_temp = []
    for filename in paths:
        try:
            im = Image.open(filename)
            newim = im.resize((128, 128))
            filelist_temp.append(newim)
        except OSError as e:
            print(e.args)
    return filelist_temp


filelist_all = im_xiangsu(filelist_1) + im_xiangsu(filelist_2)


# image data into an array
def im_array(paths):
    M = []
    for filename in paths:
        im = filename
        im_L = im.convert("L")  # Pattern L
        Core = im_L.getdata()
        arr1 = np.array(Core, dtype='float32') / 255.0
        list_img = arr1.tolist()
        M.extend(list_img)
    return M


M = im_array(filelist_all)

# prepare training data
dict_label = {
     0: 'positive', 1: 'negative'}
train_images = np.array(M).reshape(len(filelist_all), 128, 128)
train_images = train_images[..., np.newaxis]

label = [0] * len(filelist_1) + [1] * len(filelist_2)
train_lables = np.array(label)

print('_______________________')
print(train_images.shape)
print(train_lables.shape)

# construct neural network
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1),
                        kernel_regularizer=regularizers.l2(0.01)))

# set pooling layer
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu', kernel_regularizer=regularizers.l2(0.01)))

model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu', kernel_regularizer=regularizers.l2(0.01)))


# reduce dimension
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu', kernel_regularizer=regularizers.l2(0.01)))
model.add(Dropout(0.75))
model.add(layers.Dense(2, activation='softmax', kernel_regularizer=regularizers.l2(0.01)))


# show the structure of the model

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

# set training times
model.fit(train_images, train_lables, epochs=2, validation_split=0.2)

# save the model as pd
model.save('my_model.h5')
print(model.summary())
tf.keras.models.save_model(model, 'CNN/models')
print("save model success!")

用模型进行分类

import os
from PIL import Image
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt


np.set_printoptions(threshold=np.inf)

# import the model
model = tf.keras.models.load_model('my_model.h5')
model.summary()

print("finish loading model!")
dict_label = {
     0: 'positive', 1: 'negative'}


def read_image(paths):
    os.listdir(paths)
    filelist = []
    for root, dirs, files in os.walk(paths):
        for file in files:
            if os.path.splitext(file)[1] == ".jpg":
                filelist.append(os.path.join(root, file))
    return filelist


def im_xiangsu(paths):
    filelist_temp = []
    for filename in paths:
        try:
            im = Image.open(filename)
            newim = im.resize((128, 128))
            filelist_temp.append(newim)
        except OSError as e:
            print(e.args)
    return filelist_temp


# image data into an array
def im_array(paths):
    M = []
    for filename in paths:
        im = filename
        im_L = im.convert("L")  # Pattern L
        Core = im_L.getdata()
        arr1 = np.array(Core, dtype='float32') / 255.0
        list_img = arr1.tolist()
        M.extend(list_img)
    return M


path_1 = 'CNN/positive/'
path_2 = 'CNN/negative/'
path_3 = 'CNN/unverified/'
filelist_1 = read_image(path_1)
filelist_2 = read_image(path_2)
filelist_3 = read_image(path_3)


def getresult(paths):

    filelist = read_image(paths)
    filelist_test = im_xiangsu(filelist)
    img = im_array(filelist_test)
    test_images = np.array(img).reshape(len(filelist_test), 128, 128)
    test_images = test_images[..., np.newaxis]
    predictions_single = model.predict(test_images)

    print(predictions_single)
    positive_number = 0
    negative_number = 0
    rate_sure = 0.0

    for i in range(len(filelist)):
        filename = filelist[i]
        if predictions_single[i][0] >= predictions_single[i][1]:
            positive_number += 1
            rate_sure += predictions_single[i][0] - predictions_single[i][1]
            im = Image.open(filelist[i])
            ss = filename[15:]
            im.save('CNN/positive/' + ss)
            # im.save('CNN/positive_copy/' + ss)

        else:
            negative_number += 1
            rate_sure += predictions_single[i][1] - predictions_single[i][0]
            im = Image.open(filelist[i])
            ss = filename[15:]
            im.save('CNN/negative/' + ss)
            # im.save('CNN/negative_copy/' + ss)

    rate_sure_average = rate_sure / len(predictions_single)  # the rate of negative

    return positive_number, negative_number, rate_sure_average


# do predict
exist_positive = len(filelist_1)
exist_negative = len(filelist_2)
predict_positive_number, predict_negative_number, predict_rate = getresult('CNN/unverified/')
all_negative = predict_negative_number + exist_negative
all_number = predict_positive_number + predict_negative_number + exist_positive + exist_negative
rate_final = all_negative / all_number
rate_accuracy_1 = (exist_positive + exist_negative) * 1.0
rate_accuracy_2 = (predict_positive_number + predict_negative_number) * predict_rate
rate_accuracy = rate_accuracy_2 / (predict_positive_number + predict_negative_number)

print(predict_positive_number)
print(predict_negative_number)
print(exist_positive)
print(exist_negative)
print('The total numbers of negative id is :' + str(all_negative))
print('The rate of the mistaken classification is : ' + str(rate_final * 100) + '%')
print('The accuracy of the model is : ' + str(rate_accuracy * 100) + '%')



思路分析

python图像识别二分类(以2021MCM数学建模美赛C题为例,附全代码+思路)_第1张图片

python图像识别二分类(以2021MCM数学建模美赛C题为例,附全代码+思路)_第2张图片
python图像识别二分类(以2021MCM数学建模美赛C题为例,附全代码+思路)_第3张图片
python图像识别二分类(以2021MCM数学建模美赛C题为例,附全代码+思路)_第4张图片

你可能感兴趣的:(python,数学建模,图像识别,图像处理,美国大学生数学建模竞赛)