红外弱小飞机目标检测数据集,可用于目标检测
红外弱小飞机目标检测数据集可用于目标检测926张图像bmp和xml一一对应类别bird好的下面是一个完整的基于红外弱小飞机目标检测的数据集的实现。我们将涵盖以下内容项目结构依赖项安装数据准备模型训练评估模型推理界面项目介绍数据集介绍名称: 红外弱小飞机目标检测数据集数量: 926张图像标注格式: XMLPascal VOC格式类别:bird (假设这里是指小型无人机或其他弱小飞行器)完整项目结构ir_drone_detection/ ├── main.py ├── train.py ├── evaluate.py ├── infer.py ├── ui_files/ │ ├── infer_ui.ui │ ├── infer_ui.qrc │ └── infer_ui_rc.py ├── datasets/ │ ├── ir_drone/ │ │ ├── images/ │ │ ├── annotations/ │ │ ├── train.txt │ │ └── val.txt ├── best_ir_drone.pt ├── requirements.txt └── data.yaml文件内容requirements.txtopencv-python4.5.3.56 torch1.9.0cu111 PyQt55.15.4 labelme shutil matplotlib scikit-image numpy pandas xml.etree.ElementTree albumentationsdata.yamltrain:./datasets/ir_drone/images/trainval:./datasets/ir_drone/images/valnc:1names:[bird]train.pyimporttorchfromyolov7importtrain# 设置随机种子以保证可重复性torch.manual_seed(42)# 定义数据集路径dataset_configdata.yaml# 训练模型resultstrain.run(imgsz640,batch16,epochs50,datadataset_config,weightsyolov7.pt,nameir_drone,projectruns/train)# 打印训练结果print(results)evaluate.pyfromyolov7importval# 初始化YOLOv7模型model_pathruns/train/ir_drone/weights/best.pt# 评估模型resultsval.run(datadata.yaml,weightsmodel_path,imgsz640,taskval)# 打印评估结果print(results)infer.pyimportsysimportcv2importnumpyasnpimportrandomfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QFileDialog,QMessageBox,QLabel,QPushButton,QVBoxLayout,QWidget,QProgressBarfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQTimerimporttorchfrompathlibimportPathfromyolov7.utils.generalimportnon_max_suppression,scale_coordsfromyolov7.models.experimentalimportattempt_loadfromyolov7.utils.torch_utilsimportselect_deviceclassMainWindow(QMainWindow):def__init__(self):super(MainWindow,self).__init__()self.setWindowTitle(红外弱小飞机目标检测)self.setGeometry(100,100,800,600)# 初始化YOLOv7模型self.deviceselect_device()self.modelattempt_load(runs/train/ir_drone/weights/best.pt,map_locationself.device)self.strideint(self.model.stride.max())# model strideself.imgsz640# 创建界面元素self.label_displayQLabel(self)self.label_display.setAlignment(Qt.AlignCenter)self.button_select_imageQPushButton(选择图片,self)self.button_select_folderQPushButton(选择文件夹,self)self.button_select_videoQPushButton(选择视频,self)self.button_start_cameraQPushButton(开始摄像头,self)self.button_stop_cameraQPushButton(停止摄像头,self)self.progress_barQProgressBar(self)self.progress_bar.setVisible(False)layoutQVBoxLayout()layout.addWidget(self.label_display)layout.addWidget(self.button_select_image)layout.addWidget(self.button_select_folder)layout.addWidget(self.button_select_video)layout.addWidget(self.button_start_camera)layout.addWidget(self.button_stop_camera)layout.addWidget(self.progress_bar)containerQWidget()container.setLayout(layout)self.setCentralWidget(container)self.button_select_image.clicked.connect(self.select_image)self.button_select_folder.clicked.connect(self.select_folder)self.button_select_video.clicked.connect(self.select_video)self.button_start_camera.clicked.connect(self.start_camera)self.button_stop_camera.clicked.connect(self.stop_camera)self.timerQTimer()self.timer.timeout.connect(self.update_frame)self.capNonedefload_image(self,image_path):framecv2.imread(image_path)resultsself.detect(frame)annotated_frameself.draw_annotations(frame,results)returnannotated_framedefdetect(self,img0):imgletterbox(img0,new_shapeself.imgsz,strideself.stride)[0]imgimg[:,:,::-1].transpose(2,0,1)# BGR to RGB, to 3x416x416imgnp.ascontiguousarray(img)imgtorch.from_numpy(img).to(self.device)imgimg.float()# uint8 to fp16/32img/255.0# 0 - 255 to 0.0 - 1.0ifimg.ndimension()3:imgimg.unsqueeze(0)predself.model(img,augmentFalse)[0]prednon_max_suppression(pred,0.25,0.45,classesNone,agnosticFalse)returnpreddefdraw_annotations(self,frame,results):colors[(random.randint(0,255),random.randint(0,255),random.randint(0,255))for_inrange(len(self.model.names))]fordetinresults:iflen(det):det[:,:4]scale_coords(frame.shape[2:],det[:,:4],frame.shape).round()for*xyxy,conf,clsinreversed(det):labelf{self.model.names[int(cls)]}{conf:.2f}plot_one_box(xyxy,frame,labellabel,colorcolors[int(cls)],line_thickness3)returnframedefdisplay_image(self,frame):rgb_imagecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)h,w,chrgb_image.shape bytes_per_linech*w qt_imageQImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pixmapQPixmap.fromImage(qt_image)self.label_display.setPixmap(pixmap.scaled(self.label_display.width(),self.label_display.height()))defselect_image(self):optionsQFileDialog.Options()file_path,_QFileDialog.getOpenFileName(self,选择图片,,图片 (*.bmp *.jpg *.jpeg *.png);;所有文件 (*),optionsoptions)iffile_path:annotated_frameself.load_image(file_path)self.display_image(annotated_frame)defselect_folder(self):folder_pathQFileDialog.getExistingDirectory(self,选择文件夹)iffolder_path:files[os.path.join(folder_path,f)forfinos.listdir(folder_path)iff.endswith((.bmp,.jpg,.jpeg,.png))]total_fileslen(files)self.progress_bar.setMaximum(total_files)self.progress_bar.setValue(0)self.progress_bar.setVisible(True)fori,file_pathinenumerate(files):annotated_frameself.load_image(file_path)self.display_image(annotated_frame)self.progress_bar.setValue(i1)self.progress_bar.setVisible(False)defselect_video(self):optionsQFileDialog.Options()file_path,_QFileDialog.getOpenFileName(self,选择视频,,视频 (*.mp4 *.avi);;所有文件 (*),optionsoptions)iffile_path:self.process_video(file_path)defprocess_video(self,video_path):self.capcv2.VideoCapture(video_path)whileself.cap.isOpened():ret,frameself.cap.read()ifnotret:breakresultsself.detect(frame)annotated_frameself.draw_annotations(frame,results)self.display_image(annotated_frame)ifcv2.waitKey(1)0xFFord(q):breakself.cap.release()defstart_camera(self):self.capcv2.VideoCapture(0)self.timer.start(30)defstop_camera(self):self.timer.stop()ifself.capisnotNone:self.cap.release()self.label_display.clear()defupdate_frame(self):ret,frameself.cap.read()ifnotret:returnresultsself.detect(frame)annotated_frameself.draw_annotations(frame,results)self.display_image(annotated_frame)defletterbox(img,new_shape(640,640),color(114,114,114),autoTrue,scaleFillFalse,scaleupTrue,stride32):shapeimg.shape[:2]# current shape [height, width]rmin(new_shape[0]/shape[0],new_shape[1]/shape[1])ifnotscaleup:# only scale down, do not scale up (for better test mAP)rmin(r,1.0)ratior,r# width, height ratiosnew_unpadint(round(shape[1]*r)),int(round(shape[0]*r))dw,dhnew_shape[1]-new_unpad[0],new_shape[0]-new_unpad[1]# wh paddingifauto:# minimum rectangledw,dhnp.mod(dw,stride),np.mod(dh,stride)# wh paddingelifscaleFill:# stretchdw,dh0.0,0.0new_unpad(new_shape[1],new_shape[0])rationew_shape[1]/shape[1],new_shape[0]/shape[0]# width, height ratiosdw/2# divide padding into 2 sidesdh/2ifshape[::-1]!new_unpad:# resizeimgcv2.resize(img,new_unpad,interpolationcv2.INTER_LINEAR)top,bottomint(round(dh-0.1)),int(round(dh0.1))left,rightint(round(dw-0.1)),int(round(dw0.1))imgcv2.copyMakeBorder(img,top,bottom,left,right,cv2.BORDER_CONSTANT,valuecolor)# add borderreturnimg,ratio,(dw,dh)defplot_one_box(x,img,colorNone,labelNone,line_thicknessNone):tlline_thicknessorround(0.002*(img.shape[0]img.shape[1])/2)1# line/font thicknessc1,c2(int(x[0]),int(x[1])),(int(x[2]),int(x[3]))cv2.rectangle(img,c1,c2,color,thicknesstl,lineTypecv2.LINE_AA)iflabel:tfmax(tl-1,1)# font thicknesst_sizecv2.getTextSize(label,0,fontScaletl/3,thicknesstf)[0]c2c1[0]t_size[0],c1[1]-t_size[1]-3cv2.rectangle(img,c1,c2,color,-1,cv2.LINE_AA)# filledcv2.putText(img,label,(c1[0],c1[1]-2),0,tl/3,[225,255,255],thicknesstf,lineTypecv2.LINE_AA)if__name____main__:appQApplication(sys.argv)windowMainWindow()window.show()sys.exit(app.exec_())运行步骤总结克隆项目仓库如果有的话gitclone https://github.com/yourusername/ir_drone_detection.gitcdir_drone_detection安装依赖项conda create--namedrone_envpython3.8conda activate drone_env pipinstall-rrequirements.txt下载YOLOv7代码gitclone https://github.com/WongKinYiu/yolov7.gitcdyolov7 pipinstall-rrequirements.txtcd..准备数据集将你的红外弱小飞机图像放入datasets/ir_drone/images目录。将对应的XML标注文件放入datasets/ir_drone/annotations目录。使用脚本划分数据集为训练集和验证集并生成train.txt和val.txt文件。示例脚本split_dataset.pyimportosimportrandomdefsplit_dataset(image_dir,annotation_dir,output_dir,train_ratio0.8):images[fforfinos.listdir(image_dir)iff.endswith((.bmp,.jpg,.jpeg,.png))]num_trainint(len(images)*train_ratio)train_imagesimages[:num_train]val_imagesimages[num_train:]withopen(os.path.join(output_dir,train.txt),w)asf:forimg_nameintrain_images:f.write(f{os.path.join(image_dir,img_name)}\n)f.write(f{os.path.join(annotation_dir,img_name.replace(.bmp,.xml).replace(.jpg,.xml).replace(.jpeg,.xml).replace(.png,.xml))}\n)withopen(os.path.join(output_dir,val.txt),w)asf:forimg_nameinval_images:f.write(f{os.path.join(image_dir,img_name)}\n)f.write(f{os.path.join(annotation_dir,img_name.replace(.bmp,.xml).replace(.jpg,.xml).replace(.jpeg,.xml).replace(.png,.xml))}\n)# 示例用法split_dataset(./datasets/ir_drone/images,./datasets/ir_drone/annotations,./datasets/ir_drone)训练模型python train.py评估模型python evaluate.py运行推理界面python infer.py操作界面选择图片进行检测点击“选择图片”按钮选择一张图片进行检测。选择文件夹批量检测点击“选择文件夹”按钮选择一个包含多张图片的文件夹进行批量检测。选择视频进行检测点击“选择视频”按钮选择一个视频文件进行检测。摄像头检测点击“开始摄像头”按钮使用摄像头进行实时检测点击“停止摄像头”按钮停止检测。详细解释requirements.txt列出项目所需的所有Python包及其版本。data.yaml配置数据集路径和类别信息用于YOLOv7模型训练。train.py加载预训练的YOLOv7模型并使用自定义数据集进行训练。训练完成后打印训练结果。evaluate.py加载训练好的YOLOv7模型并对验证集进行评估打印评估结果。infer.py创建一个GUI应用程序支持选择图片、文件夹、视频或使用摄像头进行实时检测并显示检测结果。的信息和代码能够帮助你顺利实施和优化你的红外弱小飞机目标检测系统。

相关新闻

AI落地为什么失败?—95%的企业AI项目死在workflow上

AI落地为什么失败?—95%的企业AI项目死在workflow上

来源: BG2 Pod / YouTube 嘉宾: Ali Ghodsi(Databricks CEO)、Arvind Jain(Glean CEO) 主持人: Apoorv Agrawal(Altimeter合伙人) 总时长: 45分00秒 博客日期…

2026/6/18 6:41:05阅读更多 →
TikTok加密参数逆向实战:从SSL Pinning绕过到算法黑盒调用

TikTok加密参数逆向实战:从SSL Pinning绕过到算法黑盒调用

1. 项目概述与核心价值最近在移动安全与数据采集领域,TikTok的加密参数逆向一直是个热门且颇具挑战性的话题。无论是出于安全研究、竞品分析,还是构建合规的数据处理管道,理解其客户端与服务器之间复杂的通信加密机制都至关重要。这个项目标题…

2026/6/18 6:41:05阅读更多 →
TradingView股票筛选器Python包终极指南:三步实现自动化交易分析

TradingView股票筛选器Python包终极指南:三步实现自动化交易分析

TradingView股票筛选器Python包终极指南:三步实现自动化交易分析 【免费下载链接】TradingView-Screener A package that lets you create TradingView screeners in Python 项目地址: https://gitcode.com/gh_mirrors/tr/TradingView-Screener TradingView-…

2026/6/18 6:41:05阅读更多 →
2026年,行业内热门磁滞测功机销售厂家,哪家才是靠谱之选?

2026年,行业内热门磁滞测功机销售厂家,哪家才是靠谱之选?

在工业制造、科研等众多领域,磁滞测功机作为一种重要的测试设备,其性能和质量直接影响着产品的研发和生产。随着2026年行业的发展,市场上磁滞测功机销售厂家众多,如何选择一家靠谱的厂家成为了许多用户的难题。今天,我…

2026/6/18 8:01:11阅读更多 →
DeepSeek-V4接口文档:生产级AI API设计范式升级

DeepSeek-V4接口文档:生产级AI API设计范式升级

1. 项目概述:这不是一份普通文档,而是一次接口设计范式的迁移“DeepSeek-V4接口文档的发布,有哪些技术突破和亮点?”——看到这个标题,很多开发者第一反应是点开链接、复制curl命令、调通第一个/v1/chat/completions请…

2026/6/18 8:01:11阅读更多 →
RAG 还是长上下文(Long Context)?2026 年检索增强到底该怎么选

RAG 还是长上下文(Long Context)?2026 年检索增强到底该怎么选

RAG 还是长上下文(Long Context)?2026 年检索增强到底该怎么选 这两年有个反复被问的问题:模型上下文窗口越来越大,有的已经能塞进上百万 token,那是不是就不需要 RAG(检索增强生成)…

2026/6/18 8:01:11阅读更多 →
Windows Auto Night Mode 11.0.0.54 官方版下载(夸克网盘+百度网盘,SHA256校验)

Windows Auto Night Mode 11.0.0.54 官方版下载(夸克网盘+百度网盘,SHA256校验)

Windows Auto Night Mode 11.0.0.54 官方版下载(夸克网盘百度网盘,SHA256校验) 国内访问 GitHub Release 有时较慢,这里把官方 Release 安装包同步到夸克网盘和百度网盘,方便下载。文件来自官方 GitHub Release&#x…

2026/6/18 8:01:11阅读更多 →
VALMET ND9106HX8-A3B-DS01 定位器工业应用场景指南

VALMET ND9106HX8-A3B-DS01 定位器工业应用场景指南

在大型化工与能源生产现场,阀门往往是整个流体控制系统中最关键却也最脆弱的环节。很多工程师都遇到过这样的棘手场景:装置刚投运时一切正常,一旦进入高温高压或强腐蚀的严苛工况,调节阀就开始出现振荡、卡涩甚至泄漏,…

2026/6/18 8:01:11阅读更多 →
React Page与现代化前端工具链集成:Webpack、Babel等工具的协同使用

React Page与现代化前端工具链集成:Webpack、Babel等工具的协同使用

React Page与现代化前端工具链集成:Webpack、Babel等工具的协同使用 【免费下载链接】react-page Easy Application Development with React JavaScript 项目地址: https://gitcode.com/gh_mirrors/re/react-page React Page作为一款专注于简化React应用开发…

2026/6/18 7:56:11阅读更多 →
ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

1. ZigBee HA:智能家居的“通用语言”与开发基石如果你正在或计划踏入智能家居设备开发领域,尤其是基于ZigBee协议,那么“ZigBee Home Automation”这个名词你一定不陌生。它不仅仅是ZigBee联盟定义的一套应用层规范,更是确保不同…

2026/6/18 0:00:24阅读更多 →
Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/18 0:00:24阅读更多 →
JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

1. 项目概述在嵌入式开发领域,尤其是基于NXP JN517x这类无线微控制器的项目中,系统稳定性和与外设的可靠交互是两大核心挑战。前者关乎产品能否在无人值守的复杂环境中长期运行,后者则决定了设备能否准确感知世界并与其他芯片“对话”。JN517…

2026/6/18 0:00:24阅读更多 →