news 2026/9/2 12:54:50

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于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]) # number of workers 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) # Scheduler https://arxiv.org/pdf/1812.01187.pdf lf = lambda x: ((1 + math.cos(x * math.pi / args.epochs)) / 2) * (1 - args.lrf) + args.lrf # cosine scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf) for epoch in range(args.epochs): # train mean_loss = train_one_epoch(model=model, optimizer=optimizer, data_loader=train_loader, device=device, epoch=epoch) scheduler.step() # validate 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) # 数据集所在根目录 # https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz parser.add_argument('--data-path', type=str, default=r"E:\20240717\data") # densenet121 官方权重下载地址 # https://download.pytorch.org/models/densenet121-a639ec97.pth 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界面代码

项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷

https://www.bilibili.com/video/BV1yvz5YXEj5/

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 1:30:41

AI读脸术实战:用OpenCV DNN快速搭建人脸分析应用

AI读脸术实战:用OpenCV DNN快速搭建人脸分析应用 1. 引言:轻量级人脸属性分析的工程价值 在人工智能落地的众多场景中,人脸属性识别是一项极具实用价值的技术。无论是智能安防、用户画像构建,还是个性化推荐系统,自动…

作者头像 李华
网站建设 2026/9/1 18:27:36

虚拟主播技术揭秘:使用Holistic Tracking实现电影级动作捕捉

虚拟主播技术揭秘:使用Holistic Tracking实现电影级动作捕捉 1. 技术背景与核心价值 在虚拟主播(Vtuber)、数字人和元宇宙应用快速发展的今天,如何低成本、高精度地实现全身动作捕捉成为关键挑战。传统动捕系统依赖昂贵的传感器…

作者头像 李华
网站建设 2026/9/2 22:56:12

5分钟部署AI读脸术:极速轻量版镜像实现年龄性别识别

5分钟部署AI读脸术:极速轻量版镜像实现年龄性别识别 1. 项目背景与技术价值 在智能安防、用户画像构建和人机交互等场景中,人脸属性分析正成为一项关键的底层能力。传统方案往往依赖复杂的深度学习框架(如PyTorch或TensorFlow)&…

作者头像 李华
网站建设 2026/9/2 22:55:55

突破付费墙限制:轻松访问专业内容的实用指南

突破付费墙限制:轻松访问专业内容的实用指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的时代,你是否曾因付费墙而无法获取重要的专业内容&…

作者头像 李华
网站建设 2026/9/2 22:55:51

突破数字信息壁垒:智能内容解锁完整方案终极指南

突破数字信息壁垒:智能内容解锁完整方案终极指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的数字时代,付费墙已成为获取深度内容的主要障碍。…

作者头像 李华
网站建设 2026/9/2 22:56:01

ARM交叉编译环境搭建:小白指南(含实操)

从零搭建ARM交叉编译环境:一个工程师的实战手记 你有没有过这样的经历?在自己的高性能笔记本上写完代码,兴冲冲地 make 一下,然后把生成的可执行文件拷到树莓派上——结果一运行,弹出一句冰冷的提示: …

作者头像 李华