基于卷积神经网络模型开发构建国内大规模鸟类图像识别分析系统

鸟类图像数据相关的开发实践在我们前面的博文中有不少项目实践,感兴趣的话可以自行移步阅读:

《基于轻量级YOLOv5模型开发构建200种鸟类细粒度检测识别分析系统》

《基于轻量级YOLOv5开发构建鸟类检测识别分析系统》

《基于轻量级神经网络GhostNet开发构建的200种鸟类细粒度识别分析系统》

前面这些相关的实践大都是基于同一批的数据集开发构建的,另外,鸟类数据的采集大都来自于国外,那么对于我们国内的种类繁多的鸟类是否也能够开发构建相关的工作呢?答案肯定是可以的,本文的核心思想就是想要自主构建大规模的国内鸟类图像数据,进而在鸟类数据的基础上开发构建鸟类识别分析系统。

首先来看下整体效果图:

还可以基于PyQT来实现更加漂亮界面的开发

对于每一位鸟类爱好人士来说可能都会有一个灵魂问题:“中国到底有多少种鸟类?”

这是一个很难回答的问题,或者说这是一个需要去相对回答的问题:

基于卷积神经网络模型开发构建国内大规模鸟类图像识别分析系统_第1张图片

因为随着时间的变化,鸟类的种类也在发生着变化,就目前搜索统计到的资料来说,比较统一的口径就是中国目前的鸟类种类数量在1491种。

前面讲到这里我们首先的第一阶段工作就是要去逐步开发采集构建基础数据库,这是一个非常庞大的工作,对于我们来说也只能循序渐进,逐阶段分批次推进基础数据库的构建,下面来简单看下目前构建的情况:

基于卷积神经网络模型开发构建国内大规模鸟类图像识别分析系统_第2张图片

简单看下数据实例:

【斑嘴鸭】

基于卷积神经网络模型开发构建国内大规模鸟类图像识别分析系统_第3张图片

【白头翁】

基于卷积神经网络模型开发构建国内大规模鸟类图像识别分析系统_第4张图片

【扁嘴海雀】

基于卷积神经网络模型开发构建国内大规模鸟类图像识别分析系统_第5张图片

【臧雀】

基于卷积神经网络模型开发构建国内大规模鸟类图像识别分析系统_第6张图片

【赤胸鹀】

基于卷积神经网络模型开发构建国内大规模鸟类图像识别分析系统_第7张图片

眼花缭乱,不得不说,构建数据集的过程中的确是打开眼界,原来我以为自己见过很多鸟类了,没想到连冰山一角都算不上的,回头打算刷一刷动物世界鸟类篇了。

这里模型选择是基于resnet50来实现目前阶段已经构建的鸟类识别数据集的开发训练,模型核心代码实现如下所示:

from tensorflow.keras import *
from tensorflow.keras.layers import *
from tensorflow.keras.models import *


def identity(input_tensor, kernel_size, filters, stage):
    filters1, filters2, filters3 = filters
    x = Conv2D(filters1, (1, 1))(input_tensor)
    x = BatchNormalization()(x)
    x = Activation("relu")(x)
    x = Conv2D(filters2, kernel_size, padding="same")(x)
    x = BatchNormalization()(x)
    x = Activation("relu")(x)
    x = Conv2D(filters3, (1, 1))(x)
    x = BatchNormalization()(x)
    x = layers.add([x, input_tensor])
    x = Activation("relu")(x)
    return x


def convBlock(input_tensor, kernel_size, filters, stage, strides=(2, 2)):
    filters1, filters2, filters3 = filters
    x = Conv2D(filters1, (1, 1), strides=strides)(input_tensor)
    x = BatchNormalization()(x)
    x = Activation("relu")(x)
    x = Conv2D(filters2, kernel_size, padding="same")(x)
    x = BatchNormalization()(x)
    x = Activation("relu")(x)
    x = Conv2D(filters3, (1, 1))(x)
    x = BatchNormalization()(x)
    shortcut = Conv2D(filters3, (1, 1), strides=strides)(input_tensor)
    shortcut = BatchNormalization()(shortcut)
    x = layers.add([x, shortcut])
    x = Activation("relu")(x)
    return x


def ResNet50(input_shape=[224, 224, 3], classes=1000):
    img_input = Input(shape=input_shape)
    x = ZeroPadding2D((3, 3))(img_input)
    x = Conv2D(64, (7, 7), strides=(2, 2), name="conv1")(x)
    x = BatchNormalization(name="bn_conv1")(x)
    x = Activation("relu")(x)
    x = MaxPooling2D((3, 3), strides=(2, 2))(x)
    x = convBlock(x, 3, [64, 64, 256], stage=2, strides=(1, 1))
    x = identity(x, 3, [64, 64, 256], stage=2)
    x = identity(x, 3, [64, 64, 256], stage=2)
    x = convBlock(x, 3, [128, 128, 512], stage=3)
    x = identity(x, 3, [128, 128, 512], stage=3)
    x = identity(x, 3, [128, 128, 512], stage=3)
    x = identity(x, 3, [128, 128, 512], stage=3)
    x = convBlock(x, 3, [256, 256, 1024], stage=4)
    x = identity(x, 3, [256, 256, 1024], stage=4)
    x = identity(x, 3, [256, 256, 1024], stage=4)
    x = identity(x, 3, [256, 256, 1024], stage=4)
    x = identity(x, 3, [256, 256, 1024], stage=4)
    x = identity(x, 3, [256, 256, 1024], stage=4)
    x = convBlock(x, 3, [512, 512, 2048], stage=5)
    x = identity(x, 3, [512, 512, 2048], stage=5)
    x = identity(x, 3, [512, 512, 2048], stage=5)
    x = AveragePooling2D((7, 7), name="avg_pool")(x)
    x = Flatten()(x)
    x = Dense(classes, activation="softmax")(x)
    model = Model(img_input, x)
    return model

非常简洁的实现,可以方便地进行改造适配迁移复用都是可以的。

完成模型训练计算之后可以加载离线存储的模型进行推理预测,如下:

def loadModel(modelDir="results/"):
    """
    加载模型
    """
    try:
        # 加载结构
        with open(modelDir + "structure.json") as f:
            model_json = f.read()
        model = model_from_json(model_json)
        # 加载权重
        model.load_weights(modelDir + "weight.h5")
    except Exception as e:
        print("Exception: ", e)
        model = load_model(modelDir + "best.h5")
    print(
        "==========================Local Model Load Success============================"
    )
    return model

对整体训练过程进行可视化展示如下所示:

基于卷积神经网络模型开发构建国内大规模鸟类图像识别分析系统_第8张图片

后续在时间精力允许范围内会继续稳步推进当前的工作。

目前阶段大概囊括了400种左右的国内鸟类数据,想要全部囊括构建出来工作量还是非常庞大的,另外后面大规模细粒度识别的难度也会更大!

你可能感兴趣的:(人工智能,深度学习)