Darknet19详细原理(含tensorflow版源码)

Darknet19原理

        Darknet19是一个轻量级的卷积神经网络,用于图像分类和检测任务。 它是YOLOv2目标检测算法的主干网络,它的优点在于具有较少的参数和计算量,在计算速度和精度之间取得了良好的平衡,同时在训练过程中也具有较高的准确率和收敛速度。

        Darknet19主要由卷积层、池化层和批量归一化层组成。根据名称可以看出,这些层是计算密集型的,且在网络的后端叠加了几个全连接层来输出预测,网络结构如下:

        输入层:输入尺寸为224x224x3的图像。

        卷积层1:使用32个3x3的卷积核,步长为1,填充为2,激活函数为ReLU。

        池化层1:使用2x2的最大池化,步长为2,不进行填充。

        卷积层2:使用64个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        池化层2:使用2x2的最大池化,步长为2,不进行填充。

        卷积层3:使用128个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        卷积层4:使用64个1x1的卷积核,步长为1,填充为0,激活函数为ReLU。

        卷积层5:使用128个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        池化层3:使用2x2的最大池化,步长为2,不进行填充。

        卷积层6:使用256个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        卷积层7:使用128个1x1的卷积核,步长为1,填充为0,激活函数为ReLU。

        卷积层8:使用256个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        池化层4:使用2x2的最大池化,步长为2,不进行填充。

        卷积层9:使用512个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        卷积层10:使用256个1x1的卷积核,步长为1,填充为0,激活函数为ReLU。

        卷积层11:使用512个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        卷积层12:使用256个1x1的卷积核,步长为1,填充为0,激活函数为ReLU。

        卷积层13:使用512个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        池化层5:使用2x2的最大池化,步长为2,不进行填充。

        卷积层14:使用1024个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        卷积层15:使用512个1x1的卷积核,步长为1,填充为0,激活函数为ReLU。

        卷积层16:使用1024个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        卷积层17:使用512个1x1的卷积核,步长为1,填充为0,激活函数为ReLU。

        卷积层18:使用1024个3x3的卷积核,步长为1,填充为1,激活函数为ReLU。

        全连接层1:输出维度为1000,表示1000个类别。

        激活层1:使用softmax激活函数,将输出转换为概率分布。

        Darknet19中使用3 x 3的卷积核来减少参数数量,并使用1 x 1的卷积核来降低计算负担。同时,池化层和批量归一化层用于提高模型的稳定性和泛化能力。

        总体来说,Darknet19是一个简单而高效的卷积神经网络,它通过一系列精心设计的层来达到高精度和高效率深度学习目标,也能够在对计算资源受限的环境下进行高效的物体识别和分类任务。

Darknet19源码(tensorflow版)

数据集请自行下载

链接:百度网盘 
提取码:bwx0 

如果没有GPU导致运行失败,就把device删除,使用默认CPU运行。


import os
import cv2
import numpy as np
import random
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from tensorflow.keras import layers,models,optimizers,losses
#开启GPU
device = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(device[0],True)


Data_dir = 'cat&dog'


def ReadLoad(Data_dir):
    images = []
    labels = []
    for i,class_name in enumerate(os.listdir(Data_dir)):
        sub_name = os.path.join(Data_dir,class_name)
        for img_name in os.listdir(sub_name):
            img = os.path.join(sub_name,img_name)
            img = cv2.imread(img) / 255.0
            img = cv2.resize(img,(256,256))
            b,g,r = cv2.split(img)
            img = cv2.merge([r,g,b])
            images.append(img)
            labels.append(i)
    return np.array(images),np.array(labels)

def ConvBnRelu(inputs,filters,kernels = 3):
    x = layers.Conv2D(filters,(kernels,kernels),padding='same')(inputs)
    x = layers.BatchNormalization()(x)
    x = layers.LeakyReLU(alpha=0.05)(x)
    return x

def DarkNet19(inputs):
    x = ConvBnRelu(inputs,32,3)
    x = layers.MaxPooling2D((2,2),strides=2)(x)

    x = ConvBnRelu(x, 64, 3)
    x = layers.MaxPooling2D((2, 2), strides=2)(x)

    x = ConvBnRelu(x, 128, 3)
    x = ConvBnRelu(x, 64, 1)
    x = ConvBnRelu(x, 128, 3)
    x = layers.MaxPooling2D((2, 2), strides=2)(x)

    x = ConvBnRelu(x, 256, 3)
    x = ConvBnRelu(x, 128, 1)
    x = ConvBnRelu(x, 256, 3)
    x = layers.MaxPooling2D((2, 2), strides=2)(x)

    x = ConvBnRelu(x, 512, 3)
    x = ConvBnRelu(x, 256, 1)
    x = ConvBnRelu(x, 512, 3)
    x = ConvBnRelu(x, 256, 1)
    x = ConvBnRelu(x, 512, 3)
    x = layers.MaxPooling2D((2, 2), strides=2)(x)

    x = ConvBnRelu(x, 1024, 3)
    x = ConvBnRelu(x, 512, 1)
    x = ConvBnRelu(x, 1024, 3)
    x = ConvBnRelu(x, 512, 1)
    x = ConvBnRelu(x, 1024, 3)

    x = ConvBnRelu(x,2,1)
    x = layers.GlobalAveragePooling2D()(x)
    x = layers.Activation('softmax')(x)
    return x



def main():
    images,labels = ReadLoad(Data_dir)

    train_x,test_x,train_y,test_y = train_test_split(images,labels,train_size=0.8)

    inputs = keras.Input((256,256,3))
    outputs = DarkNet19(inputs)
    model = models.Model(inputs,outputs)
    model.summary()
    model.compile(loss = losses.SparseCategoricalCrossentropy(),
                  optimizer=optimizers.Adam(1e-4),
                  metrics=['accuracy'])
    model.fit(train_x,train_y,epochs=10,batch_size=2)
    score = model.evaluate(test_x,test_y,batch_size=2)
    print('loss:',score[0])
    print('acc:',score[1])
    model.save('save',save_format='tf')
    del model

    new_model = keras.models.load_model('save')
    new_model.compile(loss = losses.SparseCategoricalCrossentropy(),
                      optimizer=optimizers.Adam(1e-4),
                      metrics=['accuracy'])
    score = new_model.evaluate(test_x, test_y,batch_size = 2)
    print('loss:', score[0])
    print('acc:', score[1])

    for i in range(9):
        r = random.randint(0,len(test_x) - 9)
        pre = tf.argmax(new_model(test_x[i + r:i + r + 1]),axis=1)[0]
        print(f"pre:{pre}---label:{test_y[i + r]}")
        plt.subplot(3,3,i + 1)
        if pre == test_y[r + i]:
            plt.imshow(test_x[r + i])
            plt.title('cat' if pre == test_y[r + i] else 'dog',c = 'black')
        else:
            plt.imshow(test_x[r + i])
            plt.title('cat' if pre == test_y[r + i] else 'dog', c='red')
        plt.axis('off')
        plt.savefig('mg.jpg')
    plt.show()
    pass


if __name__ == '__main__':
    main()

训练10个epoch的效果

  • 17
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑的男孩。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值