1.数据集的准备:

链接:https://pan.baidu.com/s/1rNmb_nxsBnoZqXT6pjsO-Q
提取码:0wmi

2.requirements.txt文件:

直接:pip install requirements.txt
链接:https://pan.baidu.com/s/1VcUOZtDyXlN5F-_kDudDJw
提取码:xpk3

3.文件结构:

在这里插入图片描述

4.预测效果:

在这里插入图片描述

5.首先普通的训练:

(1)导入相关的库函数:

import os
import cv2
import time
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras import layers
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau
from tensorflow.keras.layers import Dense,Dropout,Flatten,BatchNormalization,Conv2D,MaxPool2D

(2)相关的变量的初始化:

#设置类别数,我们这里只训练了狗这个类别
num_classes=1
batch_size=4
img_h,img_w=224,224
#文件路径
train_data_dir='images/train'
valid_data_dir='images/valid'

(3)数据增强和导入文件:

#数据增强,对图像进行归一化
train_datagen=ImageDataGenerator(rescale=1./255)
validation_datagen=ImageDataGenerator(rescale=1./255)
#导入要训练的和验证文件中的数据
train_generate=train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_h,img_w),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=True
)

validation_generate=validation_datagen.flow_from_directory(
    valid_data_dir,
    target_size=(img_h,img_w),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=True
)

(4)模型定义:

#模型定义
model=tf.keras.Sequential([
    #输入图像大小的设置
    layers.InputLayer(input_shape=(img_h,img_w,3)),

    layers.Conv2D(32,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    layers.Conv2D(32,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.MaxPool2D(pool_size=[2,2]),

    layers.Conv2D(64,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    layers.Conv2D(64,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.MaxPool2D(pool_size=[2,2]),

    layers.Conv2D(128,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    # layers.Flatten(),
    layers.GlobalAveragePooling2D(),
    layers.Dense(64),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.Dropout(0.5),

    layers.Dense(64),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.Dropout(0.5),

    layers.Dense(num_classes),
    layers.Activation('softmax'),
])

(5)相关回调函数定义:

#打印模型细节查看
model.summary()

#保存最优的模型
checkpoing=ModelCheckpoint(
    'model/recognitionDog.h5',
    monitor='val_loss',
    mode='min',
    save_best_only=True,
    save_weights_only=False,
    verbose=1
)
#当经过5代之后,验证集的损失值没有下降就提前终止训练
earlystop=EarlyStopping(
    monitor='val_loss',
    min_delta=0,
    patience=5,
    verbose=1,
    restore_best_weights=True
)
#当经过3代的训练之后验证集的损失值没有下降就学习衰减率
reduce_lr=ReduceLROnPlateau(
    monitor='val_loss',
    factor=0.8,
    patience=3,
    verbose=1,
    min_delta=0.0001
)

callbacks=[earlystop,checkpoing,reduce_lr]

(6)开始训练:

model.compile(
    loss='categorical_crossentropy',optimizer=Adam(lr=0.01),metrics=['accuracy']
)

epochs=20
history=model.fit(
    train_generate,
    steps_per_epoch=train_generate.n//batch_size,
    epochs=epochs,
    callbacks=callbacks,
    validation_data=validation_generate,
    validation_steps=validation_generate.n//batch_size
)

(7)画图:

x=range(1,len(history.history['accuracy'])+1)
plt.plot(x,history.history['accuracy'])
plt.plot(x,history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.xticks(x)
plt.legend(['Train','Val'],loc='upper left')
plt.savefig(fname='inception_v3.png',figsize=[10,10])
plt.show()

6.迁移学习训练:

(1)导入相关的库函数:

import os
import cv2
import time
import tensorflow
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras import layers
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau
from tensorflow.keras.layers import Dense,Dropout,Flatten,BatchNormalization,Conv2D,MaxPool2D

(2)相关的变量的初始化:

#设置类别数,我们这里只训练了狗这个类别
num_classes=1
batch_size=4
img_h,img_w=224,224
train_data_dir='images/train'
valid_data_dir='images/valid'

(3)数据增强和导入文件:

#数据增强,对图像进行归一化
train_datagen=ImageDataGenerator(rescale=1./255)
validation_datagen=ImageDataGenerator(rescale=1./255)
#导入要训练的和验证文件中的数据
train_generate=train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_h,img_w),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=True
)

validation_generate=validation_datagen.flow_from_directory(
    valid_data_dir,
    target_size=(img_h,img_w),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=True
)

(4)迁移学习模型定义:

#模型定义
model_inception_v3=tensorflow.keras.applications.inception_v3.InceptionV3(weights='imagenet',include_top=False)
x=model_inception_v3.output
x=layers.GlobalAveragePooling2D()(x)
x=layers.Dense(1024,activation='relu')(x)
predications=layers.Dense(num_classes,activation='softmax')(x)
model_inception_V3=Model(inputs=model_inception_v3.input,outputs=predications)

#冻结住所有的层,因为我们这里的数据集很少,所以需要冻结这里的所有层
for layer in model_inception_V3.layers:
    layer.trainable=False

#打印模型细节查看
model_inception_V3.summary()

(5)相关回调函数定义:

#保存最优的模型
checkpoing=ModelCheckpoint(
    'model/recognitionDog_InceptionV3.h5',
    monitor='val_loss',
    mode='min',
    save_best_only=True,
    save_weights_only=False,
    verbose=1
)
#当经过5代之后,验证集的损失值没有下降就提前终止训练
earlystop=EarlyStopping(
    monitor='val_loss',
    min_delta=0,
    patience=5,
    verbose=1,
    restore_best_weights=True
)
#当经过3代的训练之后验证集的损失值没有下降就学习衰减率
reduce_lr=ReduceLROnPlateau(
    monitor='val_loss',
    factor=0.8,
    patience=3,
    verbose=1,
    min_delta=0.0001
)

callbacks=[earlystop,checkpoing,reduce_lr]

(6)开始训练:

epochs=20
history=model_inception_V3.fit(
    train_generate,
    steps_per_epoch=train_generate.n//batch_size,
    epochs=epochs,
    callbacks=callbacks,
    validation_data=validation_generate,
    validation_steps=validation_generate.n//batch_size
)

(7)画图:

x=range(1,len(history.history['accuracy'])+1)
plt.plot(x,history.history['accuracy'])
plt.plot(x,history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.xticks(x)
plt.legend(['Train','Val'],loc='upper left')
plt.savefig(fname='inception_v3.png',figsize=[10,10])
plt.show()

7.前端文件:

可以参考我这篇文章:
https://mydreamambitious.blog.csdn.net/article/details/123405384
注意:因为我这里训练的是一个类别,所以前端文件中的一些地方需要修改:
在这里插入图片描述
修改地方如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
修改如下:
在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐