基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的鸟类识别系统(Python+PySide6界面+训练代码)
摘要:本文详细阐述了一个利用深度学习进行鸟类识别的系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等先前版本进行了性能比较。该系统能够在图像、视频、实时视频流和批量文件中精确地识别和分类鸟类。文中不仅深入讲解了YOLOv8算法的工作原理,还提供了完整的Python代码实现、专门用于训练的数据集,以及一个基于PySide6的图形用户界面(UI)。此系统不仅能够精确识别图像中的鸟类,还具备基于SQLite的用户登录注册功能、支持一键切换YOLOv5/v6/v7/v8模型的能力,以及允许用户自定义修改界面等高级功能,以增强用户体验和系统的灵活性。本文旨在为相关领域的研究人员和新入门的朋友提供一个参考,完整代码资源文件以及数据集可以在文末的下载链接中获取。本文结构如下:
文章目录
- 前言
- 1.数据集介绍
- 2. 系统界面效果
- 3. YOLOv8算法原理
- 4. 代码简介
- 4.1 模型预测
- 4.2 模型训练
- 4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
- 4.4 代码实现
- 5. 鸟类识别系统实现
- 5.1 系统设计思路
- 5.2 登录与账户管理
- 下载链接
- 6. 总结与展望
- 结束语
➷点击跳转至文末所有涉及的完整代码文件下载页☇
基于YOLOv8/v7/v6/v5的鸟类识别系统演示与介绍(Python+PySide6界面+训练代码)
前言
在当今的生态研究和保护工作中,鸟类识别技术扮演着至关重要的角色。鸟类作为生态系统中的关键指标物种,其种群分布和行为模式的变化直接反映了自然环境的健康状况。随着人工智能和计算机视觉技术的迅速发展,尤其是深度学习算法的应用,鸟类识别的准确性和效率得到了显著提高。
鸟类识别技术的研究意义不仅仅体现在生物多样性的保护上,还极大地促进了生态学、动物学和环境科学等领域的研究。通过自动化的鸟类识别系统,研究人员能够在更大范围、更高效率地收集鸟类数据,为鸟类保护和生态系统管理提供科学依据。此外,这项技术还有助于公众教育和生态旅游,通过提高公众对鸟类和生态环境保护意识的同时,增强人们对自然的亲近感。
随着深度学习技术的迅猛发展,鸟类识别已经经历了从传统图像处理技术到基于深度神经网络的算法的转变。这一变化不仅显著提高了识别的准确率,而且在处理大规模数据集时展现了优越的性能。在早期,鸟类识别依赖于手工提取的特征和简单的分类器,如支持向量机(SVM)和决策树,这些方法在小规模数据集上表现尚可,但在复杂的现实世界场景中,其性能受限。
近年来,随着机器学习和深度学习技术的飞速发展,基于这些技术的鸟类识别系统也取得了显著进步。这些进步主要体现在算法的准确性、速度和适应性方面,尤其是YOLO1系列在实时物体检测领域的应用。自YOLOv1首次提出以来,每一个版本的更新都旨在提高速度和准确性,减少误检率。YOLOv52以其轻量级和高效性成为广泛使用的版本,而随后的YOLOv63、YOLOv74和YOLOv85进一步提升了性能和适用性,尤其是在处理复杂背景和多尺度对象时的准确度。
最新的研究显示,通过改进算法结构、优化训练过程和引入新的特征提取机制,可以有效提高鸟类识别的准确率和实时性。例如,一些研究通过引入注意力机制和深度可分离卷积来增强模型对鸟类细微特征的捕捉能力,从而提高在复杂环境中的识别准确性。此外,对数据增强技术的应用,如随机裁剪、旋转和尺度变换,也被证明能够有效增加模型的泛化能力,进一步提升识别性能。
当前的研究不仅关注于算法本身的改进,还包括对数据集的更新和扩充。由于高质量、多样化的数据集对于训练鲁棒性高的模型至关重要,研究人员致力于收集和标注更多种类的鸟类图像,以支持模型训练和验证。这些数据集不仅包含了不同种类的鸟类,还涵盖了各种环境背景,从而使模型能够适应更广泛的应用场景。
尽管取得了显著的进展,鸟类识别技术仍面临着多个挑战。首先是在复杂背景下的识别准确性,尤其是在自然环境中,背景噪声和光照条件的多变性对识别系统的性能影响显著。其次是对小目标和遮挡物体的识别问题,这在野生环境监测中尤为重要。最后,数据集的偏差和不平衡也是一个问题,大多数现有的数据集都集中在某些常见种类上,而对于稀有或地区性鸟种的识别能力有限。
本博客的分享重点在于介绍基于最新YOLOv8算法构建的鸟类识别系统,其主要贡献可以总结如下:
- 采用最先进的YOLOv8算法进行鸟类识别:本文深入探讨了YOLOv8算法在鸟类识别领域的应用,展示了其相较于YOLOv7、YOLOv6、YOLOv5等早期版本在效率和精确度方面的显著提升。通过对这些算法的对比分析,本文不仅阐明了YOLOv8的优势,也为鸟类识别技术的进步提供了新的研究思路和实践手段。
- 利用PySide6实现用户友好的鸟类识别系统:通过采用Python的PySide6库,本文展示了如何开发一个既美观又实用的鸟类识别系统界面。该系统提供了直观便捷的操作方式,极大地促进了YOLOv8算法的实际应用,推动了鸟类检测技术的广泛应用。
- 集成登录管理功能,提升系统安全性:本文设计并实现了登录管理功能,确保了系统使用的安全性和私密性,同时也为将来引入更多个性化功能奠定了基础。
- 对YOLOv8模型进行深入研究和性能评估:本文不仅实践了YOLOv8算法在鸟类识别中的应用,还对算法性能进行了全面的评估,包括精确度、召回率以及在不同环境下的表现等。这一部分的研究为理解和优化YOLOv8算法提供了详尽的数据和分析基础。
- 提供完整的数据集和代码资源包:为了让读者能够更好地复现和理解YOLOv8及其前序版本在鸟类识别中的应用,本文提供了一套完整的数据集和代码资源包。这些资源不仅便于读者直接进行实验和开发,也为未来的研究提供了宝贵的实践基础。
1.数据集介绍
在构建鸟类识别系统的过程中,一个精心准备和预处理的数据集是成功的关键。我们的数据集是专门为了训练、验证和测试基于YOLOv8算法的鸟类识别模型而设计的,它包含了总共2545张图像,这些图像经过了细致的分组,其中包括1697张训练图像、424张验证图像和424张测试图像。这样的分布为模型的训练和评估提供了坚实的基础,确保了评估过程的准确性和可靠性。
在数据预处理方面,所有图像都被统一调整到了640x640像素的尺寸。这一步骤是通过拉伸图像完成的,尽管这可能导致一定程度的形状变形,但它保证了模型能够在标准化的输入下进行训练和测试。统一的图像尺寸对于使用卷积神经网络(CNN)的算法尤为重要,因为它们通常要求输入图像具有固定的维度。
数据集的一个重要特点是其类别分布的均衡性。如图所示,数据集包含30个不同的鸟类类别,每个类别的实例数量相对平均,没有出现某些类别过多而其他类别过少的现象。这有助于避免模型在训练过程中对某些类别过拟合,同时确保了模型对所有类别具有均衡的识别能力。
此外,数据集中边界框的分布显示出良好的覆盖范围,覆盖了图像的各个区域,包括中心和边缘。这表明鸟类标注物体在图像中的位置具有多样性,这对于培养模型识别各种位置上鸟类的能力至关重要。同时,边界框的大小和形状也表现出多样性,这意味着模型能够适应并识别不同尺寸和姿态的鸟类。
中心点分布图揭示了大部分鸟类对象倾向于出现在图像中心区域的特点,但同时也有一定数量的对象分布在边缘区域,这有助于模型学习不同情境下的鸟类识别。宽高比的分布图显示了数据集中鸟类对象的形态多样性,这对于训练能够泛化到各种体型鸟类的模型非常有帮助。
我们的数据集不仅具有多样的图像,还提供了详细的类别标签。每张图片都经过了仔细的标注,确保了模型能够在准确性和分类能力上达到较高标准。这些标签对于训练阶段的损失函数计算以及模型评估阶段的性能指标计算都至关重要。博主使用的类别代码如下:
Chinese_name={'Acadian_Flycatcher':"绿纹捕蝇雀",'American_Crow':"美洲乌鸦",'American_Goldfinch':"金翅雀",
'American_Pipit':"琵琶鸟",'American_Redstart':"红尾鸲",'American_Three_toed_Woodpecker':"三趾啄木鸟",'Anna_Hummingbird':"朱红蜂鸟",'Artic_Tern':
"亚热带燕鸥",'Baird_Sparrow':"贝氏草雀",'Baltimore_Oriole':"巴尔的摩金莺",'Bank_Swallow':"灰沙燕",'Barn_Swallow':
"家燕",'Bay_breasted_Warbler':"湾胸莺",'Belted_Kingfisher':"带翠鸟",'Bewick_Wren':"布威克鹪鹩",'Black_Tern':
"黑燕鸥",'Black_and_white_Warbler':"黑白林莺",'Black_billed_Cuckoo':"黑喙杜鹃",'Black_capped_Vireo':"黑顶莺雀",
'Black_footed_Albatross':"黑足信天翁",'Black_throated_Blue_Warbler':"黑喉蓝林莺",'Black_throated_Sparrow':"黑喉麻雀",
'Blue_Grosbeak':"蓝蜡嘴鸟",'Blue_Jay':"冠蓝鸦",'Blue_headed_Vireo':"蓝头莺雀",'Blue_winged_Warbler':"蓝翅虫森莺",
'Boat_tailed_Grackle':"宽尾拟八哥",'Bobolink':"食米鸟",'Bohemian_Waxwing':"太平鸟",'Brandt_Cormorant':"加州鸬鹚",
'Brewer_Blackbird':"蓝头黑鹂",'Brewer_Sparrow':"布氏麻雀",'Bronzed_Cowbird':"铜色牛鹂",'Brown_Creeper':"金冠戴菊鸟",
'Brown_Pelican':"褐鹈鹕",'Brown_Thrasher':"褐鸫"}
综合以上特点,我们的数据集为鸟类识别问题提供了一个均衡且多样化的训练和测试平台。通过详尽的预处理和增强处理,我们确保了数据集能够支持模型学习到从不同角度和距离观察鸟类时的关键特征。这种方法不仅增强了模型对各种光照条件和背景噪声的鲁棒性,而且还提高了模型对不同鸟类体型和姿态的识别能力。这个数据集的准备为我们的鸟类识别系统提供了一个坚实的起点,有望实现高准确率和高效率的目标检测。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行鸟类识别的图片或视频,或者启动摄像头进行实时检测。在进行鸟类识别时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8算法是目前最先进的目标检测算法之一,它继承并发展了YOLO系列算法的特点,特别是在速度和准确性方面进行了显著的优化。与其前身YOLOv5相比,YOLOv8引入了新的架构和损失函数的改进,从而在多个标准测试集上取得了最先进的结果。
YOLOv8在架构上进行了重要的创新。它采用了更深的网络结构,同时也加入了多尺度预测,能够更准确地检测各种大小的目标。此外,YOLOv8在特征提取器上也做了改进,通过增强网络中的信息流,使得特征图能够包含更加丰富和有区分度的特征信息。这一点通过对C3模块的改进得以实现,C2f和C3模块在模型中起到了融合不同层次信息的作用,从而提高了特征的表征能力,有助于模型捕捉到更加精细的目标特征。
在损失函数的设计上,YOLOv8也展现了创新性。它引入了Distribution Focal Loss,这是一种新型的损失函数,专为解决类别不平衡问题而设计。传统的Focal Loss通过减少易分类样本的权重来解决类别不平衡,但Distribution Focal Loss则进一步,考虑了标签分布的整体形状,使得模型能够更加敏感地调整权重,特别是在存在大量负样本的情况下,这种方法能够有效地提高模型的学习效率和性能。
YOLOv8还采用了Task Aligned Assigner,这是一种新的标签分配机制,用于在训练过程中有效地将标签分配给预测框。这个机制通过考虑任务对齐原则,确保了标签分配的准确性和一致性。Task Aligned Assigner通过优化标签分配过程,减少了模型在学习过程中的混淆和不确定性,这对于目标检测任务来说至关重要。
总的来说,YOLOv8通过这些技术创新,在目标检测领域实现了突破性的进步。它的算法结构设计,结合了深度学习领域的最新研究成果,使得模型在处理实际应用中的复杂场景时具有更高的准确性和鲁棒性。通过本博客对YOLOv8原理的详细介绍,我们希望为读者提供深入的理解,并为未来在该领域的研究和应用探索开辟新的道路。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行鸟类识别的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))
然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。
img_path = abs_path("test_media/test.png")
image = cv_imread(img_path)
在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。
pred, superimposed_img = model.predict(pre_img)
4.2 模型训练
这里我们开始训练和测试自己的数据集,在cmd终端或pycharm中运行run_train_model.py进行训练,以下是训练过程中的结果截图。YOLOv8的损失函数是其性能的关键部分,它指导模型学习如何准确地检测和分类对象。
以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(lr0 ) | 0.01 | 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。 |
学习率衰减(lrf ) | 0.01 | 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。 |
动量(momentum ) | 0.937 | 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。 |
权重衰减(weight_decay ) | 0.0005 | 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。 |
热身训练周期(warmup_epochs ) | 3.0 | 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。 |
批量大小(batch ) | 16 | 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。 |
输入图像大小(imgsz ) | 640 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。
from ultralytics import YOLO
model = YOLO('./weights/yolov8s.pt', task='detect')
接着开始训练模型。其中指定了训练数据的配置文件路径,使用GPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练100个epoch,每个批次的大小为8。
results2 = model.train( data=data_path,device='0', workers=workers, imgsz=640, epochs=120, batch=batch, name='train_v8_' + data_name )
首先,让我们考察损失函数的变化趋势。在训练损失图中,包括边界框损失(train/box_loss)、分类损失(train/cls_loss)以及Distribution Focal Loss(train/df1_loss),所有这些指标随着训练周期(epoch)的增加呈现下降趋势,这表明模型的预测准确性随着训练的进行在不断提高。这些损失函数的下降趋势平滑且稳定,表明模型训练过程中的优化是有效的,没有出现过拟合或其他明显的问题。特别是在初期阶段,损失快速下降,显示了模型在捕捉数据特征方面的快速进步。
同时,验证集上的损失值(val/box_loss、val/cls_loss、val/df1_loss)也表现出类似的下降趋势,这进一步验证了模型具有良好的泛化能力。这些指标在训练过程中保持较低水平,并且与训练损失的趋势一致,这意味着模型在未见数据上的表现与训练数据上相似,这是模型泛化能力强的一个重要信号。
接下来,关于模型的精确度和召回率,我们看到metrics/precision(B)和metrics/recall(B)在训练过程中稳步提升,尤其是召回率,它快速提升至接近0.8的水平,并在后期保持稳定。这表明模型能够检测出数据集中的大部分正样本,同时保持较少的误检。精确度在训练后期也达到了高水平,这意味着模型的预测在很大程度上是准确的,只有少数正样本被错误标记。
最后,平均精确度(mAP)指标,特别是metrics/mAP50(B)和metrics/mAP50-95(B),都显示出随训练周期增加而逐渐上升的趋势。mAP50在早期迅速上升并在后期趋于平稳,这表明模型对于检测IoU阈值为50%的对象非常有效。另一方面,mAP50-95是一个更为严格的指标,它考虑了从50%到95%不同IoU阈值的平均性能,这个指标的提升表明模型在各种严格条件下都具有很好的检测性能。
在目标检测系统中,精确度-召回率(Precision-Recall,PR)曲线是衡量模型性能的重要工具。PR曲线通常用于评估模型在不同置信度阈值下的表现,它反映了模型预测正确正样本的能力与其尝试检测所有正样本的能力之间的关系。精确度是指模型预测为正的样本中实际为正的比例,而召回率是指模型预测出的正样本占所有实际正样本的比例。
模型在不同的召回率水平上保持了较高的精确度。曲线下的面积(Average Precision, AP)对于每个类别都进行了计算,并且在图表中标明了所有类别平均mAP(mean Average Precision)为0.919(mAP@0.5),这是一个非常优秀的结果。mAP@0.5指的是在IoU(Intersection over Union)阈值为0.5时的平均精确度,这是目标检测领域中常用的评估标准。一个接近0.92的mAP分数表明在该IoU阈值下,模型对大多数类别都有着非常准确的检测能力。
PR曲线中的波动线表示每个类别的PR曲线,而蓝色的平滑线表示所有类别的平均曲线。曲线上部的平滑性说明在高召回率时,模型能够维持较高的精确度,这意味着即使模型尝试检测更多的正样本(即高召回率),它仍然能够保持较少的误报。通常,一个良好的目标检测模型在高召回率时精确度会有所下降,因为增加召回率往往会导致更多的误报。然而,在这个模型中,精确度与召回率之间的平衡被非常好地维持了。
此外,PR曲线的起点在精确度轴上非常接近1.0,这表明在较低的召回率或较高的置信度阈值时,模型几乎能够完美地预测正样本。随着召回率的提高,精确度逐渐下降,这是正常现象,因为模型尝试检测更多可能的正样本,从而可能包含一些误报。
总结来说,这个目标检测模型展现了出色的性能,尤其在检测任务中达到了高精确度和高召回率的平衡。0.919的mAP得分显示了模型在大多数情况下都能够做出准确的预测,而PR曲线的形状则证明了模型的稳健性。这样的性能使得该模型非常适用于实际应用,特别是在对精确度要求极高的场合,如野生动物监测或在复杂背景中的鸟类识别等。通过进一步优化和调整模型参数,有可能进一步提升模型在极端情况下的表现,比如在更高的IoU阈值下保持高mAP。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(1)实验设计:
本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在鸟类目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含鸟类的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。
模型 | 图像大小 (像素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 参数数量 (百万) | FLOPs (十亿) |
---|---|---|---|---|---|---|
YOLOv5nu | 640 | 34.3 | 73.6 | 1.06 | 2.6 | 7.7 |
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv6N | 640 | 37.5 | - | - | 4.7 | 11.4 |
YOLOv7-tiny | 640 | 37.4 | - | - | 6.01 | 13.1 |
(2)度量指标:
- F1-Score:F1-Score是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
- mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.888 | 0.912 | 0.860 | 0.919 |
F1-Score | 0.81 | 0.86 | 0.81 | 0.84 |
(3)实验结果分析:
YOLOv5nu 的mAP得分为0.888,F1-Score为0.81,这显示了YOLOv5nu具有相对较高的检测精度和平衡的精确度与召回率。它在这四个版本中的性能表现良好,但不是最优的。这个版本的YOLO是在YOLOv4之后开发的,带来了一些改进,但在接下来的版本中有了进一步的优化。
YOLOv6n 在mAP得分上达到了0.912,F1-Score为0.86,这一结果比YOLOv5nu有显著提高。这表明YOLOv6n在检测准确性和识别能力上都有所提升。YOLOv6n的优势可能来自于网络架构的改进和更有效的特征提取能力。
YOLOv7-tiny 的表现稍逊,mAP为0.860,F1-Score与YOLOv5nu持平,为0.81。作为一个轻量级的模型,YOLOv7-tiny的设计目标是在保持较快速度的同时提供合理的准确性,因此,它的性能略低也在预期之内。这可能是因为为了减少计算量,牺牲了一些准确性。
YOLOv8n 则在这次的实验中表现最佳,mAP高达0.919,F1-Score为0.84。这显示了YOLOv8n在准确性和召回平衡方面的出色性能。YOLOv8n的这一成绩可能归功于它在模型架构、损失函数和训练技巧上的全面优化。
通过对比这四个版本的YOLO,我们可以看到YOLO系列随着版本更新,性能有了显著的提升。YOLOv8n在这项实验中展现了其在精度和平衡性能方面的优势,这使得它非常适合需要高准确性和综合性能的目标检测任务。这些改进的背后是YOLO开发者不断的创新和算法优化,反映了深度学习领域持续进步的趋势。然而,每种模型的选择还需要考虑具体任务的需求,如实时性、计算资源和应用场景等,这些因素都可能影响最终的选择。
4.4 代码实现
在这篇博客中,我们将探索如何使用Python和YOLOv8创建一个高性能的鸟类识别系统。这个系统不仅能够实时处理图像数据,而且还具有友好的用户界面,使得用户可以轻松地进行物体检测和识别。本文将展示整个过程的关键步骤,包括模型加载、图像预处理、检测推理以及结果展示。
在实时鸟类识别系统中,需要结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及鸟类的检测和标注等功能。
(1)导入必要的模块和配置
首先,我们引入必要的Python库。我们的系统基于几个关键的Python库来构建。首先是cv2,即OpenCV库,它是处理图像和视频数据的强大工具。我们还利用了PySide6库来创建图形用户界面(GUI),它允许我们以视觉友好的方式展示检测结果。另外,我们还使用了自定义的QtFusion库来简化媒体流的处理。
import random # 用于生成随机颜色
import sys # 用于访问Python解释器相关的功能
import time # 用于记录操作所需的时间
from QtFusion.config import QF_Config
import cv2 # OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 用于创建GUI窗口
from QtFusion.utils import cv_imread, drawRectBox # 辅助函数,用于图像读取和绘制
from PySide6 import QtWidgets, QtCore # 构建图形用户界面
from QtFusion.path import abs_path
QF_Config.set_verbose(False)
这一部分主要负责导入各种模块。random用于随机颜色生成,sys和time分别用于系统操作和时间处理。cv2是图像处理的核心,而QtFusion和PySide6则用于构建用户界面。
(2)定义类别和模型
我们首先导入了YOLOv8Detector类。这个类负责物体检测任务,能够加载我们预先训练好的YOLOv8模型。
from YOLOv8Model import YOLOv8Detector
from datasets.Bird.label_name import Label_list
(3)创建主窗口
接下来,我们定义了MainWindow类,这是我们应用程序的主窗口。它使用Qt框架来创建并管理GUI元素。我们在这个窗口中添加了一个QLabel,用于显示实时更新的图像。
class MainWindow(QMainWindow): # 自定义主窗口类def __init__(self): # 构造函数super().__init__() # 调用父类构造函数self.resize(850, 500) # 设置窗口大小self.label = QtWidgets.QLabel(self) # 创建标签用于显示图像self.label.setGeometry(0, 0, 850, 500) # 设置标签位置和大小def keyPressEvent(self, event): # 键盘事件处理if event.key() == QtCore.Qt.Key.Key_Q: # 按下Q键时self.close() # 关闭窗口
在我们的系统中,MainWindow类继承自QMainWindow,它是主窗口的基础。在这个类中,我们设置了窗口的大小,并且初始化了一个标签来显示处理过的图像。我们还定义了keyPressEvent函数来处理用户的键盘输入,当用户按下’Q’键时,程序会安全退出。
(4)主程序流程
在主函数的实现中,我们创建了应用程序对象和主窗口实例。我们还设定了一个MediaHandler来处理视频流,这将使我们能够接收来自摄像头的实时帧,并将它们送入我们的模型进行物体检测。
cls_name = Label_list # 定义类名列表model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数
videoHandler.setDevice(device=0) # 设置设备为0,即默认的摄像头
videoHandler.startMedia() # 开始处理媒体流# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
处理视频流的核心功能在frame_process函数中实现。该函数首先调整捕获的图像大小,以符合YOLOv8模型的输入要求。然后使用model.predict方法进行物体检测,并计算这一过程所需的时间。这对于监控系统性能和优化处理流程非常有帮助。如果检测到物体,我们使用drawRectBox函数在图像上绘制边界框,并通过颜色编码来区分不同的鸟类。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像image = cv2.resize(image, (850, 500)) # 调整图像的大小pre_img = model.preprocess(image) # 对图像进行预处理t1 = time.time() # 获取当前时间pred, superimposed_img = model.predict(pre_img) # 使用模型进行预测t2 = time.time() # 获取当前时间use_time = t2 - t1 # 计算预测所用的时间print("推理时间: %.2f" % use_time) # 打印预测所用的时间det = pred[0] # 获取预测结果# 如果有检测信息则进入if det is not None and len(det):det_info = model.postprocess(pred) # 对预测结果进行后处理for info in det_info: # 遍历检测信息name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_id'] # 获取类名、边界框、置信度和类别IDlabel = '%s %.0f%%' % (name, conf * 100) # 创建标签,包含类名和置信度# 画出检测到的目标物image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在图像上绘制矩形框,并添加标签和颜色window.dispImage(window.label, image) # 在窗口的label控件上显示图像
处理完预测结果后,我们使用drawRectBox函数在图像上绘制边界框,并添加了类别标签和置信度。这样的视觉反馈对于用户来说是直观的,可以立即识别出图像中的鸟类。最后,我们利用QtFusion库中的MediaHandler类来处理实时视频流。MediaHandler对象设置为每秒30帧,以流畅地捕捉视频并实时显示检测结果。
5. 鸟类识别系统实现
在设计交互式鸟类检测与识别系统的过程中,我们采取了一个模块化和层次化的方法,以确保系统既高效又易于维护。我们的系统设计思路是围绕用户体验来构建的,旨在提供一个直观、响应迅速的用户界面,同时在后台执行复杂的图像处理和目标检测任务。
5.1 系统设计思路
在我们的系统设计中,我们的主要目标是创建一个交互式的鸟类识别与识别系统,它不仅能够实时处理图像并进行目标检测,而且还能提供直观的用户交互界面。我们的系统是围绕MainWindow类构建的,它集成了用户界面、媒体处理和深度学习模型,使得用户可以轻松地加载图像、执行目标检测,并查看结果。
(1)架构设计
我们的设计理念是通过高度模块化的方法,将复杂的技术细节抽象化,从而让用户可以不必关注背后的复杂算法就能够进行鸟类检测与识别。具体来说,我们将系统划分为三个主要层次:处理层、界面层和控制层,每层均担负着独特的职责,相互协作以达到整体功能。
- 处理层(Processing Layer):这一层的核心是YOLOv8Detector类,它封装了YOLOv8算法的实现和预训练模型。此层负责处理从摄像头或其他媒体源输入的图像数据,执行目标检测和识别任务,并输出检测结果。为了优化性能,处理层会在后台运行,确保不会影响到前端的用户交互。
- 界面层(UI Layer):界面层是用户与系统交互的前端,由Ui_MainWindow类构建。它包含了各种UI元素,例如显示检测结果的画布、控制检测过程的按钮,以及显示系统状态的标签。这一层的设计考虑了用户的操作习惯和视觉体验,旨在使用户的操作尽可能直观和简单。
- 控制层(Control Layer):控制层是整个系统的指挥中心,由MainWindow类承担。它负责处理用户的输入,调用处理层的功能,并将结果反馈到界面层。控制层使用了Qt的信号和槽机制,这是一个强大的事件处理系统,允许不同的组件以松耦合的方式交互。当用户触发一个事件(如点击按钮)时,信号会被发送,相应的槽函数会被调用,执行如启动或停止视频流的操作。
通过这种层次化的设计,我们的系统将复杂的图像处理和目标检测功能隐藏在一个简洁、易于使用的界面后面。用户不需要理解YOLOv8算法的内部工作原理或处理层的复杂编码细节,就能通过点击几个按钮来进行复杂的鸟类检测任务。这不仅提高了系统的易用性,也使得后续的维护和升级变得更加容易。我们相信,通过这种设计,即使是没有技术背景的用户也能够轻松地使用我们的系统来执行鸟类检测和识别任务。
(2)系统流程
在本博客中,我们将详细探讨我们开发的交互式鸟类检测与识别系统的工作流程。这个系统以其用户友好的界面和强大的后端处理能力,为用户提供了一个简单直观的方式来进行实时物体检测。
-
一旦用户启动应用程序,系统立即进入行动,创建了MainWindow类的实例。这是整个应用的核心,负责初始化用户界面和设置必要的参数。MainWindow的实例化过程中,界面元素如按钮、标签、图像显示框等都被创建并布置在用户界面上。这些元素不仅为用户提供了交云检测与识别系统的操作入口,同时也确保了后续步骤的顺利进行。
-
系统设计了一个直观的界面,允许用户轻松选择输入源。输入源的选择范围广泛,可以是实时摄像头捕捉的图像流、视频文件,甚至是单个的静态图像。无论用户的选择是哪一种,系统都能够灵活地调用内置的媒体处理器和方法来正确处理这些数据,无需用户关心背后复杂的配置细节。
-
当用户确定了输入源后,系统就开始了数据处理的旅程。如果用户选择了摄像头,系统会自动配置摄像头,并开始捕获图像流;如果选择了视频文件或图像,系统则会加载对应的文件。在这一阶段,用户界面会提供实时反馈,让用户知道系统状态,确保用户对正在发生的事情保持控制和了解。
-
媒体输入源准备就绪后,系统进入了关键的连续帧处理循环。首先,每一帧图像首先经过预处理,预处理操作包括调整图像尺寸、色彩空间转换和归一化等,以确保图像数据满足YOLO模型的输入要求。这些步骤对于确保模型能够正确解读输入数据至关重要。其次,经过预处理的图像送入YOLOv8模型进行处理。利用其深度学习的能力,模型识别出图像中的目标,并给出位置和类别。这一阶段的速度和准确性对于用户体验尤为关键。最后,检测结果一旦产生,界面将立即更新。检测框和类别标注将在图像上实时展示。同时,系统还提供了展示统计数据的界面元素,如表格和图表,帮助用户更好地理解检测结果。
-
系统的设计允许用户与检测过程进行互动。用户可以利用界面上的按钮来保存检测结果,查询系统信息,或者通过下拉菜单进行更细致的结果筛选和分析。这些交互操作不仅提高了用户体验,也使得系统的应用更加灵活,满足不同用户的需求。
总的来说,我们的系统设计思路旨在提供一个功能全面、操作简便、响应迅速的鸟类识别与识别平台。通过将先进的YOLOv8模型与精心设计的用户界面结合,我们确保了用户无论技术背景如何都能轻松地利用强大的目标检测功能,无缝地进行实时数据分析和处理。
5.2 登录与账户管理
在开发这个先进的鸟类识别系统时,我们不仅注重其技术能力,也深刻理解到用户体验的重要性。正因为如此,系统被赋予了一个全面的账户管理功能,该功能基于PySide6构建,后端则采用了SQLite数据库,为用户提供了一套完整的个人账户管理解决方案。
账户管理是用户个性化体验的核心,它使得用户能够在系统中拥有自己的私人空间。在这个空间里,用户可以保存他们的检测结果和个人设置,如图像处理偏好、模型选择等。这不仅为用户提供了便利,还增强了系统的安全性,确保了用户数据的私密性。
具体到功能,用户首先会在登录界面完成账户的注册,这个过程涵盖了用户名、密码的设置,以及头像的个性化选择。系统还提供了密码修改的功能,让用户在忘记密码或者需要更新密码时,可以轻松进行操作。账户注销功能则允许用户在不再使用系统时,将自己的账户从系统中彻底移除。
这些账户管理功能的实现,体现了我们对用户隐私和安全的重视。通过细致的设计,用户在使用系统进行鸟类识别时,能够感受到一种安全和信任感。此外,系统还为每个用户提供了重新登录的快捷方式,确保了即使在暂时退出系统后,用户也能迅速回到他们的个人界面中。
通过账户管理系统,用户可以根据自己的喜好和需求,进行头像设置和其他个性化配置。这些设置不仅让用户界面更加友好,也让用户的操作变得更加直观。在用户完成注册和登录后,系统主界面将展示所有必要的信息,包括检测框、类别和置信度等,用户可以直接进行鸟类识别的操作。
我们的系统支持多种输入源,包括图片、视频文件、实时摄像头捕捉以及批量文件处理,这些都被无缝整合在用户界面中。用户可以在登录后,立即开始鸟类识别任务,系统将实时显示识别结果,并提供存储和管理功能。
综上所述,通过这些综合设计的账户管理功能,我们的鸟类识别系统不仅在技术上实现了先进的多物体识别和检测能力,也在用户体验上提供了个性化和安全的服务。我们坚信,这些功能将满足用户在实时目标检测场景下的多样化需求,为他们提供一个高效、安全且便捷的使用体验。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1u6421u73q/
在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,另外有详细安装教程:(1)Pycharm软件安装教程;(2)Anaconda软件安装教程;(3)Python环境配置教程;
离线依赖安装教程:https://www.bilibili.com/video/BV1hv421C7g8/
离线依赖库下载链接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取码:33z5)
6. 总结与展望
在本博客中,我们详细介绍了一个基于YOLOv8模型的鸟类识别系统,还实验了YOLOv7、YOLOv6、YOLOv5等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的鸟类识别和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
Wu W, Liu H, Li L, et al. Application of local fully Convolutional Neural Network combined with YOLO v5 algorithm in small target detection of remote sensing image[J]. PloS one, 2021, 16(10): e0259283. ↩︎
Li C, Li L, Jiang H, et al. YOLOv6: A single-stage object detection framework for industrial applications[J]. arXiv preprint arXiv:2209.02976, 2022. ↩︎
Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475. ↩︎
Talaat F M, ZainEldin H. An improved fire detection approach based on YOLO-v8 for smart cities[J]. Neural Computing and Applications, 2023, 35(28): 20939-20954. ↩︎
相关文章:

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的鸟类识别系统(Python+PySide6界面+训练代码)
摘要:本文详细阐述了一个利用深度学习进行鸟类识别的系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等先前版本进行了性能比较。该系统能够在图像、视频、实时视频流和批量文件中精确地识别和分类鸟类。文中不仅深入讲解了YO…...

核密度分析
一.算法介绍 核密度估计(Kernel Density Estimation)是一种用于估计数据分布的非参数统计方法。它可以用于多种目的和应用,包括: 数据可视化:核密度估计可以用来绘制平滑的密度曲线或热力图,从而直观地表…...

先进语言模型带来的变革与潜力
用户可以通过询问或交互方式与GPT-4这样的先进语言模型互动,开启通往知识宝库的大门,即时访问人类历史积累的知识、经验与智慧。像GPT-4这样的先进语言模型,能够将人类历史上积累的海量知识和经验整合并加以利用。通过深度学习和大规模数据训…...

重铸安卓荣光——上传图片组件
痛点: 公司打算做安卓软件,最近在研究安卓,打算先绘制样式 研究发现安卓并不像前端有那么多组件库,甚至有些基础的组件都需要自己实现,记录一下自己实现的组件 成品展示 一个上传图片的组件 可以选择拍照或者从相册中…...

Bert基础(四)--解码器(上)
1 理解解码器 假设我们想把英语句子I am good(原句)翻译成法语句子Je vais bien(目标句)。首先,将原句I am good送入编码器,使编码器学习原句,并计算特征值。在前文中,我们学习了编…...

Visual Studio快捷键记录
日常使用Visual Studio进行开发,记录一下常用的快捷键: 复制:CtrlC剪切:CtrlX粘贴:CtrlV删除:CtrlL撤销:CtrlZ反撤销:CtrlY查找:CtrlF/CtrlI替换:CtrlH框式选…...

分享84个Html个人模板,总有一款适合您
分享84个Html个人模板,总有一款适合您 84个Html个人模板下载链接:https://pan.baidu.com/s/1GXUZlKPzmHvxtO0sm3gHLg?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集…...

vue使用.sync和update实现父组件与子组件数据绑定的案例
在 Vue 中,.sync 是一个用于实现双向数据绑定的特殊修饰符。它允许父组件通过一种简洁的方式向子组件传递一个 prop,并在子组件中修改这个 prop 的值,然后将修改后的值反馈回父组件,实现双向数据绑定。 使用 .sync 修饰符的基本语…...

C语言系列15——C语言的安全性与防御性编程
目录 写在开头1 缓冲区溢出:如何防范与处理1.1 缓冲区溢出的原因1.2 预防与处理策略 2. 安全的字符串处理函数与使用技巧2.1 strncpy函数2.2 snprintf函数2.3 strlcpy函数2.4 使用技巧 3 防御性编程的基本原则与实际方法3.1 基本原则3.2 实际方法 写在最后 写在开头…...

objectMapper、ObjectNode、JsonNode调用接口时进行参数组装
objectMapper、ObjectNode、JsonNode用于调用接口时进行参数组装 public String sendText( List< String > listUser, String content ) throws JsonProcessingException{if ( listUser.size() < 0 ){return "用户ID为空!";}if ( content.lengt…...

2024开年,手机厂商革了自己的命
文|刘俊宏 编|王一粟 2024开年,AI终端的号角已经由手机行业吹响。 OPPO春节期间就没闲着,首席产品官刘作虎在大年三十就迫不及待地宣布,OPPO正式进入AI手机时代。随后在开年后就紧急召开了AI战略发布会,…...

【安全】大模型安全综述
大模型相关非安全综述 LLM演化和分类法 A survey on evaluation of large language models,” arXiv preprint arXiv:2307.03109, 2023.“A survey of large language models,” arXiv preprint arXiv:2303.18223, 2023.“A survey on llm-gernerated text detection: Necess…...

Stable Diffusion 模型分享:AstrAnime(Astr动画)
本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 AstrAnime 是一个动漫模型,画风色彩鲜明,擅长绘制漂亮的小姐姐。 条目内容类型大模型…...

【GPTs分享】每日GPTs分享之Canva
简介 Canva,旨在帮助用户通过Canva的用户友好设计平台释放用户的创造力。无论用户是想设计海报、社交媒体帖子还是商业名片,Canva都在这里协助用户将创意转化为现实。 主要功能 设计生成:根据用户的描述和创意需求,生成定制的设…...

【机器学习】数据清洗——基于Pandas库的方法删除重复点
🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...

顺序表增删改查(c语言)
main函数: #include <stdio.h>#include "./seq.h"int main(int argc, const char *argv[]){SeqList* list create_seqList();insert_seqList(list,10);insert_seqList(list,100);insert_seqList(list,12);insert_seqList(list,23);show_seqList(l…...

MyBatis Plus中的动态表名实践
随着数据库应用的不断发展,面对复杂多变的业务需求,动态表名的处理变得愈发重要。在 MyBatis Plus(以下简称 MP)这一优秀的基于 MyBatis 的增强工具的支持下,我们可以更便捷地应对动态表名的挑战。本文将深入研究如何在…...

JAVA IDEA 项目打包为 jar 包详解
前言 如下简单 maven 项目,现在 maven 项目比较流行,你还没用过就OUT了。需要打包jar 先设置:点击 File > Project Structure > Artifacts > 点击加号 > 选择JAR > 选择From modules with dependencies 一、将所有依赖和模…...

概率基础——几何分布
概率基础——几何分布 介绍 在统计学中,几何分布是描述了在一系列独立同分布的伯努利试验中,第一次成功所需的试验次数的概率分布。在连续抛掷硬币的试验中,每次抛掷结果为正面向上的概率为 p p p,反面向上的概率为 1 − p 1-p …...

JavaScript的内存管理与垃圾回收
前言 JavaScript提供了高效的内存管理机制,它的垃圾回收功能是自动的。在我们创建新对象、函数、原始类型和变量时,所有这些编程元素都会占用内存。那么JavaScript是如何管理这些元素并在它们不再使用时清理它们的呢? 在本节中,…...

Neo4j导入数据之JAVA JDBC
目录结构 前言设置neo4j外部访问代码整理maven 依赖java 代码 参考链接 前言 公司需要获取neo4j数据库内容进行数据筛查,neo4j数据库咱也是头一次基础,辛辛苦苦安装好整理了安装neo4j的步骤,如今又遇到数据不知道怎么创建,关关难…...

LeetCode 2878.获取DataFrame的大小
DataFrame players: ------------------- | Column Name | Type | ------------------- | player_id | int | | name | object | | age | int | | position | object | | … | … | ------------------- 编写一个解决方案,计算并显示 players 的 行数和列数。 将结…...

索引失效的 12 种情况
目录 一、未使用索引字段进行查询 二、索引列使用了函数或表达式 三、使用了不等于(! 或 <>)操作符 四、LIKE 操作符的模糊查询 五、对索引列进行了数据类型转换 六、使用 OR 连接多个条件 七、表中数据量较少 八、索引列上存在大量重复值…...

Spring及工厂模式概述
文章目录 Spring 身世什么是 Spring什么是设计模式工厂设计模式什么是工厂设计模式简单的工厂设计模式通用的工厂设计 总结 在 Spring 框架出现之前,Java 开发者使用的主要是传统的 Java EE(Java Enterprise Edition)平台。Java EE 是一套用于…...

运维SRE-19 网站Web中间件服务-http-nginx
Ans自动化流程 1.网站集群核心协议:HTTP 1.1概述 web服务:网站服务,网站协议即可. 协议:http协议,https协议 服务:Nginx服务,Tengine服务....1.2 HTTP协议 http超文本传输协议,负责数据在网站…...

C语言—自定义(构造)类型
2.20,17.56 1.只有当我们使用结构体类型定义变量/结构体数组,系统才会为结构体的成员分配内存空间,用于存储对应类型的数据 2.strct 结构体 一起作为结构体类型标识符 嘿嘿暂时先这样,我会回来改的1、定义一个表示公交线路的结构体,要…...

ArcgisForJS如何实现添加含图片样式的点要素?
文章目录 0.引言1.加载底图2.获取点要素的坐标3.添加含图片样式的几何要素4.完整实现 0.引言 ArcGIS API for JavaScript 是一个用于在Web和移动应用程序中创建交互式地图和地理空间分析应用的库。本文在ArcGIS For JavaScript中使用Graphic对象来创建包含图片样式的点要素。 …...

C#之WPF学习之路(2)
目录 控件的父类 DispatcherObject类 DependencyObject类 DependencyObject 类的关键成员和方法 Visual类 Visual 类的主要成员和方法 UIElement类 UIElement 类的主要成员和功能 FrameworkElement类 FrameworkElement 类的主要成员和功能 控件的父类 在 WPF (Windo…...

胶原抗体诱导小鼠关节炎模型
胶原诱导性关节炎小鼠(CIA)作为人类类风湿关节炎模型应用广泛,但CIA引起的关节炎起病比较缓慢,造模周期较长,一般为6-8周(1-12)。Chondrex公司已开发出单一种单克隆抗体合剂诱导的小鼠关节炎模型(CAIA),明显缩短了造模…...

集百家所长的开放世界游戏,艾尔莎H311-PRO带你玩转《幻兽帕鲁》
随着近几年开放世界游戏热潮的兴起,如今这类游戏可以说是像雨后春笋般不断推出,比如《幻兽帕鲁》就是近期非常火热的一个代表,它不仅集合了生存、建造、宠物养成等多种元素,而且可爱的卡通画风格更是老少皆宜。那么,这…...