草庐IT

动物识别系统 python实现+UI

斑马还没睡着 2024-02-19 原文

完整代码在最下方

实验目的

利用动物识别系统来验证基于符号的推理,通过实验理解简单的专家系统所包含的模块:人机结构,知识获取机构,知识库及管理系系统,推理机,解释机构,数据库及管理系统”。

实验步骤/过程

(1)、逻辑实现

1、规则库建立:

对于每条产生式规则,都具有以下格式:

前提1 前提2 前提… 前提n

结论

每一条前提由空格分隔,规则保存到txt文件中,已经预置了部分初始规则。

2、推理机推理过程:

推理流程如下:

                   图2、推理流程

对于每条规则,建立Rules字典,key值为前提的所有集合,value值为前提可以推理出的结论。

推理过程如下:

每次对给定前提进行合法性检查,然后再进行推理。若存在非法条件(给定前提格式非法,给定前提不存在于前提库中),则提示非法条件并要求重新输入。

①推理成功:对于给定的前提,遍历Rules字典,如果存在一条规则所需要的前提是给定前提的子集且该结论未被推出,则将该条规则的结论放入前提中,重新开始遍历;若该结论已经被推出过,则跳过该条规则并继续遍历,直至遍历完字典。

②推理失败:若给定的前提无法推理出任何一条结论,则输出空值。

3、对规则进行增/删/改/查:

①增加规则:对增加的规则进行合法性检查(规则格式是否非法,前提和结论是否为空)并通过后,进行判断:若给定的规则的前提对应已有规则库中的前提,则提示添加失败,否则即添加成功。添加后的规则以相同格式保存在txt文件中。

②删除规则:对删除的规则进行合法性检查(规则格式是否非法,前提和结论是否为空)并通过后,进行判断:若给定的规则的前提对应已有规则库中的前提,则删除成功,否则提示删除失败。删除后的规则从txt文件中删除。

③修改规则:目前只实现修改规则的结论,对修改的规则进行合法性检查(规则格式是否非法,前提和结论是否为空)并通过后,进行判断:若给定的规则的前提对应已有规则库中的前提,则修改规则的结论为给定的结论,否则提示修改失败。修改后的规则在txt文件中修改。

④查询规则:遍历生成的字典并输出规则,格式同规则格式。

4、UI界面设计

    (1)通过QT Designer完成UI界面的布局设计

(2)利用PyUIC将该可视化的UI界面转为python代码 

 (3)设值各接口的功能

    【1】运行UI时,首先在规则库文本框中显示所有前提

代码:

.

 【2】输入规则接口

    读取文本框中的内容,设立输入规则,第一行为前提,第二行为结论,以回车为分隔符。点击添加规则后,调用添加规则函数

    添加规则函数中,完善了健壮性,判断输入的内容,如果输入为空,或者为空格、回车,则弹窗报错。如果输入多行,默认认为第一行为前提,第二行为规则。

【3】进行推理

 在输入事实 输入框中输入前提对应的数字。

点击进行推理调用推理机的函数

 健壮性为:如果输入的不是数字,则报错。

实验结果

界面如下:

 

其他不在一一展示了。

推理规则:

该动物有毛发
该动物是哺乳动物
该动物有奶
该动物是哺乳动物
该动物有羽毛
该动物是鸟
该动物吃肉
该动物是食肉动物
该动物有犬齿 该动物有爪 该动物眼盯前方
该动物是食肉动物
该动物是哺乳动物 该动物有蹄
该动物是有蹄类动物
该动物是哺乳动物 该动物是反刍动物
该动物是有蹄类动物
该动物是哺乳动物 该动物是食肉动物 该动物是黄褐色 该动物有暗斑点
该动物是金钱豹
该动物是哺乳动物 该动物是食肉动物 该动物是黄褐色 该动物有黑色条纹
该动物是虎
该动物是有蹄类动物 该动物有长脖子 该动物有长腿 该动物有暗斑点
该动物是长颈鹿
该动物是有蹄类动物 该动物有黑色条纹
该动物是斑马
该动物是鸟 该动物不会飞 该动物有长脖子 该动物有长腿 该动物有黑白二色
该动物是鸵鸟
该动物是鸟 该动物不会飞 该动物会游泳 该动物有黑白二色
该动物是企鹅
该动物是鸟 该动物善飞
该动物是信天翁
该动物有羽毛
该动物是鸟

上代码:

这里只展示主要推理过程了。UI部分其余代码不再放了,比较杂。如果需要可以联系我。

import sys
from PyQt5 import QtWidgets
import UI.MainDis, UI.False_Lable, UI.EmptyUI
import Animal.RuleBase as RB
import Animal.Inference_Engine as IE
import Animal.Inference_Engine as Inference

Save_rules_after = set()
Save_concludes = set()
def ListInSet(li, se):
    for i in li:
        if i not in se:
            return False
    return True

def judge_rule_in(lst):
    for rule_pre in lst:
        if rule_pre in Save_rules_after:
            continue
        else:
            return False
    return True

class Lable_ui(QtWidgets.QMainWindow,UI.False_Lable.Ui_Dialog):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)  # 创建主界面对象
        UI.False_Lable.Ui_Dialog.__init__(self)  # 主界面对象初始化
        self.setupUi(self)  # 配置主界面对象

class Empty_ui(QtWidgets.QMainWindow,UI.EmptyUI.Ui_Dialog):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)  # 创建主界面对象
        UI.False_Lable.Ui_Dialog.__init__(self)  # 主界面对象初始化
        self.setupUi(self)  # 配置主界面对象


class MAIN_ui(QtWidgets.QMainWindow,UI.MainDis.Ui_dialog,UI.False_Lable.Ui_Dialog):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)  # 创建主界面对象
        UI.MainDis.Ui_dialog.__init__(self)  # 主界面对象初始化
        self.setupUi(self)  # 配置主界面对象
        self.rulePushButton.clicked.connect(self.add_rule)#添加规则
        self.inferencePushButton.clicked.connect(self.inference)
        self.Lable = Lable_ui()
        self.Empty = Empty_ui()
        self.display_pre()

    def display_pre(self):
        RB.ini_rules()
        self.ruleTextBrowser.clear()
        i = 0
        RB.rules_pre = list(RB.Rules_pre).sort()
        for line in RB.Rules_pre:#将规则库放入显示框
            if i < 10 :
                str_temp = str(i) + '. '+ line
            else:
                str_temp = str(i) + '.'+ line
            self.ruleTextBrowser.append(str_temp)
            i += 1

    def add_rule(self):
        #添加新规则
        new_rule = self.inputLineEdit.toPlainText()
        self.inputLineEdit.clear()

        if new_rule == '' or new_rule == '\n':
            self.Empty.show()
            self.Empty.pushButton.clicked.connect(self.Empty.close)
            return
        new_rule = new_rule.split('\n')
        if new_rule[0] == '' or new_rule[1] == '' or new_rule[0].isspace()  or new_rule[1].isspace() :
            self.Empty.show()
            self.Empty.pushButton.clicked.connect(self.Empty.close)
            return

        new_pre = new_rule[0]
        new_pre = new_pre.split(' ')
        new_conclusion = new_rule[1]
        new_pre = [i for i in new_pre if (len(str(i)) != 0)]
        new_pre = ' '.join(new_pre)
        print(type(new_pre))
        print(new_pre)
        print(new_conclusion)
        judge_bool = False
        for i in RB.Rules.keys():
            if judge_is(i, new_pre):
                judge_bool = True
                break
        # print(judge_bool)
        if judge_bool:
            self.Lable.show()
            self.Lable.pushButton.clicked.connect(self.Lable.close)
        else:
            file = open('../UI/Rules.txt', 'a', encoding='UTF-8')
            RB.Rules[new_pre] = new_conclusion
            file.write('\n')
            file.write(new_pre)
            file.write('\n')
            file.write(new_conclusion)
            file.close()
            self.display_pre()



    def inference(self):
        #推理
        # self.outputTextBrowser.append("1")
        ini()
        self.outputTextBrowser.clear()
        self.answerTextBrowser.clear()
        rule_pre_num = self.inputFactTextEdit.toPlainText() #获取输入的事实
        rule_pre_num = rule_pre_num.split('\n')

        #删除空格元素
        rule_pre_num = list(set(rule_pre_num))
        for space in rule_pre_num:
            if space == '':
                rule_pre_num.remove('')

        rules = list(RB.Rules_pre)
        for i in rule_pre_num:
            if i.isdigit():
                if 0 <= int(i) < len(rules):
                    Save_rules_after.add(rules[int(i)])
                    # self.outputTextBrowser.append(rules[int(i)])
                else:
                    self.outputTextBrowser.clear()
                    self.outputTextBrowser.append('该前提不存在,请重新输入')
                    return
            else:
                self.outputTextBrowser.clear()
                self.outputTextBrowser.append('输入中存在非法字符,请重新输入')
                return
        i = 1
        for rule in RB.Rules:
            rule_list = rule.split(' ')
            if i == 1:
                rule_ini = rule
            if judge_rule_in(rule_list):
                Save_rules_after.add(RB.Rules[rule])
                temp = rule + '->'  +RB.Rules[rule]
                self.outputTextBrowser.append(temp)
                Save_concludes.add(RB.Rules[rule])
                rule = rule_ini

            i = i + 1
        if Save_concludes:
            for conclude in Save_concludes:
                self.answerTextBrowser.append(conclude)
        else:
            self.answerTextBrowser.append('根据已知事实无法得出结论')


def ini():
    Save_rules_after.clear()
    Save_concludes.clear()

def judge_is(rule1, rule2):
    rule1 = rule1.split(' ')
    rule2 = rule2.split(' ')
    rule1.sort()
    rule2.sort()
    if rule2 == rule1:
        return True
    else:
        return False

app = QtWidgets.QApplication(sys.argv)  # 新建窗体
MAIN_window = MAIN_ui()  # 创建主菜单的窗口对象
MAIN_window.show()  # 显示主菜单
sys.exit(app.exec_())  # 保持显示

链接:https://pan.baidu.com/s/1DbXamfIXQPfDhr6vpBfNWQ?pwd=ujnc 
提取码:ujnc 

有关动物识别系统 python实现+UI的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  5. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  6. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  7. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  8. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

随机推荐