基于深度学习的垃圾分类识别系统

目录

 

摘要

深度学习算法实现

垃圾分类识别系统

结束

摘要

随着我国经济的飞速发展,人民生活水平的提高,生活垃圾的产生量也急剧增加。垃圾种类繁多,材质、颜色和外形各异,而且在不同地域和不同场景下的类别划分差异也很大。比如有按干/湿划分类别的,有按可燃/不可燃划分类别的等。人工智能技术的发展使得自动识别垃圾种类成为可能。但是,因为垃圾种类众多,所收集的垃圾数据集存在极大的平衡性。为了解决这一问题,因此,本次博客探索了将焦点损失函数应用于多层卷积神经网络的垃圾识别中。并将训练好的模型加载到web应用中,实现一个简单的垃圾图像的识别与分类系统界面。

深度学习算法实现

卷积神经网络:

此次又用了CNN,原因很简单,容易实现。哈哈....

焦点损失函数(Focal Loss):

焦点损失函数 (Focal Loss)在2017年被提出,被应用于密集物体检测任务。在该任务下的背景类别不平衡(Extreme foreground-background class imbalance)是提出该损失函数的一个重要原因。作者通过重塑标准交叉熵损失解决了这一类不平衡问题,从而降低分配给分类示例的损失。该论文提出的焦点损失(Focal Loss)方法将训练集中在一系列难点上,并且防止了大量的负面例子在训练过程中阻碍探测器学习。正是因为Focal Loss可以解决样本的不平衡问题。因此,很多人将此方法应用到不同问题的解决上。其公式如下:

公式可以自行查看原文推导。焦点损失函数旨在通过降低内部加权(简单样本)来解决类别不平衡问题,这样即使简单样本的数量很大,但它们对总损失的贡献却很小。也就是说,该函数侧重于用困难样本稀疏的数据集来训练。focal loss 有两个可调的参数。焦点参数γ(gamma)平滑地调整简单样本被加权的速率。当γ= 0时, focal loss 效果与交叉熵函数相同,并且随着 γ 增加,调制因子的影响同样增加(γ = 2在实验中表现的效果最好)。α(alpha):平衡focal loss ,相对于非 α 平衡形式可以略微提高它的准确度。

因为我们是多分类任务,所以focal loss代码实现为:

def categorical_focal_loss(gamma=2.0, alpha=0.25):
    def focal_loss(y_true, y_pred):
        # Define epsilon so that the backpropagation will not result in NaN
        # for 0 divisor case
        epsilon = K.epsilon()
        # Add the epsilon to prediction value
        # y_pred = y_pred + epsilon
        # Clip the prediction value
        y_pred = K.clip(y_pred, epsilon, 1.0 - epsilon)
        # Calculate cross entropy
        cross_entropy = -y_true * K.log(y_pred)
        # Calculate weight that consists of  modulating factor and weighting factor
        weight = alpha * y_true * K.pow((1 - y_pred), gamma)
        # Calculate focal loss
        loss = weight * cross_entropy
        # Sum the losses in mini_batch
        loss = K.sum(loss, axis=1)
        return loss
    return focal_loss

核心代码实现:

def cnn_model(input_shape, num_classes):
    # create model
    model = Sequential()
    model.add(Conv2D(96, kernel_size=11, strides=4, activation='relu', input_shape=input_shape))
    model.add(MaxPooling2D(pool_size=3, strides=2))
    model.add(Conv2D(256, kernel_size=5, strides=1, activation='relu'))
    model.add(MaxPooling2D(pool_size=3, strides=2))
    model.add(Conv2D(384, kernel_size=3, strides=1, activation='relu'))
    model.add(Conv2D(384, kernel_size=3, strides=1, activation='relu'))
    model.add(Conv2D(256, kernel_size=3, strides=1, activation='relu'))
    model.add(MaxPooling2D(pool_size=3, strides=2))

    model.add(Flatten())
    model.add(Dropout(0.5))
    model.add(Dense(4096))
    model.add(Activation(lambda x: K.relu(x, alpha=1e-3)))
    model.add(Dropout(0.5))
    model.add(Dense(4096))
    model.add(Activation(lambda x: K.relu(x, alpha=1e-3)))
    model.add(Dense(num_classes, activation="softmax"))
    model.compile(optimizer='adam', loss=focal_loss, metrics=['accuracy'])

    return model

垃圾分类识别系统

实现环境与依赖库:

python3.6 ,Flask,Keras, Keras-Applications, Keras-Preprocessing, tensorflow等;

app.py代码结构:

app.py代码下加载训练好的模型,实现语句为:

MODEL_PATH = 'cnn_model.h5'
model = load_model(MODEL_PATH,compile = False)#, compile = False
model._make_predict_function()          # Necessary

然后对上传的图像进行预处理,并返回输出:

def model_predict(img_path, model):
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    # Be careful how your trained model deals with the input
    x = preprocess_input(x, mode='caffe')
    preds = model.predict(x)
    return preds

 最后便是常用的GET和POST方法实现页面的显示。

实现界面测试:

界面显示如下:左下为上传图片并实现预测,右边为垃圾分类相关的科普知识。

点击科普知识,进入百度百科:

点击选择图像,可以进行图像的选择,并输出预测结果:

 结束

      这次只是简单的实现了应用flask加载深度学习模型,并将预测的返回结果输出到显示页面。下一步将尝试更为复杂的系统页面功能,如果大家有相关建议或者对这个实现这个功能有想法可以加Q:525894654。深度学习方法上,尝试实现ResNet50进行更多种类的垃圾分类。

原创文章 53 获赞 252 访问量 20万+

猜你喜欢

转载自blog.csdn.net/weixin_40651515/article/details/105804557