jjzjj

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

爱笑的男孩。 2024-05-04 原文

Darknet19原理

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

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

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

        卷积层1:使用32个5x5的卷积核,步长为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的效果

 

有关Darknet19详细原理(含tensorflow版源码)的更多相关文章

  1. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  2. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  3. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  4. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  5. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  6. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  7. ruby - 在 tensorflow.rb 上运行保存的模型 - 2

    我使用高级EstimatorAPI(DNNClassifier)在Python中构建并保存了一个非常简单的模型。它需要2个float并输出两个类之一。我正在尝试使用tensorflow.rbgem在Ruby中加载它,并用它做出预测。这应该很相似totheCAPTCHAexampleprovidedbytensorflow.rb.我使用export_saved_model保存了它。这是训练模型的Python代码。它可以正确地预测类别。将numpy导入为np将Pandas导入为pd将tensorflow导入为tfdataframe=pd.read_csv("remediations_imp

  8. ruby-debug19 : Can't get working with Ruby 1. 9.1p376 - 2

    我正在尝试将ruby​​-debug19与Ruby1.9.1p376一起使用,但出现以下错误:test.rb:2:in`require':nosuchfiletoload--ruby-debug19(LoadError)fromtest.rb:2:in`'这是测试.rb:require'rubygems'require'ruby-debug19'这是“gemlist”的输出:***LOCALGEMS***ruby-debug19(0.11.6)(etc.)因此运行“rubytest.rb”会产生上述错误。我做错了吗?我认为这是运行ruby​​-debug19的正确方法(通过包含gem并

  9. 华为ensp详细安装包、安装教程及所遇问题 - 2

    目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装

  10. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

随机推荐