深度学习卫星遥感图像检测与识别 -opencv python 目标检测 计算机竞赛
文章目录
- 0 前言
- 1 课题背景
- 2 实现效果
- 3 Yolov5算法
- 4 数据处理和训练
- 5 最后
0 前言
🔥 优质竞赛项目系列,今天要分享的是
🚩 **深度学习卫星遥感图像检测与识别 **
该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:5分
🧿 更多资料, 项目分享:
https://gitee.com/dancheng-senior/postgraduate

1 课题背景
近年来,世界各国大力发展航空航天事业,卫星图像的目标检测在各行各业的应用得到了快速的发展,特别是军事侦查、海洋船舶和渔业管理等领域。由于卫星图像中有价值的信息极少,卫星图像数据规模巨大,这迫切需要智能辅助工具帮助相关从业人员从卫星图像中高效获取精确直观的信息。
本文利用深度学习技术,基于Yolov5算法框架实现卫星图像目标检测问题。
2 实现效果
实现效果如下:可以看出对船只、飞机等识别效果还是很好的。




3 Yolov5算法
简介
下图所示为 YOLOv5 的网络结构图,分为输入端,Backbone,Neck 和 Prediction 四个部分。其中,
输入端包括 Mosaic 数据增强、自适应图片缩放、自适应锚框计算,Backbone 包括 Focus 结构、CSP
结 构,Neck 包 括 FPN+PAN 结 构,Prediction 包 括GIOU_Loss 结构。

相关代码
class Yolo(object):def __init__(self, weights_file, verbose=True):self.verbose = verbose# detection paramsself.S = 7 # cell sizeself.B = 2 # boxes_per_cellself.classes = ["aeroplane", "bicycle", "bird", "boat", "bottle","bus", "car", "cat", "chair", "cow", "diningtable","dog", "horse", "motorbike", "person", "pottedplant","sheep", "sofa", "train","tvmonitor"]self.C = len(self.classes) # number of classes# offset for box center (top left point of each cell)self.x_offset = np.transpose(np.reshape(np.array([np.arange(self.S)]*self.S*self.B),[self.B, self.S, self.S]), [1, 2, 0])self.y_offset = np.transpose(self.x_offset, [1, 0, 2])self.threshold = 0.2 # confidence scores threholdself.iou_threshold = 0.4# the maximum number of boxes to be selected by non max suppressionself.max_output_size = 10self.sess = tf.Session()self._build_net()self._build_detector()self._load_weights(weights_file)
4 数据处理和训练
数据集
本项目使用 DOTA 数据集,原数据集中待检测的目标如下

原数据集中的标签如下

图像分割和尺寸调整
YOLO 模型的图像输入尺寸是固定的,由于原数据集中的图像尺寸不一,我们将原数据集中的图像按目标分布的位置分割成一个个包含目标的子图,并将每个子图尺寸调整为
1024×1024。分割前后的图像如所示。
分割前

分割后

模型训练
在 yolov5/ 目录,运行 train.py 文件开始训练:
python train.py --weight weights/yolov5s.pt --batch 16 --epochs 100 --cache
其中的参数说明:
- weight:使用的预训练权重,这里示范使用的是 yolov5s 模型的预训练权重
- batch:mini-batch 的大小,这里使用 16
- epochs:训练的迭代次数,这里我们训练 100 个 epoch
- cache:使用数据缓存,加速训练进程
相关代码
#部分代码
def train(hyp, opt, device, tb_writer=None):logger.info(f'Hyperparameters {hyp}')log_dir = Path(tb_writer.log_dir) if tb_writer else Path(opt.logdir) / 'evolve' # logging directorywdir = log_dir / 'weights' # weights directoryos.makedirs(wdir, exist_ok=True)last = wdir / 'last.pt'best = wdir / 'best.pt'results_file = str(log_dir / 'results.txt')epochs, batch_size, total_batch_size, weights, rank = \opt.epochs, opt.batch_size, opt.total_batch_size, opt.weights, opt.global_rank# Save run settingswith open(log_dir / 'hyp.yaml', 'w') as f:yaml.dump(hyp, f, sort_keys=False)with open(log_dir / 'opt.yaml', 'w') as f:yaml.dump(vars(opt), f, sort_keys=False)# Configurecuda = device.type != 'cpu'init_seeds(2 + rank)with open(opt.data) as f:data_dict = yaml.load(f, Loader=yaml.FullLoader) # data dictwith torch_distributed_zero_first(rank):check_dataset(data_dict) # checktrain_path = data_dict['train']test_path = data_dict['val']nc, names = (1, ['item']) if opt.single_cls else (int(data_dict['nc']), data_dict['names']) # number classes, namesassert len(names) == nc, '%g names found for nc=%g dataset in %s' % (len(names), nc, opt.data) # check# Modelpretrained = weights.endswith('.pt')if pretrained:with torch_distributed_zero_first(rank):attempt_download(weights) # download if not found locallyckpt = torch.load(weights, map_location=device) # load checkpointif 'anchors' in hyp and hyp['anchors']:ckpt['model'].yaml['anchors'] = round(hyp['anchors']) # force autoanchormodel = Model(opt.cfg or ckpt['model'].yaml, ch=3, nc=nc).to(device) # createexclude = ['anchor'] if opt.cfg else [] # exclude keysstate_dict = ckpt['model'].float().state_dict() # to FP32state_dict = intersect_dicts(state_dict, model.state_dict(), exclude=exclude) # intersectmodel.load_state_dict(state_dict, strict=False) # loadlogger.info('Transferred %g/%g items from %s' % (len(state_dict), len(model.state_dict()), weights)) # reportelse:model = Model(opt.cfg, ch=3, nc=nc).to(device) # create# Freezefreeze = ['', ] # parameter names to freeze (full or partial)if any(freeze):for k, v in model.named_parameters():if any(x in k for x in freeze):print('freezing %s' % k)v.requires_grad = False# Optimizernbs = 64 # nominal batch sizeaccumulate = max(round(nbs / total_batch_size), 1) # accumulate loss before optimizinghyp['weight_decay'] *= total_batch_size * accumulate / nbs # scale weight_decaypg0, pg1, pg2 = [], [], [] # optimizer parameter groupsfor k, v in model.named_parameters():v.requires_grad = Trueif '.bias' in k:pg2.append(v) # biaseselif '.weight' in k and '.bn' not in k:pg1.append(v) # apply weight decayelse:pg0.append(v) # all else
训练开始时的日志信息


5 最后
🧿 更多资料, 项目分享:
https://gitee.com/dancheng-senior/postgraduate
相关文章:
深度学习卫星遥感图像检测与识别 -opencv python 目标检测 计算机竞赛
文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐…...
wxWidgets 3.2.4发布 —— 发布于2023年11月11日
稳定的3.2系列中的另一个版本现在可以在GitHub上获得。您可以在那里找到包含库源代码和文档的归档文件,以及所选Windows编译器(如Microsoft Visual C、MinGW-w64和TDM-GCC)的二进制文件。您还可以阅读此版本的更新文档,特别是&…...
PyQt6运行QTDesigner生成的ui文件程序
2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计18条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~、第2讲 PyQt6库和工具库Q…...
基于mediapipe的人手21点姿态检测模型—CPU上检测速度惊人
前期的文章,我们介绍了MediaPipe对象检测与对象分类任务,也分享了MediaPipe的人手手势识别。在进行人手手势识别前,MediaPipe首先需要进行人手的检测与人手坐标点的检测,经过以上的检测后,才能把人手的坐标点与手势结合起来,进行相关的手势识别。 MediaPipe人手坐标点检测…...
系统架构设计: 21 论敏捷软件开发方法及其应用
论敏捷软件开发方法及其应用 请围绕“敏捷软件开发方法及其应用”论题,依次从以下三个方面进行论述。 ①简述你所参与开发的运用了敏捷技术的项目,以及你所担任的工作; ②分析并讨论敏捷<...
【深度学习】脸部修复,CodeFormer,论文,实战
代码: https://github.com/sczhou/CodeFormer https://huggingface.co/spaces/sczhou/CodeFormer 论文:https://arxiv.org/abs/2206.11253 Towards Robust Blind Face Restoration with Codebook Lookup Transformer 文章目录 论文摘要1 引言2 相关工…...
OpenGL_Learn14(光照贴图)
1. 漫反射贴图 在光照场景中,它通常叫做一个漫反射贴图(Diffuse Map)(3D艺术家通常都这么叫它),它是一个表现了物体所有的漫反射颜色的纹理图像。 我们会将纹理储存为Material结构体中的一个sampler2D 。我们将之前定义的vec3漫反…...
【JVM精讲与GC调优教程(概述)】
如何理解虚拟机(JVM)跨语言的平台 java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,他只关心“字节码”文件。 java不是最强大的语言,但是JVN是最强大的虚拟机。 不存在内存溢出? 内存泄露? JAVA = (C++)–; 垃圾回收机制为我们打理了很多繁琐的…...
蓝桥杯物联网竞赛_STM32L071_2_继电器控制
Stm32l071原理图: PA11与PA12连接着UNL2803 ULN2803是一种集成电路芯片,通常被用作高电压和高电流负载的驱动器。 ULN2803是一个达林顿阵列,当输入引脚(IN1至IN8)被连接到正电源时,相应的输出引脚ÿ…...
python之pyqt专栏2-项目文件解析
项目结构 在上一篇文章python之pyqt专栏1-环境搭建,创建新的pyqt项目,下面我们来看一下这个项目下的文件。 从下面的文件结构图可以看到,该项目下有3个文件,untitled.ui,untitled.py 以及main.py。 QtDesigner可以UI界面的方式&am…...
Kafka 集群如何实现数据同步
Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统,不但像传统消息队列(RaabitMQ、RocketMQ等)那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上,用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…...
opencv- CLAHE 有限对比适应性直方图均衡化
CLAHE(Contrast Limited Adaptive Histogram Equalization)是一种对比度有限的自适应直方图均衡化技术,它能够提高图像的对比度而又避免过度增强噪声。 在OpenCV中,cv2.createCLAHE() 函数用于创建CLAHE对象,然后可以…...
IOS免签封装打包苹果APP的方法
IOS免签app封装打包苹果APP的方法如下: 准备一个未签名的IPA文件。获取一个企业证书或个人证书,用于签名IPA文件。将证书添加到Keychain Access中。安装iOS App Signer(可以在网上找到相关下载链接)。打开iOS App Signer…...
Springboot引入分布式搜索引擎Es RestAPI
文章目录 RestAPI初始化RestClient创建索引库删除索引库判断索引库是否存在总结 RestClient操作文档增加文档数据查询文档删除文档修改文档批量导入文档小结 RestAPI ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通…...
Lua脚本解决redis实现的分布式锁多条命令原子性问题
线程1现在持有锁之后,在执行业务逻辑过程中,他正准备删除锁,而且已经走到了条件判断的过程中,比如他已经拿到了当前这把锁确实是属于他自己的,正准备删除锁,但是此时他的锁到期了,那么此时线程2…...
Vatee万腾独特科技力量的前沿探索:Vatee的数字化奇点
在当今科技的浪潮中,Vatee万腾以其独特的科技力量成为前沿探索的引领者,正迎来数字化奇点的新时代。Vatee万腾不仅仅是一家科技公司,更是一支探索未知领域、开创数字时代新局面的先锋力量。 Vatee万腾的数字化奇点体现在其对前沿技术的深刻理…...
C++面试,const的使用
#include <iostream> #include <cstring>int main() {const int x 1;int b 10;int c 20;const int* a1 &b;int* const a2 &b;const int* const a3 &b;x 2;a1 &c;*a1 1;a2 &c;*a2 1;a3 &c;*a3 1;return 0; }错误1:…...
小总结----长度
看了上一篇文章,已经一年没发了。CSDN也越来越封闭了,查点东西,也很不友好。 来个小总结吧:完成团队建设,招聘11人。完成26项开发,内部9项,科创10项。2023发明专利申请两项,软著申请…...
【深度学习】如何选择神经网络的超参数
1. 神经网络的超参数分类 神经网路中的超参数主要包括: 1. 学习率 η 2. 正则化参数 λ 3. 神经网络的层数 L 4. 每一个隐层中神经元的个数 j 5. 学习的回合数Epoch 6. 小批量数据 minibatch 的大小 7. 输出神经元的编码方式 8. 代价函数的选择 9. 权重初始化的方法 …...
jQuery 3.0 新增了哪些特性?(jQuery 3 所引入的那些最重要的变化)
文章目录 前言简介新增特性Use of requestAnimationFrame() for Animationsunwrap() 方法 有变更的特性data() 方法Deferred 对象SVG 文档 已废弃、已移除的方法和属性废弃 bind()、unbind()、delegate() 和 undelegate() 方法移除 load()、unload() 和 error() 方法移除 conte…...
手把手调试RK3588电源:当CPU变频失效时,如何排查DTS中的PMIC配置问题
RK3588电源调试实战:当DVFS失效时如何精准定位PMIC初始化问题 凌晨三点,实验室的咖啡机已经空了第三轮。盯着屏幕上/d/opp/opp_summary里空空如也的频率信息,我意识到这又是一个典型的RK3588电源初始化顺序问题。作为嵌入式工程师,…...
保姆级教程:用Python-CAN库在树莓派上搭建汽车CAN总线数据监控器
树莓派Python-CAN实战:打造低成本汽车数据监控系统 在汽车电子和嵌入式开发领域,CAN总线作为车辆内部通信的神经系统,承载着发动机控制、车身电子、仪表盘等关键数据。传统CAN分析仪动辄上万元的价格让个人开发者和学生望而却步。而实际上&am…...
从数据到洞察:使用Python自动化完成问卷量表的信效度评估与因子探索
1. 为什么需要自动化问卷分析? 做问卷研究的朋友应该都深有体会,每次收集完数据最头疼的就是各种统计检验。传统做法是用SPSS一个个点菜单,不仅效率低,还容易出错。我刚开始做研究时就经常遇到这种情况:好不容易跑完信…...
如何快速搭建CSDN Bot
要建立一个功能完整的 CSDN Bot,通常有两种主要路径:一是使用官方或社区提供的集成工具(如 OpenClaw/WinClaw)进行快速对接,这属于应用层部署;二是从零开始进行底层开发,通过调用 CSDN 的开放 A…...
经济研究论文排版终极指南:如何用LaTeX模板快速完成学术投稿
经济研究论文排版终极指南:如何用LaTeX模板快速完成学术投稿 【免费下载链接】Chinese-ERJ 《经济研究》杂志 LaTeX 论文模板 - LaTeX Template for Economic Research Journal 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-ERJ 还在为《经济研究》…...
redis-cli MODULE LIST的庖丁解牛
它的本质是:向正在运行的 Redis 服务端发送一个管理命令,查询其当前动态加载的所有模块(Modules)的元数据列表。这不仅是一个简单的“清单”,更是验证环境配置、排查功能缺失(如布隆过滤器)、以…...
Mac学Linux新姿势:VMware Fusion装Ubuntu后,用VS Code远程开发真香了
Mac与Linux的优雅共舞:VMware FusionUbuntuVS Code远程开发全指南 当Mac的精致美学遇上Linux的强大内核,会碰撞出怎样的火花?对于开发者而言,这绝非简单的系统切换选择题,而是如何让两大操作系统优势互补的深度整合。本…...
别再套模板了!用ChatGPT+Zotero高效搭建你的第一篇SCI/EI论文框架(附保姆级步骤)
科研新手的AI加速器:用ChatGPTZotero构建高质量论文框架的实战指南 当你面对空白的文档和导师"尽快完成初稿"的催促时,是否感到无从下手?传统论文写作教程往往停留在理论层面,而今天我们要分享的是一套融合AI技术与文献…...
终极指南:Navicat Premium macOS版无限试用重置脚本完全解析
终极指南:Navicat Premium macOS版无限试用重置脚本完全解析 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 对于…...
告别Visio!用Python+D3.js自动绘制你的网络拓扑图(附完整代码)
告别Visio!用PythonD3.js自动绘制你的网络拓扑图(附完整代码) 网络工程师们是否厌倦了在Visio中手动拖拽图标、反复调整连线?当设备增减或链路变更时,那些精心绘制的静态拓扑图往往在几天内就变得过时。本文将展示如何…...
