首页 > 分享 > 基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码

基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码

 第一步:准备数据

5种鸟类行为数据:self.class_indict =

["bowing_status", "grooming", "headdown", "vigilance_status", "walking"]

,总共有23790张图片,每个文件夹单独放一种数据

第二步:搭建模型

简介:

DenseNet(Dense Convolutional Network)稠密卷积网络
CVPR2017的优秀文章
从feature入手,通过对feature的极致利用达到更好的效果和更少的参数。


优点:

减轻了vanishing-gradient(梯度消失)
加强了feature的传递
更有效地利用了feature
一定程度上较少了参数数量


在深度学习网络中,随着网络深度的加深,梯度消失问题会愈加明显,解决方法是创建浅层与深层之间的短路径。在DenseNet中,在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来。

在传统卷积神经网络中,如果你有L层,那么就会有L个连接,但是在DenseNet中,会有(L+1)/2个连接。简单来说,就是每一层的输入来自前面所有层的输出。如下图是dense block的结构图,x是数据,H是网络层。

第三步:训练代码

1)损失函数为:交叉熵损失函数

2)训练代码:

import os

import math

import argparse

import torch

import torch.optim as optim

from torch.utils.tensorboard import SummaryWriter

from torchvision import transforms

import torch.optim.lr_scheduler as lr_scheduler

from model import densenet121, load_state_dict

from my_dataset import MyDataSet

from utils import read_split_data, train_one_epoch, evaluate

def main(args):

device = torch.device(args.device if torch.cuda.is_available() else "cpu")

print(args)

print('Start Tensorboard with "cd", view at http://localhost:6006/')

tb_writer = SummaryWriter()

if os.path.exists("./weights") is False:

os.makedirs("./weights")

train_images_path, train_images_label, val_images_path, val_images_label = read_split_data(args.data_path)

data_transform = {

"train": transforms.Compose([transforms.RandomResizedCrop(224),

transforms.RandomHorizontalFlip(),

transforms.ToTensor(),

transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),

"val": transforms.Compose([transforms.Resize(256),

transforms.CenterCrop(224),

transforms.ToTensor(),

transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])}

train_dataset = MyDataSet(images_path=train_images_path,

images_class=train_images_label,

transform=data_transform["train"])

val_dataset = MyDataSet(images_path=val_images_path,

images_class=val_images_label,

transform=data_transform["val"])

batch_size = args.batch_size

nw = min([os.cpu_count(), batch_size if batch_size > 1 else 0, 8])

print('Using {} dataloader workers every process'.format(nw))

train_loader = torch.utils.data.DataLoader(train_dataset,

batch_size=batch_size,

shuffle=True,

pin_memory=True,

num_workers=nw,

collate_fn=train_dataset.collate_fn)

val_loader = torch.utils.data.DataLoader(val_dataset,

batch_size=batch_size,

shuffle=False,

pin_memory=True,

num_workers=nw,

collate_fn=val_dataset.collate_fn)

model = densenet121(num_classes=args.num_classes).to(device)

if args.weights != "":

if os.path.exists(args.weights):

load_state_dict(model, args.weights)

else:

raise FileNotFoundError("not found weights file: {}".format(args.weights))

if args.freeze_layers:

for name, para in model.named_parameters():

if "classifier" not in name:

para.requires_grad_(False)

pg = [p for p in model.parameters() if p.requires_grad]

optimizer = optim.SGD(pg, lr=args.lr, momentum=0.9, weight_decay=1E-4, nesterov=True)

lf = lambda x: ((1 + math.cos(x * math.pi / args.epochs)) / 2) * (1 - args.lrf) + args.lrf

scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf)

for epoch in range(args.epochs):

mean_loss = train_one_epoch(model=model,

optimizer=optimizer,

data_loader=train_loader,

device=device,

epoch=epoch)

scheduler.step()

acc = evaluate(model=model,

data_loader=val_loader,

device=device)

print("[epoch {}] accuracy: {}".format(epoch, round(acc, 3)))

tags = ["loss", "accuracy", "learning_rate"]

tb_writer.add_scalar(tags[0], mean_loss, epoch)

tb_writer.add_scalar(tags[1], acc, epoch)

tb_writer.add_scalar(tags[2], optimizer.param_groups[0]["lr"], epoch)

torch.save(model.state_dict(), "./weights/model-{}.pth".format(epoch))

if __name__ == '__main__':

parser = argparse.ArgumentParser()

parser.add_argument('--num_classes', type=int, default=5)

parser.add_argument('--epochs', type=int, default=100)

parser.add_argument('--batch-size', type=int, default=16)

parser.add_argument('--lr', type=float, default=0.001)

parser.add_argument('--lrf', type=float, default=0.1)

parser.add_argument('--data-path', type=str,

default=r"E:20240717data")

parser.add_argument('--weights', type=str, default='densenet121.pth',

help='initial weights path')

parser.add_argument('--freeze-layers', type=bool, default=False)

parser.add_argument('--device', default='cuda:0', help='device id (i.e. 0 or 0,1 or cpu)')

opt = parser.parse_args()

main(opt)

第四步:统计正确率

第五步:搭建GUI界面

视频演示地址:基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码_哔哩哔哩_bilibili

第六步:整个工程的内容

有训练代码和训练好的模型以及训练过程,提供数据,提供GUI界面代码

代码见:基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码

有问题可以私信或者留言,有问必答

相关知识

基于机器视觉的宠物狗远程监护系统
一种基于深度学习的宠物行为识别方法及系统
一种基于深度学习的宠物行为识别方法及系统与流程
基于web的流浪动物领养系统(源码+开题)
科学家都无法分辨的相似鸟类,这个神经网络可以做到!
探索AIDog:智能狗狗识别与行为理解的开源项目
Java计算机毕业设计的宠物交流平台系统(开题+源码+论文)
Springboot宠物医院系统源码附带运行视频教程
基于表征全局依赖关系的并行注意力机制鸟鸣声识别方法
小型动物分辨学习行为自动训练系统

网址: 基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码 https://m.mcbbbk.com/newsview62236.html

所属分类:萌宠日常
上一篇: 中国科学院动物研究所鸟类行为功能
下一篇: 在宠物医院给小猫做一个绝育手术要