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

news2024/9/20 1:18:39

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的效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/432760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MobileNetV1详细原理(含torch源码)

目录 MobileNetV1原理 MobileNet V1的网络结构如下: 为什么要设计MobileNet: MobileNetV1的主要特点如下: MobileNetV1的创新点: MobileNetV1源码(torch版) 训练10个epoch的效果 MobileNetV1原理 Mo…

玩转ChatGPT:中科院ChatGPT Academic项目部署与测评

一、ChatGPT Academic简介 最近,以ChatGPT为代表的超大规模语言模型火出了圈,各种二次开发项目也是层出不穷。 比如说今天我们玩弄的这个“ChatGPT Academic”,在GitHub上已经13.7K的点赞了。 项目地址:https://github.com/bina…

因为这5大工具,同事直呼我时间管理小王子

写在前面 关于时间管理、如何做计划、如何提高执行力等等相关话题其实很早之前我就想写了,但一直拖着迟迟没有动笔。 在之前的一篇文章里我曾详细聊过自己对于时间管理,如何提高执行力,以及如何摆脱那种没有灵魂的任务计划的一些思考和做法…

【C语言】深度理解指针(中)

前言✈ 上回说到,我们学习了一些与指针相关的数据类型,如指针数组,数组指针,函数指针等等,我们还学习了转移表的基本概念,学会了如何利用转移表来实现一个简易计算器。详情请点击传送门:【C语言…

Windows 下安装和使用Redis

Redis 一般安装在Linux中, 但有时出于学习和其他目的,需要在Windows机器运行Redis, 本篇介绍如果在Windows中运行和使用Redis。 关于Redis的基本介绍可以参考: Redis介绍、安装与初体验 Windows 下Redis的下载 可…

【NestJs】日志收集

Nest 附带一个默认的内部日志记录器实现,它在实例化过程中以及在一些不同的情况下使用,比如发生异常等等(例如系统记录)。这由 nestjs/common 包中的 Logger 类实现。你可以全面控制如下的日志系统的行为: 完全禁用日…

jenkins windows安装 部署项目 前端 后端

安装 需要安装的程序: 1.下载jenkins windows版本 2.400 此版本需要jdk11 https://www.jenkins.io/ 按着提示安装即可 2.下载jdk 11 https://login.oracle.com/ 按着提示安装即可 部署pc 1.新建项目 2.源码管理 3.添加git用户 4.Build Steps 构建 初始化np…

vue2数据响应式原理(2)搭建webpack认识一下Object.defineProperty

在1中我们讲到 Object.defineProperty() 是vue2实现数据响应的关键 那么我们就来好好的看看这个方法 方法字面意思是定义属性 而他是通过Object对象调用的 所以说 他是用来控制对象的某个属性的 比较官方的解释是 object.defineProperty() 方法会直接在一个对象上定义一个新属…

单片机添加版本号的一些小技巧

平时我们写程序,通常都会备注软件版本,那么,怎么在单片机中保存版本信息呢? 方法其实有很多,但基本原理都是在指定存储区域(Flash)中写入软件版本信息。 实现方法 下面就分享一个最常用&#xf…

算法风险防控

算法风险防控是指在算法应用过程中,通过对算法应用场景、数据、模型和结果等多个方面的风险进行评估和控制,以保障算法应用的安全性、可靠性和合法性。以下是一些常见的算法风险防控措施: 数据风险防控:在算法应用中,…

【python】Python基础入门:从变量到异常处理

天池实验室代码链接:https://tianchi.aliyun.com/notebook-ai/home#notebookLabId491001 简介 Python 是一种通用编程语言,其在科学计算和机器学习领域具有广泛的应用。如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了…

51单片机定时器与计数器

文章目录 51单片机定时器与计数器一、定时器与计数器的结构与功能计数功能定时功能 二、定时器与计数器的控制TMOD 工作方式寄存器TCON 定时器控制寄存器 三、仿真案例(一).8个LED 1 秒周期闪烁。(二) 产品包装生产线。 51单片机定时器与计数器 一、定时器与计数器的结构与功能…

ESP32设备驱动-BMP388气压传感器驱动

BMP388气压传感器驱动 文章目录 BMP388气压传感器驱动1、BMP388介绍2、硬件准备3、软件准备4、驱动实现1、BMP388介绍 BMP388 是一款非常小巧、低功耗和低噪声的 24 位绝对气压传感器。 它可以实现精确的高度跟踪,特别适合无人机应用。 BMP388 在 0-65C 之间的同类最佳 TCO,…

港联证券|AI概念板块无死角杀跌,主题炒作熄火后资金会流向哪些板块?

ChatGPT概念指数大跌7%,单日跌幅创历史之最。 4月10日,炒作逾月的ChatGPT概念板块团体大跌,云从科技(688327.SH)、三六零(601360.SH)、科大讯飞(002230.SZ)等热门股跌停&…

集中式版本控制工具 —— SVN

一、简介 1️⃣ SVN 是什么? 代码版本管理工具他能记住每次的修改查看所有的修改记录恢复到任何历史版本恢复已经删除的文件 2️⃣ SVN 与 Git 相比有什么优势? 使用简单、上手快目录级权限控制,企业安全必备子目录 Checkout,…

RK3568平台开发系列讲解(Linux系统篇)文件系统的读写

🚀返回专栏总目录 文章目录 一、文件IO1.1、文件 IO read()1.2、文件 IO write()二、系统调用层和虚拟文件系统层三、ext4 文件系统层沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起学习 read 和 write 调用过程。 一、文件IO 1.1、文件 IO read() rea…

openLdap2.4.44的安装部署

openLdap2.4.44的安装部署 一、安装 1.从yum源拉取 yum install -y openldap openldap-clients openldap-servers 2.复制DB到指定目录 cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG 3.给目录授权 (如果没有ldap ,可…

定时任务框架快速入门

一、Quartz 1. Quartz 概述 Quartz 是一个开源的作业调度框架(job scheduler),几乎可以集成到任何 Java 应用程序中,从最小的独立应用程序到最大的电子商务系统。Quartz 可用于创建简单或复杂的调度来执行数十个、数百个甚至数万个作业;其任务…

[NOIP1999 普及组] Cantor 表

[NOIP1999 普及组] Cantor 表 题目描述: 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 1/1 , 1/2 , 1/3 , 1/4, 1/5, … 2/1, 2/2 , 2/3, 2/4, … 3/1 , 3/2, 3/3, … 4…

win11下载配置Python环境+pycharm下载

前两天快乐的把我重装的win10升级成win11,升级的时候超怕不能成功,但效果还不错,然后突然想学一学Python,所以首先来配置环境吧 一、下载安装包 建议去官网,因为自从有了Python3之后,Python2就慢慢的被淘汰…