精华内容
下载资源
问答
  • 基于物品的协同过滤算法实现图书推荐系统

    万次阅读 多人点赞 2019-09-14 21:20:24
    本文旨在利用基于物品的协同过滤算法,来实现个图书推荐系统。 本文首先介绍了推荐系统的发展历史,及目前常用的几种推荐算法的介绍与比较,然后以基于物品的协同过滤算法为基础,详细介绍图书推荐系统的构建。在...

    点击可免费下载原文噢

    摘 要

    在当下这个信息爆炸的时代,各种各样的书籍条目繁多,浩如烟海;相应地,为满足用户需求,电商平台需要推荐系统来帮助用户找到自己可能需要的书籍。本文旨在利用基于物品的协同过滤算法,来实现一个图书推荐系统。
    本文首先介绍了推荐系统的发展历史,及目前常用的几种推荐算法的介绍与比较,然后以基于物品的协同过滤算法为基础,详细介绍图书推荐系统的构建。在该系统中,主要功能分为用户功能和图书推荐功能。用户功能包括用户账号的登录与注册,书籍查询,书籍评分。图书推荐功能利用基于物品的协同过滤算法,先计算各个书籍之间的相似度,再根据物品相似度和用户的行为数据计算用户对各个书籍的兴趣度,从而得出推荐结果。
    该系统数据库采用MySQL,采用python编程工具Pycharm编写。

    关键词:电子商务;推荐系统;个性化图书推荐;协同过滤;基于物品。

    ABSTRACT

    In this era with information explosion,there are so many kinds of books. In accordance, to meet user needs, e-commerce platforms need a recommendation system to help users find books they might need. This paper aims to implement a book recommendation system, using an item-based collaborative filtering algorithm.
    This paper first introduces the development history of the recommendation system, and make introduction and comparison among several recommended algorithms which is often used. Then based on the item-based collaborative filtering algorithm, the construction of the book recommendation system is introduced in detail. In this system, the main functions include user functions and book recommendation functions. User functions include login and registration of user accounts, book query and book rating. The book recommendation function uses the item-based collaborative filtering algorithm to first calculate the similarity between the books, and then calculates the user’s interest in each book according to the similarity of the items and the behavior data of the user, thereby obtaining the recommendation result.
    Development tools include MySQL and Pycharm.

    Key words:E-commerce; recommendation system; personalized book recommendation; collaborative filtering; item-based.

    第一章 概述

    1.1课题背景及意义

    随着计算机信息技术和互联网技术的发展,从之前的信息短缺时代,跨越到了信息过剩时代。在这种背景下,人们越来越难以从许多信息中找到感兴趣的信息。相对来说,对于信息来说,想要找到对自身感兴趣的用户也越来越难。而本文研究的推荐系统任务,就是将信息与用户连接。
    想象一下,用户想要购买一本书,例如《C Prime Plus》。用户只需走进书店并按照书名直接购买即可。也可以通过淘宝、京东、当当直接搜索,进行购买。不过,这种方式的前提是用户需要明确自己的需求,确切地知道自己想买的哪本书。
    但是,如果用户没有明确的目标,比如寻找自己喜欢的音乐,用户可以使用预先定义的类型或标签搜索有趣的音乐,但面对大量的音乐,实际上用户可以找到自己感兴趣的音乐。在这个时候,需要分析用户已收听音乐自动工具,用户有兴趣向用户推荐音乐。这是个性化推荐系统的工作[1]。
    信息过滤系统具有以下两个特点:
    1)主动性。从用户的角度来看,门户站点和搜索引擎是解决信息过载的有效手段,但它们需要提供明确需求的用户。如果用户不能正确地说明自己的需要,则这两种方法不能为用户提供正确的服务。用户不需要提供特定的需求,但信息可以由用户推荐。
    2)个性化。推荐系统的核心内容是找到长尾信息[2]。销路好的商品一般表示大多数用户的兴趣,而冷门商品一般表示少数用户的个性需求。在电子商务平台的时代,冷门商品的交付甚至超过了爆品。长尾信息的发现是推荐系统的重要研究方向。
    现在,推荐系统的思想和算法已经趋于成熟,在很多领域被广泛应用,最普遍的是电子商务。同时,随着机器学习和深入学习的发展,工业界和学术界热衷于研究这一挑战性的学科体系。

    1.2推荐系统的发展历史

    推荐系统是一个先进的思想,所以具有其独特性,因为它是一种仅属于网络时代的个性化信息检索工具。随着互联网和大数据时代的到来,人们逐渐意识到,所有信息的不定向推广是耗时费力且收效甚微的,这就体现出来推荐系统的价值。经过20多年的积累和沉淀,它逐渐成为一个独立的问题。
    1994年,明尼苏达集团透镜研究小组推出了第一个自动推荐系统, GroupLens。提出协同过滤是推荐系统中的一项重要技术。
    推荐系统(recommendersystem,RS)于1997年提出。由于推荐系统一词的广泛应用,推荐系统成为一个重要的研究领域。
    1998年,Amazon.com推出了一种基于项目的协作过滤算法。
    2003年,Amazon Linden等人本文提出了一种基于物品的协同过滤算法。据统计,推荐系统的贡献率在20%到30%之间。
    2005年,Admavicius等人论文分为三大类:基于内容的推荐、基于协同过滤的推荐和混合推荐,并提出了今后的研究方向。
    2006年10月,北美在线视频服务提供商Netflix,举办了一个比赛,在学术界和工业界引起了相当大的关注。奖项丰厚,与会者提出了几种推荐算法,以提高推荐的准确性,极大地促进了推荐系统的发展[3]。
    2007年在美国举行的第一次ACM推荐系统会议是2017年第11次。这是推荐系统领域的顶级会议。它提供了一个重要的国际论坛,展示不同领域推荐系统的最新研究成果、方法和方法。
    在2016年,YouTube的宣布使用推荐系统深层神经网络来获得大规模的建议最有可能的建议。
    近年来,推荐系统已广泛应用于电子商务推荐、广告定向投放、时事新闻推荐、抖音、知乎等平台。

    1.3推荐系统的研究内容

    经过20多年的贮存和沉淀,推荐系统在许多领域的应用取得了成功。最常见的应用场景是电商、广告、视频、社交和音乐。这些应用及需要通过推荐系统进行进一步的发展,所以这也是推荐系统研究和应用的重要实验场景。
    随着推荐系统的发展,用户逐渐接受了这种模式,经过调研,用户目前不仅对模型用户历史行为的分析感到满意,而且认可了混合推荐模型。各行业的应用都在致力于通过不同的推荐方法解决冷启动和非常稀疏的数据问题。当前,中国著名新闻客户的头条新闻使用内容分析、用户标签、评级分析等方法创造了数百万美元。用户推荐引擎发展迅猛。
    移动互联网的普及为移动电子商务数据、移动社会数据和地理数据等推荐系统提供了更多的数据。它成为社会推荐的新的尝试。
    通过对推荐系统的应用,推荐系统的有效性评估,稳健性和安全性的算法进行了研究。在2015年,艾伦说和其他人在雷克斯会议上发言。同年,Frank Hopfgartner等人讨论了基于流数据和比较实验的离线评估方法,并进行宣布。
    近年来,机器学习和深度学习的发展为推荐系统提供了方法论指导。2016年以后,RECSYS会议召开了关于推荐体系的深入学习研讨会,推动了研究,鼓励在深入学习的基础上应用推荐体系[4]。
    2017年,Alexandros Karatzoglou等人他的论文介绍了推荐系统的深度学习应用。

    第二章 开发平台及技术

    2.1开发平台

    2.1.1系统开发环境介绍

    Python是一种目前广泛使用的语言,非常受使用者们的欢迎,因其自身的优越性很快就得到了迅速的发展。这对C++,java等今年来流行的语言造成了很强的影响。拥有良好的通用性,作业迅速,良好的跨平台和稳性是Python技术的优点,目前,像个人电脑、数据操作、电脑和手机游戏后台、手机移动端和计算机应用的很多方面都在使用Python作为开发语言,技术稳定成熟,缩短开发时间,重复性好,在线扩展方便。Python因风格简洁、可读性较好深受编程人员的喜爱,并得到了广泛运用[1]。对于推荐系统来说,开发过程中会遇到各种各样的问题,所以在编写程序和运行代码的过程中,关于设计的逻辑和设计过程,都是一个不断发现问题、解决问题的过程,不断完善以达到预期的功能才是我们希望看到的。Python语言具有其他语言所没有的特性,可以使用它进行开发本图书推荐系统平台。
    Python的多样性,意味着可以横跨多个领域,绝不仅限于Web开发、桌面程序、移动应用,甚至包含硬件开发等。所以并没有被束缚在单一的平台之上,Python具有良好的可移植性,在图书推荐系统开发上使用Python可以大大方便项目的开发和维护。
    由上面论述可知,通过Pygame工具的应用,可以简化项目的开发,Pygame使开发者不必过多的在意一些琐碎的问题,因为这些问题Pygame工具会帮我们解决,这让开发者拥有更多的时间和精力放在系统开发的关键部分,给开发者带来了相当大的便利。最关键的是,Pygame拥有跨平台的特性,这使得基于它开发的项目可以自由的在各个操作系统上运行,这省去了很多繁琐的修改。随着Pygame开发工具的流行,该工具以其独特的优越性,越来越多的被应用于各种系统平台的开发。
    当前程序是以python为编程语言,主要功能实现依赖于pygame模块,主要用到surface对象之间的位置变化,再利用事件监听让程序运行起来。运行中Surface对象的位置发生变化后,界面刷新,用户对鼠标与键盘进行操作时,监听操作完成相应事件。
    软件开发方式:①系统总体设计②系统详细设计③编码④测试。
    系统运行环境:Windows7及更高版本。

    2.1.2 数据库系统介绍

    MySQL是一个开源的关系数据库管理系统(RDBMS),它使用广泛使用的结构化语言(SQL)进行数据库管理。
    MySQL是一个开源的,因此任何人都可以在通用公共许可证下下载并更改设置以满足个人需求。
    MySQL速度快、可靠性高、适应性强,一直受到人们的广泛关注。大多数人认为MySQL是在不进行事务处理的情况下管理内容的最佳选择。
    因此,对于简单的数据库使用需求,我选择MySQL作为数据库管理工具。

    2.1.3 开发工具介绍

    PyCharm是一种Python 集成开发环境,它有一套工具可以帮助用户提高开发python语言的效率,例如调试、语法突出显示、智能提示、自动作业、单元测试、project管理、代码跳跃、版本控制。
    编码支持:其支持智能化的 、可配置的编辑器提供代码完成、代码片段、代码折叠和窗口拆分支持,使用户快速便捷的完成任务,节省了用户的时间。
    项目代码导航器:这个IDE快速的帮助引领用户在文件之间切换,从一种方式浏览语句、用法和类的层次结构。如果用户记得使用系统默认提供的快捷键或者是他们自己设置的快捷键,使用效率会更高。
    代码分析:用户可以使用编码规则、错误突出显示、智能检测和一键代码快速完成建议来优化编码[5]。
    Python重构:在程序编写过程中,导入域/变量/常量,重命名,提取方法/超类,移动和前推/后退重构这些操作可以使用这个功能来实现,极大的减少了用户的任务量。
    集成版本控制:如果用户想使用这些功能,如登录、输入、视图拆分和合并, -用户可以在VCS用户界面中找到,这是其通用的功能。
    具有自带的调试器,调试器的功能多样化,可以提供多种功能,用户通过对基于python和 Django的项目进行调试,同样,系统的单元测试,也可以通过它来解决,该调试器包括blake点、分步、多屏幕视图、窗口和计算表达式等。
    集成单元测试:用户可以运行测试文件,单个测试类。一个方法或者所有测试项目。
    另一方面,Pycharco还为Django的开发提供了一些很好的功能,以及对Google应用引擎的支持,以及对Pycharm的支持。

    2.2 开发技术

    python用作该软件的开发语言,其关键技术在于布局、事件监控和数据存储。布局主要是美化界面以及界面的排版。用户交互界面用布局来实现,给用户带来美观、舒适、直接的用户体验。所以,界面布局的设计会影响到使用者的客观感受,获取用户操作使用事件监视技术,而数据监视技术记录所有操作,创建用户需要提取的数据。
    Python是一种优雅、简单、健壮的开源解释语言。产生于1989年,由Givavo RSM开发和设计,设计Pyhlo的最初目的是为了高效的完成某一项任务而创造的。它从一种为提高研究项目的工作效率而创建的通用编程语言开始。经过多年的发展,python已经逐渐得到改进。由于其强大的可扩展性和广泛的库支持,它已经出现在许多领域,如豆瓣等就是成功的应用python技术的例子。
    Python的主要特点有:
    l)低入门标准的python语法相当简短,编写的程序通常简短,非常像日常使用的自然语言,有利于开发者的使用和理解。
    2)Python是一门面向对象的语言,在面向对象中,与面向过程语言的差距就是类和对象的使用,体现了python的特征,面向对象的语言特点是在该语言被创造的时候就体现的。Python之所以能成为一门被大众喜爱的编程语言在于它的精心设计的数据和内存管理。
    3)对于内存的管理,python也有其特定的部分负责,对于开发者来说,程序就显得有必要了,因为开发者只有理解这些程序的前后逻辑才能更好的写出项目,使他们不像C/C++程序员那样专注于处理内存事务。Python的程序设计和编写时间更短、出错更少也是基于此特性。
    4)主机语言与其通信可以方便的被嵌入,可以用C语言编写对于一些对性能特别强调的地方,这些扩展在python中被调用以实现性能改进的目的。相反,Python解释器可以嵌入到C/C++中,它取代接口可以通过动态链接库的形式进行,通过这种方式,程序开发由此变得灵活方便[7]。
    5)在python的标准库中,含有多个模块来实现具体的功能,这些几乎包含了所有与操作系统解释器的交互的功能,也就是Python使用者不用手动人工造轮子,因为这些模块可以直接用于已经完全测试过的功能开发。这些已经被充分测试的模版在实际的编程开发中得到了充分的应用。

    2.3 关键算法

    2.3.1 常见的推荐算法

    现如今网上信息泛滥,想要在里面找一条适合自己的信息的成本真的有点高,如果可以较为完善的推荐系统出现的话,于用户而言,可以大大的节省自己的时间;从商家的角度来看,通过推荐系统可以更为精准地投放自己的商品对象,从而可以更好的卖出自己的商品。
    根据使用数据源的不同可将其大致分为三类:
    1)协同过滤的推荐方法
    2)基于内容的推荐方法
    3)基于知识的推荐方法
    这三类算法通过不同程度融合,可以出现混合推荐算法。
    一、协同过滤算法,其中包括基于用户的协同过滤及基于物品的协同过滤。
    1)基于用户的实现原理:
    1.计算用户之间的距离
    2.将用户之间相近的,推荐给他们喜欢的物料
    3.通过收集用户反馈数据,进一步优化用户之间的距离
    2)基于物品的实现原理:
    1.计算物品之间的相似度矩阵
    2.收集用户评分高的物物品
    3.将与用户评分高的相似度较高的物品,推荐给用户
    4.通过收集用户反馈数据,进一步优化数据
    二、基于内容推荐算法
    实现原理:建立用户画像-行为偏好,建立物品画像,特征,通过相似度计算,然后推荐。
    弊端:建立用户画像,需要基于大量用户行为数据。
    三、基于知识推荐算法
    实现原理:基于知识的推荐算法主要将重点放在知识源,没有冷启动的问题,因为推荐的需求都是被直接引出的。其主动的询问用户的需求,然后返回推荐结果。
    弊端:“知识”的获取比较难。

    2.3.2基于物品的协同过滤算法

    协同过滤推荐算法是推荐系统中最基本的算法。它分为基于用户的协同过滤算法(usercf)和基于物品的协同过滤算法(itemcf)。
    基于物品的协同过滤算法主要分为两个步骤。
    1)计算物品之间的相似性。
    2)根据物品相似度与用户历史行为的,向用户提供推荐列表。
    第一步骤中的关键点是计算项之间的相似度。除了使用基于内容的相似性,它是计算有多少类似的物品,而是看喜欢i的用户中,有多少人喜欢j的,因此计算是基于用户。该兴趣一般都比较确定和不容易改变。当一个用户都喜欢的物品,我们通常可以认为,这两个物品可能属于同一类别。令N(i)表示购买物品i的用户数,则物品i和物品j的相似度可以用公式1来计算。
    ,(1)
    第一步的时间复杂度的改进方法:以UserCF类似,我们可以创建一个用户,项目查找表,通过计算,认为用户有beenhave这些项目之间的相似性时,它可以保证计算的相似性。这样能够保证相似度是有用的,而不用对那些零(可靠地稀疏矩阵)花费大量的计算量。
    第一步相似的改进方法1:如果按上述公式计算的相似性,可以发现,这个物品我和受欢迎的物品j之间的相似性是非常高的,因为流行的读数偏高,所以基本上每个人都会买它。具有较高的知名度的商品不太区分的,所以我们需要惩罚流行物品j的权重[10]。
    ,(2)
    第一步相似性改进方法2:需要惩罚用户的活动。如果用户不活跃,只有购买的图书数量有限,那么这些书很可能在计算项目中感兴趣的一个或两个区域的相似性是有益的,但如果一个书店卖家提供折扣,如果你买90%Amazon的书籍,然后赚取差价,那么用户的行为对计算物品的相似性不会有任何作用,因为90%的书肯定会涵盖了很多的范围,所以你应该惩罚用户的活动,可以采取第一个方法。
    第一步相似性改进方法3:物品的相似性的归属。规范化不仅提高了建议的准确性,还增加了建议的覆盖范围和多样性。例如,在京东上,用户的爱好种类繁多,有相机爱好者、耳机爱好者、电脑爱好者等。很少有人说爱好集中在一个类别中。假设有两种类型的A和B.A类之间的相似性是0.5,B类之间的相似性是0.8,A和B之间的相似性是0.2。当用户购买A类的5本书和B类的5本书后,我们必须向用户提供推荐。如果我们按照前面的方法并按相似性排序,那么推荐的方法应该是B类项目。即使B类别较低,它仍然优于A类。为了高相似性,所以相似性的相似性应该基于类别,因此A的相似性为1,B的相似性也为1 ,以便排序后推荐的A和B产品具有更高的准确性,覆盖范围和多样性。
    第二步则比较简单,计算物品与用户已买物品的相似度(权重和),然后根据相似度排序选出topN。
    ItemCF在实际系统中运用的比较多,主要有两个优点:
    1)item-item表相比如user-user表要小的多,处理起来比较容易
    2)itemcf很容易为推荐提供理由,比如提前进行数据挖掘,可提高可靠性,改善用户与推荐系统的相互作用,并进一步加强定制推荐前推荐数据挖掘等。
    基于物品的协同过滤算法与用户的协同过滤算法相比,基于用户的协同过滤算法有两大缺点。
    1)随着网站用户数量的增加,计算用户数量的相似性就更加困难了。计算的时间复杂度和空间复杂度与用户的增长基本成平方关系。
    2)基于用户的合作过滤算法很难对推荐的结果作出解释和建议。
    基于物品的协作过滤算法是“目标用户”,用于查找与其喜欢的项目类似的项目。从实际情况角度出发,在对于本课题中的需求——图书推荐来说,每个用户对于个性化推荐书籍的需求都比较强烈,此时采用基于物品的协同过滤算法就可以更为充分地挖掘用户的兴趣领域,并且很容易根据用户的历史数据来对推荐结果做出解释,从而使用户更加信任系统做出的推荐结果。

    第三章 系统设计

    3.1 需求分析与建模

    需求分析是软件工程中的一个重要步骤。这个阶段的主要任务就是调查用户需求。并和开发人员进行确认,将客户的非技术性需求转化为技术上可实现的技术性需求[12][13]。明确要实现哪些功能、完成哪些工作,产出规范性文档《需求规格说明书》。在通过评审后,《需求规格说明书》起到了桥梁的作用,成为用户、开发人员进行理解与交流、反映用户的问题结构以用作软件开发的工作依据、作为软件测试和验收的依据[14]。
    总体设计原则的提出是为了确保系统建设成功,并为系统的可持续发展做出规划。因此在系统设计时,我们遵守以下原则:
    简单性:实现系统需求的前提下,尽可能的保证系统简单易操作。一方面,简单的操作会使增进用户体验,另一方面操作过于复杂时,更易引入问题及漏洞。
    针对性:本项目是选用基于物品的协同过滤算法实现图书推荐系统,用明确项目需求为目标,具体需求具体实现,有很强的针对性。
    实用性和一致性:具有较高的视觉一致性。主界面采用tkinter模块进行编写,主界面上的元素统一使用标签插入,具有较高的功能一致性。如图1所示。
    在这里插入图片描述

    图1 总体设计原则

    3.1.1 功能模块图

    在这里插入图片描述
    图2 功能模块图

    3.1.2 类图

    在这里插入图片描述
    图3 类图

    3.1.3 用例图


    图4 用例图

    3.2 可行性分析

    可行性分析包括技术性、经济可行性、社会可行性及其它考虑。
    为避免浪费投资,提高软件生产的成功率。这是解决问题的实际目的,问题可以短时间以小成本解决[16]。
    下面对基于基于物品的协同过滤算法实现图书推荐系统开发进行判断和考察,主要从技术、经济、社会几个方面来分析。
    技术可行性:
    主要分析技术要求的技术可能性可以完成开发任务,硬件和软件可以满足开发人员的需求。功能强大的JetBrains是该软件中使用的开发工具[14]。
    PyCharm 2018.2.3 x64,强大的扩展能力是该软件的特性,该软件对于系统编写及完善有良好的支持效果,也是众多Pythoner喜爱的编译器。随着互联网行业的迅猛发展,软件开发平台及硬件技术同时不断更新进步。大容量、可靠性的提高、低价格也使得软件开发是可行的。本系统的编译需求完全可以由Pycharm编译器承担。
    综合以上情况及考虑,本系统的开发在技术上是完全可行的。
    经济可行性:
    由于本系统较为小型轻便,开发成本较低。此外,该软件稳定、后期维护简单、实用,一旦开发完成即可长期使用。当用户有了新的需求时,只需要根据需求,在原有代码基础上进行更改,维护成本较低。
    综合以上情况及靠背,本系统在经济上是完全可接受的。
    社会可行性:
    法律因素:本系统是本人处于兴趣爱好,独立完成开发的。基于Python完成,同时借鉴市场上同类软件的功能,收集并归纳用户需求,制订设计思路,结合实际中存在的实体,进行创新及开发的。
    用户使用可行性:本系统对用户的要求,没有复杂繁琐的操作,简单易用。使用软件的用户, 在了解了简单的流程后就可以对后台进行管理,没有额外的学习使用环节,节约成本。
    由以上分析可知,本系统在社会可行性方面是完全可行的。

    3.3 系统数据库设计

    根据系统业务和DBMS的需求,建立了最佳的数据存储模型。另外,通过建立数据库内的表结构与表与表之间的关系的处理,能够有效地将数据存储到应用系统中,高效访问存储的数据[15]。好的数据库设计需要以下部分。
    减少数据冗余;
    避免数据维护异常;
    节约存储空间;
    高效的访问;
    需求分析。
    同时需要分析数据和属性各自的特点,以便了解系统中所要存储的数据、了解数据的存储特点、了解数据的存储周期。需求分析中需要了解的问题是实体之间的关系、包含的属性。
    该系统采用MySQL数据库,保存用户的用户名、密码等数据。
    数据库的主要表如下:
    用户(账号,密码)如表1所示。
    图书(标题、评分、简介)如表2所示。
    在这里插入图片描述

    第四章 详细设计

    4.1 页面设计

    4.1.1 登录与注册

    登录与注册设计采用BootStrap的Navbar导航条,插入Button和Entry对象来创建按钮及输入框,并设置了绑定变量来获取输入框输入[16]。
    具体实现步骤为:
    a.设置导航条,其中包括图书推荐系统、图书列表、用户评价后的图书、管理。
    b.登录部分设置两个标签,分别命名为“用户名”、“密码”,放置两个输入框,两个按钮“登录”和“注册”。注册部分设置三个标签分别为“用户名”、“密码”,“确认密码”放置三个输入框,一个“注册按钮”。
    c.密码的文本设置输入密码后显示*号。
    在这里插入图片描述
    图5 登录界面
    在这里插入图片描述
    图6 注册界面

    4.1.2 图书列表部分

    在该部分,选择Web API类型的MVT,使用Django是一款python的web开发框架:与MVC有所不同,属于MVT框架。
    m表示model,负责与数据库交互。
    v表示view,是核心,负责接收请求、获取数据、返回结果。
    t表示template,作用就是将内容反馈并呈现在浏览器上。
    通过与数据库的交互,获取数据并返回结果到图书列表的界面上。
    界面如图7所示。
    在这里插入图片描述
    图7 图书列表部分

    4.1.3 图书详情部分

    首先获取到图书的图片,通过book.title获取标题并将其显示在界面上,通过book.stars获取评分情况将其显示。通过book.desc得到图书简介。
    这部分最关键的部分是显示与此书相似的图书,对训练的结果中的相似图书按照一定的格式显示在页面上。如图8、图9所示。
    判断是否曾经对其进行评分,如果评分过,显示之前的评分。反之,提示用户“您还没有评分过,给个评分吧”。如图10、图11所示。
    在这里插入图片描述
    图8 图书详情界面
    在这里插入图片描述
    图9 图书推荐界面
    在这里插入图片描述
    图10 评分界面
    在这里插入图片描述
    图11 历史评分列表与推荐界面

    4.2 Python实现核心功能

    4.2.1 跳转方式

    当用户在aw和bw未登录时,在SSO上设置登录态,那么在aw和bw上应该设置登录态。如上所述,还是应该在aw和bw上设置各自的登录态,这样在访问aw时首先会在aw域上检测授权,如果没有授权,则跳转到SSO进行登录授权[17]。但是aw和bw应该为登录态一般设为浏览器进程存活期,即aw和bw的登录态的存活期直到浏览器关闭。SSO域上登录态的存活期取决于具体的业务,本系统中设为7天。代码如下:
    app = Flask(name)
    app.config[‘SECRET_KEY’] = os.urandom(24) # 服务器启动一次上次的session就清除,因为设置为随机产生的24位的字符,也就是说每次运行服务器都是不同的。
    app.config[‘PERMANENT_SESSION_LIFETIME’] = timedelta(days=7) # 设置session的保存时间。

    4.2.2 数据库连接

    首先创建数据库连接,打开数据库连接。代码如下:
    import pymysql
    def create_connection():
    db = pymysql.connect(“localhost”, “root”, “12345678”, “bookrecommend”)
    return db

    4.2.3 ItemCF算法的实现

    1.ItemCF算法的实现是本图书推荐系统的核心内容,首先要计算出物品之间的相似度,相似度是推荐的关键评判指标,然后根据物品的相似度,并结合用户的历史行为,即那里评分矩阵,从而给用户生成可靠的推荐列表。
    具体步骤:
    首先建立物品的同现矩阵。
    其次建立用户对物品的评分矩阵。
    最后矩阵计算推荐结果。
    def ItemSimilarity(train):
    # 物品-物品的共同矩阵
    C = dict()
    # 物品被多少个不同用户购买
    N = dict()
    for u, items in train.items():
    for i in items.keys():
    N.setdefault(i, 0)
    N[i] += 1
    C.setdefault(i, {})
    for j in items.keys():
    if i == j:
    continue
    C[i].setdefault(j, 0)
    C[i][j] += 1

    2.计算问题之间的相似度
    W = dict()
    for i, related_items in C.items():
    W.setdefault(i, {})
    for j, cij in related_items.items():
    W[i][j] = cij / math.sqrt(N[i] * N[j])
    return W
    问题i与问题j之间的相似度这么定义:同时关注问题i与问题j的人数/关注问题i人数关注问题j的人数的平方根[18]。
    由此我们就需要计算n个问题之间两两相似度,就是一个对角线为1的对称邻接矩阵,也就是说,想要成功求出n个问题之间的相似度,至少需要计算n
    (n-1)/2次,这样才可以计算n个问题之间的两两相似度。
    推荐前K个用户
    def Recommend(train, user_id, W, K):
    rank = dict()
    if user_id not in train: return []
    action_item = train[user_id]
    for item, score in action_item.items():
    for j, wj in sorted(W[item].items(), key=lambda x:x[1], reverse=True)[0:K]:
    if j in action_item.keys():
    continue
    rank.setdefault(j, 0)
    rank[j] += score * wj
    return sorted(rank.items(), key=lambda x:x[1], reverse=True)

    第五章 系统测试

    测试就是为了寻找程序中的错误,一个成功的测试就是发现至今尚未发现的错误的测试。在这样一个找错误的过程中,每发现一个错误都是值得高兴的,因为这可以又为以后排除了一个潜在的隐患,同时系统如果要是经过测试投入使用后再发现系统的错误,那么将会花费更多的物力和财力才能解决问题,这样无疑会造成投入成本增加,更严重的甚至导致该系统不能使用白白浪费了之前的投入。因此在系统正式投入使用之前,尽可能全面的去测试系统无疑是必不可少的,也是非常重要的[19]。
    在实际的生产生活中在真实的系统工作环境下通过与之前的需求分析进行作比较,检查实现的功能是否符合需求分析的要求,是否满足客户要求。系统测试主要有两种常用的方法,黑盒测试和白盒测试,它主要是根据是否关心程序的内部结构来划分的。所谓的黑盒测试是指不关心程序如何编写的,内部结构如何,只关心输入和输出的结果是否的正确。白盒测试是将程序看成一个透明的盒子,进而分析程序内部的运行情况是否正确。
    测试就是通过静态审查或者运行程序从而找出软件实现过程中是否与需求存在偏差。除此之外,测试还需要软件质量进行度量,这样可以全面掌控软件情况,从而及时采取措施推进问题修复。测试的原则之一是测试应当尽早介入,这样的话,在研发阶段,越早发现问题,造成的损失越小,所以该问题的修复成本就越低。在寻找错误的过程中,不断完善系统,尽量的避免问题出现与系统投入使用过后,修复成本大幅度增加的情况。因此,进行全面的系统测试是不可或缺的[20]。
    在实际的测试流程中,将在设计阶段根据需求撰写测试用例,并根据实现情况对用例进行补充及修改,验证需求实现情况,提出问题并推进修复,最后给出软件质量度量。
    执行程序给定输入,并校验程序输出是否符合预期结果是黑盒测试的标准流程。它不必关心程序的内部实现逻辑,不需要涉及代码层面[2]。与之对应的是白盒测试,大多是通过静态代码审查的方式,不运行程序,凭借程序实现的逻辑结构,来检查程序是否满足需求,符合预期。

    5.1 测试的定义及其重要性

    5.1.1 测试的定义

    软件测试是直接影响软件质量评价的重要部分,这是用来衡量实际开发的系统与预期结果之间的审核比对过程,查缺补漏。软件测试需要采用有效的方法,及时发现问题,防止后续出现难以掌控的状态。测试的作用就是在衡量成本的条件下,尽可能的找出问题并推动问题修复,为软件质量作出度量,避免问题出现在系统投入使用后,减少修复成本。

    5.1.2 测试的重要性

    随着软件行业的蓬勃发展,人们更加关注的是软件质量的实现,因此软件测试就愈发重要。在软件工程中,这是必不可缺的一环。在操作和维护阶段之前,应确保软件的质量,然后在操作和维护阶段向用户提供软件产品。随着系统测试越来越重要,测试理论、测试方法越来越科学,普遍认为:软件测试应该在项目之初就进行介入。虽然软件测试的原则之一就是测试不可能发现所有BUG,软件必定是存在BUG的。但是为了减少错误的引入,我们可以使用完备的开发过程、有效的开发方法和新的语言,但这些方法只是最大程度的降低了错误。通过测试来检测这些误差是很有必要的[18]。BUG具有集群性,符合“二八原则”。测试过程中,通过统计问题分布,可以推算哪些模块需要继续进行测试。

    5.2 测试方法及过程

    白盒测试是基于代码的一种测试设计方法。测试人员通过审查代码、明晰代码实现逻辑后,以验证程序逻辑为目标,构造测试用例及数据。与之对应的黑盒测试,不关心程序内部的实现逻辑,只着眼于外部结构,将程序视作一个“黑盒子”,输入测试数据,查看输出结果与预期结果是否一致[13]。运行程序、进行输入,然后得到实际结果从而验证软件是否满足需求。
    探索性测试是一种测试思维与理念,在对系统有一定了解的情况下,不严格拘泥于先设计后执行的测试思路。探索性测试是设计与执行同时进行的,实践表明,探索性测试往往能暴露出更多的问题。
    在本系统中,综合采用了两种方法,还结合了探索性测试的思路,使测试过程可以暴露更多问题。
    本次测试主要达到以下测试目的:
    (1)功能检查:根据需求与实现产品,验证功能需求实现情况,检查功能实现是否有遗漏偏差。
    (2)数据检查:主要对用户、登录注册信息进行检查,检查数据库与程序之间的交互部分。
    (3)性能检查:针对于本次的系统,该项主要是检查推荐的图书,是否存在错误现象
    (4)稳定性检查:由于事件读取是从鼠标键盘上获取的,而导致后台响应频率较高,所以要检查程序是否出现运行终止、重启等现象。

    5.3 各模块具体测试

    5.3.1登录测试

    对用户输入的用户名,密码进行验证匹配。与pymysql结合简化了SQL查询,并与pymysql.connect协同工作将使编码量大为减少。
    测试编号:1
    描述:本测试用例用于验证系统用户登录
    前提:用户已进入系统且进入用户登录页面
    备注:使用正确的用户名和密码登录系统,与数据库信息进行验证,验证成功后,必须进行登录操作的二次检查操作,即使用错误的密码登录,也需要验证系统登录验证是否准确,以及相关的错误反馈信息是否正确。
    具体步骤:
    1.进入图书推荐系统
    2.进入主页面之后,在“用户登录”部分、在对应的文本框中分别输入用户名和密码信息。
    3.单击“登录”按钮,启动系统登录确认
    4.在页面“用户登录”区域,用户名文本框和密码文本框中分别输入错误或者不存在的用户名和密码。
    输入值:用户名,密码
    期望结果:步骤2验证通过,登录成功。步骤4准确反馈错误信息(密码错误、账号不存在)。
    实际结果:步骤2验证通过,登录成功。步骤4准确反馈错误信息(密码错误、账号不存在)。
    是否通过:通过

    5.3.2 注册测试

    在注册的过程中,加入校验。经测试无误。
    function onregistclick() {
    var username = $("#name").val();
    var password = $("#password").val();
    var repassword = $("#repassword").val();
    if(!username) {
    alert(‘用户名不能为空’);
    return;
    }
    if(!password) {
    alert(‘密码不能为空’);
    return;
    }
    if(password!==repassword) {
    alert(‘两次密码不一致’);
    return;
    }
    $.post("/regist", {“username”:username, “password”:password}, function (resp) {
    if(resp&&resp.result){
    window.location = ‘/login’
    }else{
    alert(‘注册失败,请更换个用户名!’)
    }
    })
    }
    测试编号:2
    描述:本测试用例用于测试用户“注册账号”功能是否正确
    前提:用户进入系统,在“注册账号”功能页。在“注册账号”页面编辑后提交。
    备注:需要再次进入页面以确保数据已完全更新。
    步骤:
    1.进入图示推荐系统登陆页面,点击注册账号,进入注册账号页面。
    2.在页面输入账号信息(用户名、密码、确认密码)
    3.点击注册按钮,将新用户的账号数据添加到数据库中。
    输入值:用户名,密码,确认密码
    期望结果:用户添加账号成功。
    实际结果:用户添加账号成功。

    5.3.3 数据库连接测试

    在这里,数据库管理工具用的是Navicat,选择它的原因是,全面的图形化方式进行数据库的管理,所以非常易用而且可靠,Navicat与数据库进行连接的原理是通过SSH通道和HTTP通道,既可以最大程度上避免漏洞保护数据信息,又可以在使用时,对远端服务器的访问不受安全性影响[9]。可利用图形化界面,直接对数据库对象进行创建、编辑和删除等。
    在这里,数据库管理工具用的是Navicat,选择它的原因是,全面的图形化方式进行数据库的管理,所以非常易用而且可靠,Navicat与数据库进行连接的原理是通过SSH通道和HTTP通道,可以最大程度上避免漏洞保护数据信息,同时又具备安全性。可利用图形化界面,直接对数据库对象进行管理。
    测试编号:3
    描述:本测试用例用于测试数据库连接是否成功
    前提:注册后的用户进入系统,通过登录确认进入推荐系统页面。在后台检查用户信息进行校验。
    备注:需要再次进入页面以确保数据已完全更新。
    步骤:
    1.注册
    2、进入图书推荐系统后,通过验证进入普通用户权限界面,首页即是图书推荐系统首页。
    3.查询数据库文件看是否有新用户加入、或者是重新登录,查看是否可以成功登录。
    4.输入用户名和密码,点击“登录”按钮,更新数据库中的信息
    期望结果:用户成功登录。
    实际结果:用户成功登录。
    是否通过:通过
    5.3.4 图书详情显示测试
    测试编号:4
    描述:本测试用例测试图书列表查看是否实现。
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    步骤:
    1.进入图书推荐系统的功能页面。
    2.点击“图书列表”。
    期望结果:用户可以查看图书列表。
    实际结果:用户可以查看图书列表。
    是否通过:通过

    测试编号:5
    描述:本测试用例用于测试图书图片显示是否成功是否正确
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    步骤:
    1.进入图书推荐系统的功能页面。
    2.点击“图书列表”
    期望结果:用户能够查看图书具体信息(图片)。
    实际结果:用户能够查看图书具体信息(图片)。
    是否通过:通过

    测试编号:6
    描述:本测试用例用于测试查看图书详情是否能成功显示。
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    备注:需要再次进入页面以确保数据已完全更新。
    步骤:
    1.进入图书推荐系统主页面
    2.点击“图书列表”
    3.进入图书详情界面。
    期望结果:图书详情显示无误。
    实际结果:图书详情显示无误。
    是否通过:通过

    测试编号:7
    描述:本测试用例用于测试“评分”功能是否正确,并针对不同的评论状态,查看之前的评论或者提交评论。
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    步骤:
    1.进入图书推荐系统主页面
    2.点击“图书列表”
    3.进入图书详情界面。
    4.查看评分
    期望结果:用户如果评过,提示已经评分,若未评分,则可以进行评分。
    实际结果:用户如果评过,提示已经评分,若未评分,则可以进行评分。
    是否通过:通过

    测试编号:8
    描述:本测试用例用于测试用于测试 “显示标题、简介”等功能是否正确
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    步骤:
    1.进入图书推荐系统主页面
    2.点击“图书列表”
    3.进入图书详情界面。
    期望结果:可以正确显示标题、简介等信息。
    实际结果:可以正确显示标题、简介等信息。
    是否通过:通过
    5.3.5 图书推荐测试
    循环输出得到的相似图书,经测试,输出无误。
    {% for book in simbooks %}










    {{ book.desc }}



    {% endfor %}
    测试编号:9
    描述:本测试用例用于测试“推荐图书”功能是否能实现。
    前提:用户已经进入系统,通过登录验证进入推荐系统功能页面。
    步骤:
    1.进入图书推荐系统主页面
    2.点击“图书列表”
    3.进入图书详情界面。
    期望结果:用户可以查看“推荐图书”列表及详情信息。
    实际结果:用户可以查看“推荐图书”列表及详情信息。
    是否通过:通过

    5.4测试报告

    测试报告是测试阶段的最终文档输出。一个好的测试管理员应该具有良好的文档编撰能力。详细的测试报告包括足够的信息,包括产品质量和测试过程的评估,测试报告基于最终测试结果的测试和分析数据。以下是本系统设计的测试报告表。

    表3 测试报告表
    在这里插入图片描述

    5.5 软件评价

    软件评价是指软件正式运行后,根据需求对软件的功能、性能、结构、界面友好性等内容做出客观表述[20]。
    功能评价:
    本系统可流畅运行、界面风格简单友好,实现功能可以满足用户需求。
    数据评价:
    数据库设计合理完全可以满足使用需求,且程序与数据库交互良好,维护成本低。
    性能评价:
    主内容性能良好,系统对用户的可交互性良好,但程序打开与开始系统时,停顿时间较长。
    稳定性评价:
    程序运行过程中未发生程序终止、重启等异常现象。
    第六章 总结与展望
    本文首先阐述了推荐系统开发的经过,分析了推荐系统目前的研究状况。其次,阐述了推荐结果的主要推荐方法和评估指标。最后分析了主流的推荐算法以及它们各自的优缺点,尤其是基于物品的协同过滤算法。
    推荐系统的开发,一方面使用户和信息精确一致,另一方面降低信息过载时的信息获得成本。但是,通过新闻推荐等推荐系统进行的内容分发也会给用户带来不良影响。2017年9月19日,“人民日报”指定了在中国有名的内容出版平台的标题,强调了推荐系统的开发不仅需要满足用户的多样化和个性化的需要,还需要严密监视和过滤提高推荐系统的稳健性的信息。近年来,关于用户隐私、劝告引擎稳健性、信息过滤的论文被包含在今后劝告系统的重要研究方向的recsys会议中。
    目前,深层神经网络发展迅速,为推荐系统提供了新的思路,例如特征提取和排序法。现在越来越多的推荐引擎将传统的推荐算法与深层神经网络结合,以解决数据分区和推荐排名问题。深层神经网络与推荐系统的组合是今后推荐系统的研究课题。
    总而言之,推荐系统是一个巨大的信息系统。它依赖于引擎工作以及业务系统、日志系统和许多其他方面。同时,它结合了网络安全和数据挖掘等诸多研究领域。这可以为企业和用户带来值得详细研究的价值,因此,对此领域需要更深入的研究。
    而随着当代社会突飞猛进的发展,在可预见的将来,数据与信息的量级只会越来越大。彼时,对信息筛选的需求也会日益增长,推荐系统将会在未来造成越来越大的影响,对推荐系统的研究也将达到新的高度。
    本次课题研究是基于兴趣爱好的一次实践,兴趣爱好给予了我很大的动力,这也使我在遇到各种问题时,总能通过多种渠道找到解决方案。在一边进行学习,一边进行系统开发和设计过程中,遇到了很多靠自己无法解决的问题,走了很多弯路,但是,这次课题研究锻炼了我自我解决问题的能力,不仅让我对Python有了进一步的了解,而且还大大提高了编程能力,锻炼了自己的逻辑思维和整体设计的能力,收获颇多。通过这次课题研究设计,我意识到完整的软件开发思路是非常重要的,它关系到我们开发过程能否顺利实现。在项目开始之前,必须有软件工程的系统化的知识体系,不仅如此,还应包括软件结构位置、代码编写和模块划分和整体布局,只有做完这些步骤,才能逐步开发出想要实现的功能。这样定能达到事半功倍的效果。

    结束语

    本研究课题主要工作成果是设计并实现了一个基于物品的协同过滤算法实现图书推荐系统,主要任务有以下几个方面:
    文章的主体部分进行了主要模块的详细分析设计与实现。
    然后对主要功能点做出测试及文字说明,使内容详实。
    虽然系统已经做出来并且已经通过测试 ,但是系统的开发以及课题的书写由于能力和时间的原因,还存在着一些不足和不完善的地方。
    1.在页面展示方面,多数依赖列表形式,页面比较单调,有待改进。
    2.程序的性能需要不断优化,如何让图书更精准地推荐、后台可以更快捷的完成自己的工作,有待加强。
    3.还需要实现一些人性化的功能,如图书检索、对高质量期刊的推送等。
    在功能分门别类的编写时,遇到的问题较为基础 ,通过简单的设置断点等方式,可以成功解决,但是在将各个模块的功能进行整体的测试时 ,遇到了很多问题,甚至在开发周期中,因为一个抛出的异常,导致一周进度都没有更新 。查阅多种文档都未曾发现解决方案,最后,终于在外网某网站的一条帖子下的评论下,找到了解决问题的思路。
    之前对数据库的使用较为生疏,比如说连接数据库 、建立新表、增删改查对应的sql语句等,在课题研究的过程中,经过练习,对这类操作越发熟练 ,前端的设计在去网上参考了许多优秀的前端界面后设计的。
    通过今后对一些优秀的前端框架以及Python不断地学习与探索,在实践不断研究与摸索,做出更美观的前端界面,以及对接口进行研究,希望以后可以继续完善这个系统。
    经过一个学期的学习与工作,我终于完成了《基于物品的协同过滤算法实现图书推荐系统》这一课题。从接到题目到查找资料,学习知识,再到构思系统,动手实践,编写代码,我在了解了程序编写不易的同时,也增长了知识,积累了宝贵的实战经验。一开始对机器学习、推荐系统、推荐算法的几乎零基础,这使我在学习中遇到了一些困难,在指导老师的指导下,结合查阅相关资料,慢慢克服了困难,最终完成了这个项目。在实践的过程中,我也认识到推荐系统在我们的生活中扮演了重要的角色,为广大用户提供了便利;一个高效的推荐系统可以较为准确地预测用户的喜好偏向,从而为用户提供便捷地购买或使用体验。
    我知道我的课题研究还很不成熟,其中有许多的不足之处,我会在今后的学习与工作中深入学习推荐系统与推荐算法相关知识,努力完善自身的知识系统和编程能力,丰富自身的知识储备。本次宝贵的实践经验也让我受益匪浅,此次过程让我积累了程序开发与调试的经验,对以后从事相关工作有很大的帮助。
    参考文献
    [1]章宗杰,陈玮.基于标签扩展的协同过滤算法在音乐推荐中的应用.软件导刊,2018,17(1):99-101.
    [2]张智强,伍传敏.基于协同过滤算法的电子商务推荐系统.佳木斯大学学报:自然科学版,2018,36(4):603-606.
    [3]杨丽丽,袁浩浩.基于组合优化理论的协同过滤推荐算法.现代电子技术,2018,41(1):139-142.
    [4]肖文强,姚世军,吴善明.一种改进的top-N协同过滤推荐算法.计算机应用研究,2018,35(1):105-108.
    [5]张双庆.一种基于用户的协同过滤推荐算法.电脑知识与技术:学术版,2019(1):19-21.
    [6]苏庆,章静芳,林正鑫,李小妹,蔡昭权,曾永安.改进模糊划分聚类的协同过滤推荐算法.计算机工程与应 用,2019,55(5):118-123.
    [7]王宁,何震,黄泽,周毅鹏,武鑫良.改进协同过滤算法在服装个性化推荐的研究.湖南工程学院学报:自然科学版,2019(1):33-36.
    [8]陆俊尧,李玲娟.基于Spark的协同过滤算法并行化研究.计算机技术与发展,2019,29(1):85-89.
    [9]吴宾,娄铮铮,叶阳东.一种面向多源异构数据的协同过滤推荐算法.计算机研究与发展,2019,56(5):1034-1047.
    [10]沈鹏,李涛.混合协同过滤算法在推荐系统中的应用.计算机技术与发展,2019,29(3):69-71.
    [11]张玉叶,宿超.基于Python的协同过滤算法的设计与实现.山东广播电视大学学报,2019(2):82-85.
    [12]王嘉菲,朱志锋.基于协同过滤算法的视频智能推荐系统.湖北大学学报:自然科学版,2019,41(2):202-207.
    [13]邓亚文,罗可.一种基于用户和物品相似度的融合协同过滤推荐算法.电脑与信息技术,2019,27(1):6-10.
    [14]李淑敏,夏茂辉,赵志伟.基于spark的协同过滤推荐算法的改进.软件,2019,40(2):173-178.
    [15]张志鹏,张尧,任永功.基于时间相关度和覆盖权重的协同过滤推荐算法.模式识别与人工智 能,2019,32(4):289-297.
    [16]石京京,肖迎元,郑文广.改进的基于物品的协同过滤推荐算法.天津理工大学学报,2019(1):32-36.
    [17]谭立云,刘琳,苏鹏.图书借阅推荐系统算法的python实现.科学技术创新,2018(22):84-85.
    [18]邓园园,吴美香,潘家辉.基于物品的改进协同过滤算法及应用.计算机系统应用,2019(1):182-187.
    [19]周强,李曦.基于推荐技术的中国音乐数据库系统的设计.计算机技术与发展,2015,25(7):162-165.
    [20]曹景振,贾新磊,李松丹.基于物品的协同过滤算法在ACM在线评测推荐系统中的改进及应用.无线互联科技,2018,15(5):135-13

    源码下载链接

    原文下载链接

    原文

    源码下载链接

    https://download.csdn.net/download/ancientear/15036935
    源码下载链接

    展开全文
  • 基于SSM的校园二手交易平台的设计与实现

    万次阅读 多人点赞 2018-05-06 14:24:44
    PS: Java版本:1.7 数据库:MySQL 框架:Spring + Spring MVC + MyBatis 服务器:Tomcat 前端解析框架:Thymeleaf 开发工具:Idea 2017 版本管理工具:Maven 版本控制工具:GitHub ...、设计概...

    基于SSM的校园二手交易平台

    完整的设计报告在后面

    喜欢就点一下star哟,谢谢亲的支持
    https://github.com/wsk1103/Used-Trading-Platform

    下载地址: https://download.csdn.net/download/wsk1103/13189870

    Java版本:1.8
    数据库:MySQL
    框架:Spring + Spring MVC + MyBatis
    服务器:Tomcat
    前端解析框架:Thymeleaf
    开发工具:Idea 2017
    版本管理工具:Maven
    版本控制工具:GitHub

    搭建数据库
    MySQL
    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/c2c
    username=root
    password=123456
    initiaSize=0
    maxActive=20
    maxIdle=20
    minIdle=1
    maxWait=60000

    先在数据中创建名为c2c的数据库,使用Navicat for MySQL运行 c2c.sql文件创建表和导入数据

    将图片解压到任意一个盘,然后配置Tomcat,将图片路径引用到本地配置的图片路径下。
    这里写图片描述
    设置访问路径
    在这里插入图片描述

    3.2 实现过程

    3.2.1 商品首页实现

    这里写图片描述

    这里写图片描述
    其他部分实现效果
    这里写图片描述
    这里写图片描述

    3.2.2 二手商城实现

    这里写图片描述
    商城商品展示
    这里写图片描述

    这里写图片描述
    这里写图片描述

    3.2.3 商品详情实现

    这里写图片描述
    留言
    这里写图片描述

    3.2.4 站内搜索引擎实现

    这里写图片描述
    搜索结果
    这里写图片描述

    3.2.5 发布商品实现

    这里写图片描述
    这里写图片描述

    这里写图片描述

    3.2.6 发布求购信息实现

    这里写图片描述

    3.2.7 个人信息页面实现

    这里写图片描述
    这里写图片描述

    3.2.8 我发布的商品实现

    这里写图片描述
    点击修改
    这里写图片描述

    3.2.9我发布的求购信息实现

    这里写图片描述
    这里写图片描述

    3.2.10购物车实现

    这里写图片描述
    点击添加数量和减少
    这里写图片描述

    3.2.11登录注册实现

    这里写图片描述
    这里写图片描述
    这里写图片描述

    一、设计概要

    本次设计的是一个校园二手交易平台(C2C),C2C指个人与个人之间的电子商务,买家可以查看所有卖家发布的商品,并且根据分类进行商品过滤,也可以根据站内搜索引擎进行商品的查询,并且与卖家联系,达成交易的意向,也可以发布求购的信息,让卖家查看之后,与之联系,进行交易。而此次主要是针对校园用户所设计的网站,对于数据的分类应该更多的考虑校园用户的需求,例如二手书籍、二手数码等的分类应该更加细致。本次设计的主要难度在于数据的详细分类,对于数据的过滤必须要严谨,应当考虑敏感字体和敏感图片的过滤。

    可能遇到的问题有,在数据交互过程中,出现由于属性名的差距导致的数据交互失败。由于Css属性设置的问题,导致界面不完整等等。设计的算法都是自己编写的,可能存在不是最优算法的情况。

    二、设计正文

    1 需求分析

    建立一个用户可以自由交易的平台,通过ajax实现局部刷新,实现网站更具人性化,具有更良好的互动。以下是总体需求

    1.1 通过手机号码注册账号并且登陆

    每个手机号码只可以注册一个账号,并且通过账号完善个人信息和浏览商品,发布商品等,注册时需要通过手机号码获取验证码进行验证才能注册。

    1.2 实现二手商城

    商城主要显示总的商品信息,并且可以通过侧边栏点击进行信息过滤。商品点击之后可以查看详细信息。

    1.3 站内搜索引擎

    实现本站内特有的搜索引擎,可以输入字段,模糊查询合适的商品并且显示出来。

    1.4 求购信息发布

    根据需求输入相应的信息,发布求购商品。

    1.5 求购商城

    卖东西的用户,也可以通过求购商城查看是否有用户对自己拥有的二手物品有需求,查看详细的需求,有的话可以跟买家联系进行交易。

    1.6 货物出售信息发布

    卖家可以发布二手商品的信息,对商品进行描述,并且添加图片增加可信度,也方便买家查看相应的信息。

    1.7 购物车

    将想要的物品添加到购物车,可以修改数量,选择是否要支付,移除商品。选择收货地址,并且进行结算。

    1.8 个人信息

    用户发表求购信息和发布商品时需要先进行信息的完善,用户可以查看自己发布的商品,对发布的商品进行修改或删除,查看已发布求购信息,对求购的商品进行修改或删除。

    2 概要设计

    系统的整体结构流程图如下

    这里写图片描述

    2.1 系统模块

    本系统的可以分为以下几个模块。

    2.1.1 商品首页

    负责显示热门的商品信息,以及显示本网站的网站信息,导航栏负责跳转到各个页面,没有登录显示按钮可以让用户进行登陆和注册。已登录的用户显示用户名,并且可以发布商品信息,查看个人信息等。进入首页的时候,通过Ajax获取数据库中存在的热门商品数据集合,并且刷新页面的内容,点击商品之后跳转到商品详细信息模块。

    2.1.2 二手商城模块

    负责显示所有的二手商品,提供类别的侧边栏给用户点击之后显示对应的商品信息。类别侧边栏的实现后,需要为每一个类别的元素都添加一个id,通过id来获取数据库中的数据,用Ajax获取数据并且刷新页面的信息。采用分页技术,防止数据过多的时候,显示在同一个页面,给用户带来不好的体验,分页支持点击下一页上一页或者直接点击指定页面,跳转到指定的页面。商品点击之后就要跳转到商品详情。

    2.1.3 商品详情模块

    负责显示指定的商品详细信息,包括图片、名字、价格、数量等,当一个商品被点击之后,通过返回的id查询到这个数据集合,跳转到商品详细信息的页面,商品发布者可以在下方查看留言,并且与有意者打成交易意向。将对应的信息显示出来,并且提供加入到购物车的功能。商品详细信息下方显示其他用户的留言,并且已经登录的用户可以对这件商品进行评论,商品发布者可以在下方查看留言,并且与有意者打成交易意向。商品发布者可以在下方查看留言,并且与有意者打成交易意向。

    2.1.4 站内搜索引擎

    每一个页面顶部都存在一个搜索输入框,用户通过输入模糊的商品信息,后台数据库通过查询过滤相关的商品信息,并且显示出来给用户查看,显示出来的商品点击之后可以显示商品的详细信息。

    2.1.5 发布商品

    用户输入指定的信息,以及选择商品的图片,之后将这些信息结合当前登陆的用户,通过Ajax发表到后台,并且通过框架存储数据到数据库指定表。

    2.1.6 发布求购信息

    用户输入指定的信息,以及选择商品的图片,之后将这些信息结合当前登陆的用户,通过Ajax发表到后台,并且通过框架存储数据到数据库指定的求购信息表。

    2.1.7 个人信息模块

    显示个人信息,例如用户名、真实姓名、宿舍号、学号等,显示之后还需要支持对于数据进行修改,修改之后,要同步修改页面的信息,这需要用到Ajax进行数据的提交,并且进行页面的局部刷新。

    2.1.8 我发布的商品模块

    显示个人发表的商品信息,支持点击之后对数据进行修改,例如修改商品名字,修改商品的单价和数量等,修改之后将新的数据提交到数据库,数据库执行相应的修改操作,也可以直接下架某件商品,点击删除按钮之后,直接在后台数据库删除这一件商品,并且刷新当前页面上显示的个人发布的商品。给用户带来更好的体验效果。

    2.1.9 我发布的求购信息模块

    显示个人发表的求购商品信息,支持点击之后对数据进行修改,例如修改商品名字,修改商品的单价和数量等,修改之后将新的数据提交到数据库,数据库执行相应的修改操作,也可以直接下架某件商品,点击删除按钮之后,直接在后台数据库删除这一件商品,并且刷新当前页面上显示的个人求购的商品。

    2.1.10 购物车模块

    显示用户加入购物车的商品,计算总的价格,提供全选和取消全选的按钮,从后台获取商品的单价,判断当前剩余的数量,当用户点击数量添加或者减少之后,对于总价要实时刷新,采用jQuery对数据进行修改,当用户取消选中其中的某一个商品,要相应的减少价格并且刷新,提供选择收货地址,对收获地址进行管理,选好收货地址之后,结算购物车,弹出支付页面,让用户选择付款方式,并且提交。

    2.1.11 登录注册模块

    用户通过手机号码和密码进行登录,登录之后显示首页。当用户没有账号的时候,提示用户进行注册,从登录界面切换到注册界面,注册需要通过手机号码获取验证码,后台通过页面传递的手机号码,随机生成4位数的验证码并且缓存,之后通过发送139邮箱的方式发送到指定的手机,手机收取到验证码之后输入验证码提交,判断是否正确,正确则注册成功,失败则注册失败。用户注册完之后直接跳转到首页。

    2.2 数据结构设计

    首页需要的数据是热门商品的信息,商品信息需要建立一个Bean对象,存储内容是商品的id、商品名称、商品单价、商品类别、商品数量、商品详细信息、商品成色、商品附带的图片地址、热门程度、发表用户的id、留言的集合,当用户发表之后,保存数据到Bean对象中,并将它存储到数据库。首页请求数据之后,根据热门度返回多个数据,将数据存储到list集合中,并且将它转换为JSON格式数据,返回到页面,页面解析数据并且显示。

    商场则负责显示所有的商品数据,实现侧边栏点击指定的类别之后,显示对应类别的数据,需要的是类别的id,因此类别Bean对象的数据是类别id、类别名称,点击之后,通过类别id获取到商品详情集合,并且将它转为JSON格式的数据,返回到前端页面,显示数据。

    点击商品之后,需要显示商品详细信息,通过商品的id返回指定商品的Bean对象,转化为JSON格式的数据,返回到前端页面显示,需要显示商品的留言信息,因此需要留言的Bean对象,包括数据留言id、留言的商品id、留言内容、留言时间,结合商品的详情返回JSON格式数据,前端解析之后显示。

    求购商城,负责显示所有的求购商品,需要求购商品的Bean,内容包括求购商品id、求购商品名称、求购商品数量、求购商品单价、求购商品详细信息、求购商品留言集合。页面显示时从后台返回对象集合转变的JSON数据,前端解析数据并且显示出来。

    登陆界面需要验证用户信息,用户信息包括内容用户id、用户名、用户的手机号码、用户密码、用户真实姓名、用户地址、用户email、用户性别、用户学号。验证的时候只需要判断手机号码和密码是否符合,符合则验证通过,返回验证结果,用JSON存储数据。失败则返回失败信息。

    主要用到的数据结构是ArrayList负责组合各种信息,并且转换为JSON格式数据返回。数据需要排序的时候,用到的是快速排序,负责排列热门商品等的信息,并且返回数据到前端页面进行显示。

    3 详细设计

    3.1 数据字典

    用户信息表

    字段名字段类型是否可为空备注
    IdInt(11)主键
    ModifyDatetime修改时间
    UsernameVarchar(50)用户昵称
    PhoneChar(11)用户手机号码
    realNameVarchar(20)用户真实姓名
    ClazzVarchar(20)用户所在班级
    SnoChar(12)用户学号
    DormitoryVarchar(20)宿舍号
    GenderChar(2)性别
    CreatetimeDatetime创建时间
    AvatarVarchar(200)头像

    用户密码表

    字段名字段类型是否可为空备注
    IdInt主键
    ModifyDatetime修改时间
    PasswordVarchar(24)用户密码
    UidInt用户id

    商品表

    字段名字段类型是否可为空备注
    IdInt(11)主键
    ModifyDatetime修改时间
    NameVarchar(50)商品名称
    LevelInt商品成色
    RemarkVarchar(255)商品详细信息
    PriceDecimal(0.00)商品价格
    SortInt商品类别
    CountInt商品数量
    DisplayInt商品是否被下架
    TransactionInt交易方式
    SalesInt商品销量
    UidInt发表的用户id
    ImageVarchar(255)商品的图片地址

    商品留言

    字段名字段类型是否可为空备注
    IdInt(11)主键
    ModifyDatetime修改时间
    SidInt商品的id
    ContentVarchar(122)留言内容
    DisplayInt是否可见
    UidInt评论的用户id

    我的收藏

    字段名字段类型是否可为空备注
    IdInt(11)主键
    ModifyDatetime修改时间
    SidInt商品的id
    DisplayInt是否可见
    UidInt评论的用户id

    求购商品

    字段名字段类型是否可为空备注
    IdInt(11)主键
    ModifyDatetime修改时间
    NameVarchar(50)求购商品名称
    RemarkVarchar(255)求购商品详情
    PriceDecimal(0.00)求购商品价格
    SortInt求购商品类别
    CountInt求购商品数量
    DisplayInt信息是否被删除
    TransactionInt交易方式
    UidInt发表的用户id
    ImageVarchar(255)商品的图片地址

    求购商品留言

    字段名字段类型是否可为空备注
    IdInt(11)主键
    ModifyDatetime修改时间
    QidInt求购商品的id
    ContentVarchar(122)留言内容
    DisplayInt是否可见
    UidInt评论的用户id

    我发布的商品

    字段名字段类型是否可为空备注
    IdInt(11)主键
    ModifyDatetime修改时间
    DisplayInt是否被删除
    UidInt用户id
    SidInt对应商品id

    我求购的商品

    字段名字段类型是否可为空备注
    IdInt(11)主键
    ModifyDatetime修改时间
    DisplayInt是否被删除
    UidInt用户id
    QidInt求购商品id

    已购买的商品

    字段名字段类型是否可为空备注
    IdInt(11)主键
    ModifyDatetime修改时间
    StateInt商品当前的状态
    UidInt用户id
    SidInt商品id
    QuantityInt商品数量

    购物车

    字段名字段类型是否可为空备注
    IdInt(11)主键
    ModifyDatetime修改时间
    DisplayInt商品是否被删除
    UidInt用户id
    SidInt商品id
    QuantityInt商品数量

    3.2 实现过程

    3.2.1 商品首页实现

    负责显示热门的商品信息,以及显示本网站的网站信息,导航栏负责跳转到各个页面,没有登录显示按钮可以让用户进行登陆和注册。已登录的用户显示用户名,并且可以发布商品信息,查看个人信息等。进入首页的时候,通过Ajax获取数据库中存在的热门商品数据集合,并且刷新页面的内容,点击商品之后跳转到商品详细信息模块。

    首页的前端设计大体如下

    顶部实现导航栏,导航栏包括网站logo支持点击之后返回到首页、输入框和按钮负责站内搜索引擎的实现、以及一个span包裹的数据,当有用户登陆时将它替换为用户名,没有用户登录时,则将它设置为登录注册按钮,方便用户进行登录和注册。用户登陆之后,显示出来的用户名可以通过绑定鼠标进入事件,弹出选择框让用户选择相应的操作,例如显示个人信息、查看发布的商品、查看求购的商品、发布商品、发布求购商品信息。导航栏与其他页面共用。

    这里写图片描述
      显示热门商品信息,采用轮播图实现,主要是先定义一个顶级的div指定position是绝对位置,将除了当前显示的页面之外的轮播图div都隐藏起来,为当前的div添加一个current类,判断点击的方向,如果是右则先获取到current的下一个div,并且将它准备在右侧等候进入,当前的div移出之后,就将下一个进入,并且删除原来的current类,将它添加给新的div。在此过程中控制动画,就可以实现一个精美的轮播图。
    这里写图片描述
      其他部分实现效果
    这里写图片描述
    这里写图片描述

    3.2.2 二手商城实现

    负责显示所有的二手商品,提供类别的侧边栏给用户点击之后显示对应的商品信息。类别侧边栏的实现后,需要为每一个类别的元素都添加一个id,通过id来获取数据库中的数据,用Ajax获取数据并且刷新页面的信息。采用分页技术,防止数据过多的时候,显示在同一个页面,给用户带来不好的体验,分页支持点击下一页上一页或者直接点击指定页面,跳转到指定的页面。商品点击之后就要跳转到商品详情。

    二手商城前端实现

    主要是设计侧边栏比较有难度,首先获取后台返回的三级类别,并且将顶级类别显示在侧边栏中,当鼠标移动上去的时候,显示其余两级目录,显示次级目录作为标题,而第三级的目录则是可点击的按钮,点击之后显示相应类别的商品信息。
    这里写图片描述
    商城商品展示
    这里写图片描述

    其次是底部分页按钮的实现,左右切换需要通过jQuery来控制,下一页则判断是否已经到达当前显示的页数倒数第二个,如果是就删除第一个页数,并且添加下一页的页数(前提是还有页数可以继续),如果不是倒数第二个,就将当前元素的current类名删除并将它赋给下一个元素。
    这里写图片描述
    这里写图片描述

    3.2.3 商品详情实现

    负责显示指定的商品详细信息,包括图片、名字、价格、数量等,当一个商品被点击之后,通过返回的id查询到这个数据集合,跳转到商品详细信息的页面,商品发布者可以在下方查看留言,并且与有意者打成交易意向。将对应的信息显示出来,并且提供加入到购物车的功能。商品详细信息下方显示其他用户的留言,并且已经登录的用户可以对这件商品进行评论,商品发布者可以在下方查看留言,并且与有意者打成交易意向。商品发布者可以在下方查看留言,并且与有意者打成交易意向。

    显示商品的详细信息,并且添加可以留言的模块,用户发表留言之后,会在下方的留言板通过ajax进行实时的刷新。
    这里写图片描述
      留言
    这里写图片描述

    3.2.4 站内搜索引擎实现

    每一个页面顶部都存在一个搜索输入框,用户通过输入模糊的商品信息,后台数据库通过查询过滤相关的商品信息,并且显示出来给用户查看,显示出来的商品点击之后可以显示商品的详细信息。
    这里写图片描述
      搜索结果
    这里写图片描述

    3.2.5 发布商品实现

    用户输入指定的信息,以及选择商品的图片,之后将这些信息结合当前登陆的用户,通过Ajax发表到后台,并且通过框架存储数据到数据库指定表。

    三级联动的实现,用Ajax获取到三级的类别JSON数据,之后解析JSON数据,将第一级的添加到第一个下拉框,第二级的添加到第二个下拉框,第三级的添加到第三个下拉框,当第一个或者是第二个发生改变的时候,通过获取父容器的子集合修改后两级或者一级的下拉框内容,用jQuery的html替换即可。
    这里写图片描述
    这里写图片描述
     点击图片后显示缩略图,需要先采用一个file的input,获取到file的文件集合,并且获取它的网页缓存地址,获取后将它设置到img的src中,可以添加一个渐变的动画效果,给用户带来更好的视觉体验。
    这里写图片描述

    3.2.6 发布求购信息实现

    用户输入指定的信息,以及选择商品的图片,之后将这些信息结合当前登陆的用户,通过Ajax发表到后台,并且通过框架存储数据到数据库指定的求购信息表。三级联动采用前一个的即可。
    这里写图片描述

    3.2.7 个人信息页面实现

    显示个人信息,例如用户名、真实姓名、宿舍号、学号等,显示之后还需要支持对于数据进行修改,修改之后,要同步修改页面的信息,这需要用到Ajax进行数据的提交,并且进行页面的局部刷新。

    所有信息采用jQuery的EasyUI中的accordion显示,标题显示信息,而底部内容则显示修改的组件,之后Ajax修改具体信息后需要将对应的新的内容,采用jQuery显示到标题中。
    这里写图片描述
    这里写图片描述

    3.2.8 我发布的商品实现

    显示个人发表的商品信息,支持点击之后对数据进行修改,例如修改商品名字,修改商品的单价和数量等,修改之后将新的数据提交到数据库,数据库执行相应的修改操作,也可以直接下架某件商品,点击删除按钮之后,直接在后台数据库删除这一件商品,并且刷新当前页面上显示的个人发布的商品。给用户带来更好的体验效果。
    这里写图片描述
      点击修改
    这里写图片描述

    3.2.9我发布的求购信息实现

    显示个人发表的求购商品信息,支持点击之后对数据进行修改,例如修改商品名字,修改商品的单价和数量等,修改之后将新的数据提交到数据库,数据库执行相应的修改操作,也可以直接下架某件商品,点击删除按钮之后,直接在后台数据库删除这一件商品,并且刷新当前页面上显示的个人求购的商品。
    这里写图片描述
    这里写图片描述

    3.2.10购物车实现

    显示用户加入购物车的商品,计算总的价格,提供全选和取消全选的按钮,从后台获取商品的单价,判断当前剩余的数量,当用户点击数量添加或者减少之后,对于总价要实时刷新,采用jQuery对数据进行修改,当用户取消选中其中的某一个商品,要相应的减少价格并且刷新,提供选择收货地址,对收获地址进行管理,选好收货地址之后,结算购物车,弹出支付页面,让用户选择付款方式,并且提交。
    这里写图片描述
      点击添加数量和减少
    这里写图片描述

    3.2.11登录注册实现

    用户通过手机号码和密码进行登录,登录之后显示首页。当用户没有账号的时候,提示用户进行注册,从登录界面切换到注册界面,注册需要通过手机号码获取验证码,后台通过页面传递的手机号码,随机生成4位数的验证码并且缓存,之后通过发送139邮箱的方式发送到指定的手机,手机收取到验证码之后输入验证码提交,判断是否正确,正确则注册成功,失败则注册失败。用户注册完之后直接跳转到首页。

    登录界面需要4个页面,第一个是登录界面,显示手机号码和密码的组件,并且需要底部添加注册按钮,以及忘记密码。第二个是注册界面,注册界面首先提供用户输入手机号码以及验证码,获取验证码的按钮,获取之后跳转到下一步,也就是输入密码界面。输入密码界面需要两次确认密码,输入确认之后就是跳转到首页。最后一个界面是忘记密码,同样通过输入手机号码获取验证码即可。之后将这四个界面通过CSS3的transform属性,将四个界面组合成一个立方体,当用户点击切换到各自界面的按钮时,就采用transform的rotateY,将切换的效果实现成立体翻转的效果。
    这里写图片描述
    这里写图片描述
    这里写图片描述

    后台实现的过程

    1. 总述:本次后台使用的编程语言为Java,使用的框架是Spring+SpringMVC+Mybatis,前端网页渲染的语言不使用JSP,而我选择使用的是thymeleaf框架,

    原因如下:

    a. thymeleaf可以直接渲染出HTML5和CSS3的效果。

    b.前端写的网页合并到后台处理的时候不需要转换成jsp页面,方便快捷。

    c. thymeleaf可以很方便的解析后台传输到前端的值。

    d. thymeleaf,我个人认为是个比较好的模板,性能也比一般的,比如freemaker的要高,而且把将美工和程序员能够结合起来,美工能够在浏览器中查看静态效果,程序员可以在应用服务器查看带数据的效果。

    e. thymeleaf是一个支持html原型的自然引擎,它在html标签增加额外的属性来达到模板+数据的展示方式,由于浏览器解释html时,忽略未定义的标签属性,因此thymeleaf的模板可以静态运行。

    2. 后台结构总图
    这里写图片描述

    java:存放Java代码
      bean:用于序列化到前端,然后解析的实体类。
      controller:spring和springMVC的控制器,用于处理请求的链接
      dao:,和数据库进行交互
      pojo:普通的Java实体类
      service:定义接口,用于连接controller和dao
      token:生成唯一标识,用于防止用户重复提交。
      tool:工具类,例如处理文件,文本敏感词过滤,图片色情鉴别等等。
      resources:存放资源文件,例如Mybatis生成的xml文件,spring,springMVC,mybatis配置文件等等
      css:网站样式
      img:网站部分图片
      js:JavaScript文件
      templates:网站html文件

    3.后台实现了一个只能单用户登录的功能:如果有两个用户使用同一个账号分别登录,那么后一个登录的用户会踢掉第一个用户登录的账号,也就是说先登录的用户会被强制退出。实现细节:主要使用的是websockt和spring websockt。首先前端判断用户有没有登录,如果有登录的话,就将用户的手机号码,当前时间发送到后台,后台接收到信息,解析信息,将信息存储到Map中,前台循环提交这些信息,并判断Map中手机号码对应的时间是否相等,如果不相等,证明有其他用户登录了该账号,后台发送下线信息到前端,前端收到信息后,触发退出当前账号事件。

    4.常规数据库增删查改:考虑到密码是重要的信息,所以当操作密码的时候,都是先使用MD5对其进行加密后处理。例如修改密码,注册用户等等。各个数据表之间的关联都是通过逻辑处理进行数据联系的。

    5.防止用户重复提交:在每个界面,都会由后台生成一个token,然后前端页面存储该token,如果用户进行提交按钮等事件时,就会连这个token一起发送到后台进行处理,后台若获取不到token或者token不相匹配,那么就判定该用户重复提交这个事件,后台直接返回原本页面。

    6.敏感词过滤:管理员将敏感词编入到数据库中,用户发布商品时附带的商品名称,商品备注等等,都会被过滤,将其中的敏感词替代成**。然后返回对应的数值。用户在填写商品名称,详情的时候,还会ajax自动和后台进行验证判断,并实时提醒用户有没有输入敏感词。

    7.图片色情鉴别:使用的是百度的百度开发者平台中的色情图片识别功能。通过提交一张图片到百度的这个功能中,该项目功能就会返回一个数字,姑且称该值为色情值,如果该色情值超过一个给定的数值,那么就可以判定该图片为色情图片,如果用户上传的是色情图片,那么就无法插入,修改,后台会直接返回一个错误值给前端,提示使用了非法的图片。

    4.问题分析

    4.1 在实现只能单用户登录的时候,由于是第一次编写,以前没有经验,刚开始的想法是设计2个Map(m1,m2),用于存储前一次登录(m1)和再次登录(m2)的手机号码和对应的时间。首先,当用户第一次登录的时候,m1和m2必定都为空,m2先通过手机号码存储当前的时间,然后前端通过websockt发送定时信息过来请求判断,在后台处理前端发送过来的信息的时,先判断m1是否存在m2中该的该手机,如果不存在,则证明为第一次登录,那么m1存储m2中对应手机的对应时间。如果存在,那么将m1中时间和m2中的时间进行比较,若比较结果一致,是单用户登录;若不一致,该手机为前一次登录,强迫下线。当用户再次登录的时候,m2中存储手机对应的当前的时间,那么前一次登录的时候m1中存储的手机对应的时间必然小于再次登录中m2中存储的时间,此时,前一次登录强迫下线,m1中的时间刷新为m2中对应的时间。但是这个思路出现了一个严重的问题,在测试的时候,首次登录后,第二次登录确实会踢掉第一次登录,但是第三次登录的时候,所有的用户都平安无事,不会互相排挤,此时出现的问题应该是线程不安全导致的结果。m1,m2这2个map都可能会出现这种情况。

    解决方法:设计一个Map(m),用于存储手机号码和其对应的时间。首先,用户登录后,将当前的时间,手机号码通过websockt发送到后台,后台进行判断处理,如果发送过来的时间和m中存储的时间进行比较,若一致,证明没有其他用户登录,若不一致,证明其他用户登录过,那么当前这次用户就会被迫下线

    4.2 设计的工具类中,因为存在很多个类和包,如果没有使用工厂模式进行设计的时候,那么在启动项目的时候,多用户登录时,就会导致线程不安全或者线程堵塞,并且将类中的所有方法声明为static时,会占用了许多的内存。

    解决方法:使用静态工厂模式-静态内部类。将所有的工具类集中到一个总类中,然后为给总类设计一个静态内部类,其他将要调用的方法设计为public非静态方法,如果调用的时候用工厂调用就可以了。

    4.3 当使用多个参数通过mybatis获取数据库数据时,出现了参数未定义的情况,这是因为多个参数的时候,要将这些参数封装为一个Map。

    解决方法:将多个参数封装为一个Map,然后将该Map作为参数传递给mybatis的处理方法。

    4.4 发送手机验证码出现的错误:一开始像使用邮箱验证用户的,但是在通过邮箱给用法发送信息的时候,这个时候就有多个邮箱作发送者供选择-QQ,163,127,sina等等。原先使用的是163邮箱进行发送信息,但是由于发送的内容过于少,被系统认定为垃圾邮件不给发送或者接收。其他邮箱也类似。后来感觉使用邮箱发送验证码已经被淘汰了,现在流行手机验证了,所以改为发送手机验证码。但是手机发送验证码的话,不想使用网上别人提供的服务,打算自己写一个,关键是怎么将验证码发送到手机上。

    解决方法:将验证码发送到139邮箱上就可以了,一般的手机用户都会默认绑定139邮箱的,如果139邮箱收到信息,那么就会通过发送短信的形式提示到对应的手机上,这样就可以实现手机验证码的发送了。

    4.5 前端使用Ajax局部刷新时,有可能会导致新显示的内容无法绑定点击事件,最终导致在点击相应的按钮(例如加入购物车按钮)时,页面没有反应。

    解决方法:在Ajax的for循环显示结果内容后,为按钮等绑定相应的事件。这样就可以解决该问题。

    6.用户使用说明

    6.1 首页

    首先访问本站网址,进入首页,可以浏览首页的商品信息,首页轮播图可以左右切换查看商品信息,如果没有主动切换,那么每3.5s之后会自动往右切换一张,往下滑动显示的是其他的一些热门商品缩略信息,点击商品名字之后可以查看该商品的详细信息和留言。再下方是一些其他信息,可以忽略。

    6.2 普通游客的限制

    普通游客可以随意访问首页,可以通过导航栏访问商城,求购商城等。但是如要要发布求购、发布商品则需要先登录。

    6.3 没有账号?

    如果用户还没有账号,那么点击右上角的注册按钮,之后会跳转到注册界面,用户需要输入手机号,再通过它获取验证码,注意输入的手机号必须要格式正确并且有效,获取验证码之后,便点击下一步,此时到达的界面是确认密码界面,重复输入密码,两次输入的密码必须一致。确认完毕之后就会进入首页。如果用户忘记了自己注册过的账号密码,那么点击登录界面的忘记密码选项,输入注册时使用的手机号码,通过此手机号码获取验证码,输入验证码之后,点击下一步开始重置密码,重置完毕之后就会重新进入到首页。

    6.4 商城

    用户想要查看其他用户发布的商品,需要通过点击导航栏处的商城进入到商城页面,在此可以浏览所有的商品,每页显示12个,底部的分页按钮,可以点击之后切换到用户想找的页面。而用户如果需要过滤信息,找到自己想要的类别,左侧悬浮的悬浮框,鼠标移动到指定的类别中,查看详细的类别,点击自己想要找的商品类别,网站便会过滤出指定的商品呈现给用户。

    商城显示的商品信息只是一部分,通过点击商品名可以跳转到商品详细信息页面,用户可以在此查看商品的所有信息,可以将它添加到购物车,或者查看下方其他用户的留言,也可以针对自己的意见,对商品做出评价。

    6.5 模糊查询

    如果想要模糊查询商品,最顶部有一个输入框,输入商品的信息,点击搜索按钮,系统会自动过滤合适的商品呈现给用户。

    6.6 求购商城

    如果用户有商品想要出售,可以进入求购商城,浏览其他用户的求购信息,通过点击顶部的导航栏 求购商城 进入查看所有的求购信息,同样有分页和侧边栏的功能。

    6.7 发布商品信息

    如果已经登录过,那么右上角显示的是用户名,将鼠标移动到上面,会弹出一个下拉框,点击发布商品信息,按照提示输入各自的信息,之后确认信息无误之后点击发布按钮即可。

    6.8 发布求购信息

    发布求购信息的过程跟发布商品信息一样,主要是点击下拉框的发布求购信息,在发表即可。

    6.9 查看我发布的商品

    鼠标移动到左上角的用户名,点击显示出来的下拉框的我发布的商品,就可以进入到自己发布过的商品,可以点击每一个商品下方的修改图标可以对商品进行修改,点击删除图片可以下架这个商品。

    6.10 查看我的求购商品

    跟查看我发布的商品基本一致,只是点击的是我的求购商品。

    6.11 购物车

    用户浏览到合适的商品,可以点击添加至购物车的按钮,之后可以将鼠标移动至右上角用户名处,点击显示出来的下拉列表,点击我的购物车,进入到我的购物车查看自己有意向购买的商品。此时可以选择收货地址,或者修改购物车中的一些信息,例如修改数量,或者删除某一件商品。也可以同时选中所有的商品,或者是取消选中所有的商品,之后便可以结算。

    三、设计总结或结论

    该C2C校园二手交易平台,界面简洁明了,能给用户一种美的视觉上的享受。并且操作简单易懂,可以大胆但是毫不夸张的说,本系统适用于99%的青少年愉快的使用,对于不是很了解智能科技的人来说,只要看看就基本可以掌握然后熟练的使用该系统了。并且本系统的动画效果做得非常的完美,前端工作人员争取使用最少的代码实现最炫酷的动态效果,例如3D页面转换,动态加入购物车效果,搜索的时候动态自动提示商品名字功能等等,无一不是本系统的亮点。由于前端本着使用最少的代码,实现最炫酷的动态效果,所以其性能可以来说是杠杠的。并且前端所构建的网站为响应式网站,当页面的大小发送变化的时候,页面会随着变化,但是我们的变化不会出现任何的纰漏。在兼容性方面,本网站可以完美的兼容ie8+,Firefox8+,chrome6+等等,虽然目前比较少用户使用这些版本以下的浏览器,但是要做的话,我们就要力争做到完美,前端人员通过查询资料,目前可以最完美的兼容上诉浏览器的以下版本。

    前端页面缺点:对于那些不兼容HTML5和CSS3的浏览器,使用的是JavaScript来动态实现这些3D效果的,所以可能展示的效果不如支持HTML5和CSS3的本身效果好。对应浏览器版本真的是过低的用户,无法完美的显示本系统的动态网页。JavaScript实现的那些动画效果可能存在某些目前未知的bug,导致性能上的加载可能会出现瑕疵。

    后台实现的优点:后台为了提高性能,使用了一些目前属于比较好的设计模式,例如工厂方法模式,代理模式,备忘录模式,单例模式等等。数据库表的设计思想主要是参考阿里巴巴的开发手册进行设计的,在性能上,建立了适当的索引,增强了查询速度,并且自己设计了许多的算法对后台数据的处理进行优化等等。本来想使用集群和分布式来实现后台,但是考虑到现在如果使用集群,分布式来实现,那么开发周期得提升不止一个档次的时间。

    网站加载图片的时候,通常耗费的主要流量和影响速度的原因之一就是这个,所以后台设计了一个比较有意思的算法对图片进行适当的压缩,在前端显示的时候,主要显示的压缩后的图片,当鼠标移到图片上的时候,那么通过ajax显示未被压缩过的图片的放大版。这样,既可以节省带宽,又可以提高用户的体验。

    为了防止XSS攻击,可以使用消毒和HttpOnly防止该现象;对于注入攻击,使用的方法为错误回显,盲注,参数绑定;对于CSRF攻击,可以使用表单token,验证码和Rererfer check。

    对于密码,手机号码,真实信息等等敏感信息,通常都需要对其进行信息加密,我使用的是单向散列表加密和对称加密,还有就是使用公钥密钥配对核实认证。但是如果使用到密钥的话,那么一般会要求用户下载安全证书到本机。

    信息过滤和反垃圾是目前一个比较主流的问题。我使用的主要是文本匹配来过滤敏感词的。当用户发布的信息很长的时候,使用的过滤算法是双数组Trie算法进行敏感词过滤,该算法利用两个稀疏数组存储树结构,base数组存储Trie树的节点,check数组进行状态检查。该算法需要根据业务场景和经验确定数组大小,避免数组过大或者冲突过多。

    简而言之,前端效果简洁炫酷,操作简单易懂。

    没有实现的功能:秒杀系统,前端反向代理,CDN加速。

    参考文献

    [1] 李智慧. 大型网站技术架构 核心原理与案例分析[M].北京,工业机械出版社,2013.
    [2] 马丁著 韩磊译.代码整洁之道[Clean Code A Handbook of Agile Software Craftsmanship] [M]. 北京,人们邮电出版社,2010.
    [3] Craig Walls 著 张卫滨译. Spring In Action[M]. 北京,人民邮电出版社,2016
    [4] Thomas H.Cormen , Charles E.Leiserson, Ronald L.Rivest, Clifford Stein著,徐云,王刚等译. 算法导论(原书第3版)[M]. 北京,机械工业出版社,2015
    [5] Joshua Bloch 著 杨春花 俞黎敏 译. Effective Java(Second Edition) [M]. 北京,机械工业出版社,2016
    [6] 本·弗莱恩(Ben Frain)著奇舞团 译. 响应式Web设计 HTML5和CSS3实战(第2版)[M]. 人民邮电出版社,2017
    [7] 达科特(Jon Duckett) 著 刘涛,陈学敏 译. JavaScript&jQuery交互式Web前端开发[M]. 清华大学出版社,2015
    [8] NicholasC.Zakas著 李松峰曹力 译. JavaScript高级程序设计(第3版)[M]. 人民邮电出版社,2016

    展开全文
  • 现在趁着有点空闲,随手记录一点以前学过的,或者正在学习的知识点,相当于个备忘录。 ** 2.卷积神经网络模型概览 ** 从开始的LeNet到后来的VGGNet,再到google的Inception系列,再到ResNet系列,每种神经...

    1.前言

    我的毕设做的是基于opencv和卷积神经网络的人脸识别项目。在做完这个项目之后,我一直想好好总结一下所学到的关于卷积神经网络的知识。现在趁着有点空闲,随手记录一点以前学过的,或者正在学习的知识点,相当于一个备忘录。

    **

    2.卷积神经网络模型概览

    **
    常见的卷积神经网络结构
    从一开始的LeNet到后来的VGGNet,再到google的Inception系列,再到ResNet系列,每一种神经网络模型都有其创新的点,下面我们就来按照历史脉络好好讲解一下各种模型的特点。(里面涉及到的各种卷积神经网络的基础知识要点可以参见我的另一篇基础博客)

    2.1LeNet模型结构

    LeNet网络结构是再1998年由lecun提出的。它被创造出来的目的是解决手写数字识别的问题。即它是一个10分类任务的解决办法。下图是它的一个基本的网络结构。
    LeNet网络结构
    网络结构图中显示的很清楚。它包括了两个卷积层,两个下采样层,两个全连接层和一个激活层,最后有一个sotfmax分类层。可以说,LeNet麻雀虽小,五脏俱全。包括了基本的卷积神经网络的所有单元。

    2.2 AlexNet

    话不多说,我们直接上来看AlexNet的网络结构:
    在这里插入图片描述
    我们可以看到,它的网络结构被分成了两支,这是因为当时的GPU计算能力不够,显存容量不够大。为了完成模型的训练,作者使用了两块显卡来进行分布式的训练。我们现在想要训练这样一个模型,只需要实现其中一条就好了。
    emmmm我其实个人是想知道怎么进行分布式训练的,但是我没有两块显卡(贫穷限制了我的发展) 找不到相关技术资料,这里就不赘述了。
    对比刚刚的LeNet,我们可以发现从结构上来看,它并没有很大的改变。我们看它的网络结构:输入层是224* 224的数据,然后进行了多轮卷积(提取特征),其中包括11* 11的卷积核,5* 5的卷积核,3* 3的卷积核。虽然在图片上我们只画了卷积层,但我们应该知道,每一个卷积层之后都会跟上一个激活层(用来增加模型的非线性表达能力),一个降采样pooling层(减小数据量,提取主要特征),以及一个局部归一化处理(对数据进行一定的约束,使我们的数据约束在一定的范围内,使网络更好的收敛)。经过多个卷积层之后,就会有三个fc层(全连接层)。同样的,在每一个fc层之后,也会有有一个relu激活层,以及一个dropout层(减小参数量,防止过拟合,增加i网络结构变化)。最后呢,通过一个fc层+softmax层来将我们的数据映射到一个一千维的向量上去(因为实现的是一千种物品的分类网络),这个向量就是我们输入的图像在这一千个类别上的概率分布。其中概率值最高的那个类别就是网络判断出来图像所属的类别。相较与LeNet网络,它的网络深度更深,并且成功运用了gpu进行运算,为后面的人们打开了新世界大门。整个网络的参数量在60兆以上,最中训练出来的模型文件在200兆以上。它最大的意义在于,通过这次实验,证明了更深层次的卷积神经网络,可以提取出更加鲁棒的特征信息,并且这些特征信息能更好的区分物品类别。

    我个人的意见是,这个更深层网络提取更高维度的特征,它是这么个意思:前面的卷积层提取一些浅层的特征,比如纹理,形状(我们输入的是颜色特征),然后中间的卷积层呢,提取的是一些更复杂的特征,这些特征难以描述,就类似于我们中国说看山不是山,看水不是水的境界,只可意会,不可言传。而最后的分类信息,就是最后的看山还是山,看水还是水的境界。

    在AlexNet网络中,有以下特点:

    • 增加了relu非线性激活函数,增强了模型的非线性表达能力。成为以后卷积层的标配。
    • dropout层防止过拟合。成为以后fc层的标配。
    • 通过数据增强,来减少过拟合。
    • 引入标准化层(Local Response Normalization):通过放大那些对分类贡献较大的神经元,抑制那些对分类贡献较小的神经元,通过局部归一的手段,来达到作用。

    当然后来人们通过研究发现,这个LRN层并没有啥太好的作用,所以在后来的网络结构中,它被BN层(批归一化层)取代了。

    2.3 ZFNet

    在这里插入图片描述
    ZFNet在AlexNet的基础上做了小小的改进:

    • 调整第一层卷积核大小为7*7
    • 设置卷积参数stride=2

    通过更小的卷积核和更小的步长,来提取更多的信息,确保网络提取出来的信息更加有效。其次,它增加了卷积核数量,导致网络更加庞大。
    最重要的是:它从可视化的角度出发,解释了CNN有非常好的性能的原因。
    在这里插入图片描述

    如图所示,右半边是我们一个正常的神经网络的数据流向:对于一副输入图像,我们通过pooling层来进行下采样,再通过卷积层进行特征提取,通过relu层来提升非线性表达能力。对于最后的输出结果,我们怎么把它还原成原始的图片呢?
    实际上,如果我们想进行100%的还原是不可能的,因为每一次的pooling层都会丢失一些信息。因此我们在可视化的时候,更主要的是对它的特征的语义进行更高层次的分析。通过对输出层进行上采样,可以得到与我们原始图像大小一致的特征图。通过观察这些特征图,作者得出了这样的一些结论:

    • 特征分层次体系结构(就是我前面说的三层)
    • 深层特征更鲁棒(区分度高,不受图片微小的影响)
    • 深层特征收敛更慢

    2.4 VGGNet

    它由牛津大学计算机视觉组和Google Deepmind共同设计。主要是为了研究网络深度对模型准确度的影响,并采用小卷积堆叠的方式,来搭建整个网络。它的参数量达到了138M,整个模型的大小>500M.网络结构如下:
    在这里插入图片描述
    从上面的结构中我们可以看到,VGGNet的网络结构被分为11,13,16,19层。每层都包含了不同数量的卷积层(需要注意的是,每层卷积层之后都有激活层和池化层,只是由于长度限制没有在表中列出来),最后通过三个fc层来将我们的特征进行最后的向量化,最终得到一个1000维的向量,这个向量经过softmax之后,就会得到最终我们类别上的概率分布。而概率值最高的那个,就是我们所要分类的那个类别。
    VGGNet的特点:

    • 网络深,卷积层多。结构哦更加规整,简单。
    • 卷积核都是3* 3的或者1* 1的,且同一层中channel的数量都是相同的。最大池化层全是2*
      2。
    • 每经过一个pooling层后,channel的数量会乘上2.
      也就是说,每次池化之后,Feature Map宽高降低一半,通道数量增加一倍。VGGNet网络层数更多,结构更深,模型参数量更大。

    VGGNet的意义:

    • 证明了更深的网络,能更好的提取特征。
    • 成为了后续很多网络的backbone。

    2.5 GoogleNet/Inception v1

    在设计网络结构时,不仅仅考虑网络的深度,也会考虑网络的宽度,并将这种结构定义为Inception结构(一种网中网(Network in Network)的结构,即原来的节点也是一个网络)。
    值得一提的是,GoogleNet网络的参数量只有6.9兆,模型大小大约50M.
    为什么GoogleNet网络的参数这么少呢?我们先来看一下它的基本单元的结构:
    在这里插入图片描述
    主要原因就是它有效的利用了1* 1 的卷积核。不同于VGGNet从上到下的类似于一个串的结构,Inception的结构表现为一个网中网的结构。也就是说,对于我们中间的一个隐藏层层,它的每个节点也都是一个卷积网络。对于前一层传入进来的特征图,这层的每一个节点对它进行了1* 1 ,3* 3,5* 5的卷积和3* 3的pooling操作。其中值得一提的是,在3* 3和5* 5 的卷积操作之前,该网络用1* 1 的卷积核降低了输入层的channel的数量。例如:我们的输入是一个56* 56 * 128维的这么一个特征(这时候128就是我们channel的数量)。我们通过一个1* 1 的卷积核,可以将通道数降为32,然后我们将它再输入到3* 3的卷积核中。大大减少了计算量。最后,我们将所有的Feature Map进行连接,最后得到这个层的输出。
    在ZFNet的学习中我们知道,更深层的网络收敛的速度就越慢。在GoogleNet中,为了保证网络更深之后,能够哦收敛的比较好,它采用了两个loss来对网络参数进行调节,进而确保在网络变深之后,依然能够达到一个比较好的收敛效果。
    这里需要解释一下什么叫网络宽度:网络深度指的是当前的这个网络一共有多少层,宽度则是说在同一层上channel的数量。
    在这里插入图片描述
    这里我们举了一个例子,来说明如何通过1* 1 的卷积核来进行计算量的一个节省,以及参数规模的一个降低。大家自行体会。

    2.6 Inception v2/v3

    在提出了Inception v1之后,google又提出了Inception v2/v3/v4.在前面介绍视觉感受野的时候,我们曾经说过,一个大的卷积核可以由多个小的卷积核来替代。在v2/v3中,他们有效的利用了这个知识。在Inceptiion v2中,伟大的作者们通过两层3* 3的卷积核代替掉了5* 5的卷积核。而在Inception v3中,更是桑心病狂 别出心裁的用n* 1 + 1* n的卷积核代替了n* n的卷积核。
    在这里插入图片描述
    通过这样的操作,我们能够实现什么样的效果呢?

    • 参数量降低,计算量减少。
    • 网络变深,网络非线性表达能力更强(因为在每一个卷积层后面都可以增加一个激活层)

    要注意的是,在实验中伟大的先行者们发现,并不是拆分都能达到很好的效果。卷积的拆分最好是用在中间的部分,不要在图像的开始就进行这样的拆分。

    2.7 ResNet

    它是在2015年,有何凯明团队提出,引入了跳连的结构来防止梯度消失的问题,进而可以进一步加大网络深度。它的结构如下所示:
    在这里插入图片描述
    跳连的结构如下所示:
    在这里插入图片描述
    可以发现,其他的网络中,都是从上到下的串联的结构 ,而resnet网络则是跳连结构,它的意思是将输入特征直接传输到输出层,和经过卷积之后的特征相加,共同组成输出层的一部分。
    那么,为什么通过跳连结构就可以加深网络的深度呢?在VGG网络中,我们知道当网络深度达到一定界限的时候,在训练中就较难收敛。较难收敛的原因就是随着网络深度的加深,产生了梯度消失的问题。什么是梯度消失呢?有基础的人应该知道,卷积神经网络在进行BP时,都是通过梯度来计算权重修改量的。而梯度的计算遵循的是链式法则,即一个参数的梯度是多个梯度相乘之后的结果。假如每个梯度都小于1的话,那么,x1 * x2* x3* x4…,当n趋于无穷的时候,limxn=0,即梯度消失。假如每个梯度都大于1的话,那么,x1 * x2 x3 * x4…,当n趋于无穷的时候,limxn=正无穷,即梯度爆炸。(这里的n其实就是卷积的层数)所以理论上来说,伴随着网络的加深,我们可以提取到更好的特征,但是网络的参数是非常难以调节的,因为这时候我们求解出来的梯度是没办法来调节参数的。而resnet通过跳连的结构,就可以缓解这个问题。
    我们可以很清楚的从跳连结构示意图中看到,加入了跳连结构之后,并没有增加模型的参数量,尽管它改变了网络结构。
    从ResNet的网络结构中我们可以发现,它在一开始时设置卷积核大小为7
    7,这是因为一开始的时候我们的输入图像的channel只有3,与7* 7的卷积核进行计算的话并不会增加多少计算量。而在ResNet网络的最后,伟大的作者们又一次别出心裁,用average pool层代替了全连接层。这一手操作也是大大的降低了参数量和计算量。因为我们知道,全连接层的参数多,且计算最为复杂,在VGG中,全连接层的参数量占到了总参数量的80%。而pooling层并没有参数。
    接下来我们来讨论一下,为什么ResNet网络可以缓解梯度消失的问题呢? 跳连结构实际上也被称为恒等映射:H(x)=F(x)+x。当F(x)=0时,H(x)=x,这就是所谓的恒等映射。这个跳连的这根线,可以实现差分放大的效果,将梯度放大,来缓解梯度的消失(具体的我也不太明白,等以后有时间再更一篇专门写的吧)。举个例子,假设F(x)=2x,当x从5变化成为5.1时,F(x)从10变为10.2.如果这时候求F(x)的导数的话,公式为(10.2-10)/(5.1-5)=2.而如果变成H(x)的话,导数为(10.2+5.1-(10.0+5))/(5.1-5)=3.这样就放大了导数,即梯度。
    在ResNet中有两种跳连结构:
    在这里插入图片描述
    左边的是当层数较小时,不用1* 1的卷积核来降低参数量和计算量,后面的是在50,101,152层的网络中,用1* 1 的卷积核来降低参数量和计算量。
    在ResNet中,除了跳连结构之外,它还采用了BatchNormalization批归一化来对数据scale和分布进行约束,同时BN层也可以进行简单的正则化,提高网络抗过拟合能力(每个卷积之后配合一个BN层)。
    ResNet的设计特点:

    • 核心单元简单堆叠。
    • 跳连结构解决网络梯度消失问题。
    • Average Pooling层代替fc层。
    • BN层加快网络训练速度和收敛时的稳定性。
    • 加大网络深度,提高模型的特征抽取能力。

    **

    3.卷积神经网络结构对比

    **

    在这里插入图片描述

    展开全文
  • matlab人脸识别论文

    万次阅读 多人点赞 2019-10-11 17:41:51
    本文设计了种基于BP神经网络的人脸识别系统,并对其进行了性能分析。该系统首先利用离散小波变换获取包含人脸图像大部分原始信息的低频分量,对图像数据进行降维;再由PCA算法对人脸图像进行主成分特征提取,进--步...

    摘 要

     本文设计了一种基于BP神经网络的人脸识别系统,并对其进行了性能分析。该系统首先利用离散小波变换获取包含人脸图像大部分原始信息的低频分量,对图像数据进行降维;再由PCA算法对人脸图像进行主成分特征提取,进--步降低图像数据的处理量;最后使用经过训练后的BP神经网络对待测人脸进行分类识别。详细介绍了离散小波变换PCA特征提取以及BP神经网络分类设计。通过系统仿真实验与分析发现:人脸特征的提取是该系统的关键;同时,由于人脸灰度信息的统计特征与有监督训练BP神经网络分类器,使该系统只在固定类别,并且光照均匀的人脸识别应用场景中具有较高的识别准确率。因此,很难在复杂环境中应用。
    

    关键词:人脸识别;人工神经网络;离散小波变换; PCA; BP神经网络
    Abstract
    In this paper, a face recognition system based on BP neural network is designed and its performance is analyzed. The system first uses discrete wavelet transform to obtain the low-frequency components which contain most of the original information of the face image, and then uses PCA algorithm to extract the principal component features of the face image, progressively reducing the processing capacity of the image data. Finally, the trained BP neural network is used to classify and recognize the tested face. Discrete wavelet transform PCA feature extraction and BP neural network classification design are introduced in detail. Through the system simulation experiment and analysis, it is found that the extraction of facial features is the key of the system. At the same time, because of the statistical features of gray information and the supervised training of BP neural network classifier, the system only has a high recognition accuracy in fixed categories and uniform illumination of face recognition application scenarios. Therefore, it is difficult to apply in complex environment.

    Key words: face recognition; artificial neural network; discrete wavelet transform; PCA; BP neural network
    1绪论

      人脸识别是模式识别研究的一个热点,它在身份鉴别、信用卡识别,护照的核对及监控系统等方面有着I泛的应用。人脸图像由于受光照、表情以及姿态等因索的影响,使得同一个人的脸像矩阵差异也比较大。因此,进行人脸识别时,所选取的特征必须对上述因素具备-一定的稳定性和不变性。主元分析(PCA)方法是一种有效的特征提取方法,将人脸图像表示成一一个列向量,经过PCA变换后,不仅可以有效地降低其维数,同时又能保留所需要的识别信息,这些信息对光照、表情以及姿态具有一定的不敏感性。 在获得有效的特征向量后,关键问题是设计具有良好分类能力和鲁棒性的分类器、支持向量机(SVI )模式识别方法,兼顾调练误差和泛化能力,在解决小样本、非线性及高维模式识别问题中表现出许多特有的优势。
    

    1.1人脸识别技术的细节

    一般来说,人脸识别系统包括图像提取、人脸定位、图形预处理、以及人脸识别(身份确认或者身份查找)。系统输入一般是一张或者一系列含有未确定身份的人脸图像,以及人脸数据库中的若干已知身份的人脸图像或者相应的编码,而其输出则是一系列相似度得分,表明待识别的人脸的身份。
    1.2人脸识别技术的广泛应用

    一项技术的问世和发展与人类的迫切需求是密切相关的,快速发展的社会经济和科学技术使得人类对安全(包括人身安全、隐私保护等)得认识越来越重视。人脸识别得一个重要应用就是人类的身份识别。一-般来说, 人类得身份识别方式分为三类:
    1.特征物品,包括各种证件和凭证,如身份证、驾驶证、房门钥匙、印章等;
    2.特殊知识,包括各种密码、口令和暗号等;

    3.人类生物特征,包括各种人类得生理和行为特征,如人脸、指纹、手形、掌纹、虹膜. DNA、签名、语音等。前两类识别方式属于传统的身份识别技术,其特点是方便、快捷,但致命的缺点是安全性差、易伪造、易窃取。特殊物品可能会丢失、偷盗和复制,特殊知识可以被遗忘、混淆和泄漏。相比较而言,由于生物特征使人的内在属性,具有很强的自身稳定性和个体差异性,因此生物特征是身份识别的最理想依据。基于以上相对独特的生物特征,结合计算机技术,发展了众多的基于人类生物特征的身份识别技术,如DNA识别技术、指纹识别技术、虹膜识别技术、语音识别技术和人脸识别技术等。生物识别技术在上个世纪已经有了- -定得发展,其中指纹识别技术已经趋近成熟,但人脸识别技术的研究还处于起步阶段。指纹、虹膜、掌纹等识别技术都需要被识别者的配合,有的识别技术还需要添置复杂昂贵的设备。人脸识别可以利用已有的照片或是摄像头远距离捕捉图像,无需特殊的采集设备,系统的成本低。并且自动人脸识别可以在当事人毫无觉察的情况下完成身份确认识别工作,这对反恐怖活动有非常重要的意义。基于人脸识别技术具有如此多的优势,因此它的应用前最非常广阔,已成为最具潜力的生物特征识别技术之一
    1.3人脸识别技术的难点

      虽然人类可以毫不困难地根据人脸来辨别一个人,但是利用计算机进行完全自动的人脸识别仍然有许多困难。人脸模式差异性使得人脸识别成为-个非常困难的问题,表现在以下方面:
    
      1.人脸表情复杂,人脸具有多样的变化能力,人的脸上分布着Ii十多块面部肌肉,这些肌肉的运动导致不同面部表情的出现,会造成人脸特征的显著改变。
    
      2.随着年龄而改变,随着年龄的增长,皱纹的出现和面部肌肉的松驰使得人脸的结构和纹理都将发生改变。
    
      3.人脸有易变化的附加物,例如改变发型,留胡须,戴帽子或眼镜等饰物。4.人脸特征遮掩,人脸全部、部分遮掩将会造成错误识别。
    
      5.人脸图像的畸变,由于光照、视角、摄取角度不同,可能造成图像的灰度。
    

    1.4国内外研究状况

    人脸识别是人类视觉最杰出的能力之-。 它的研究涉及模式识别、图像处理、生物学、心理学、认知科学,与基于其它生物特征的身份鉴别方法以及计算机人机感知交互领域都有密切联系。人脸识别早在六七十年代就引起了研究者的强烈兴趣。20世纪60年代,Bledsoe 提出了人脸识别的半自动系统模式与特征提取方法。70年代,美、英等发达国家开始重视人脸识别的研究工作并取得进展。1972 年,Harmon 用交互人脸识别方法在理论上与实践上进行了详细的论述。同年,Sakai 设计了人脸图像自动识别系统。80年代初
    T. Minami 研究出了优于Sakai的人脸图像自动识别系统。但早期的人脸识别一般都需要人的某些先验知识,无法摆脱人的干预。进入九十年代,由于各方面对人脸识别系统的迫切需求,人臉识别的研究变的非常热门。人脸识别的方法有了重大突破,进入了真正的机器自动识别阶段,如Kartbunen-Loeve变换等或新的神经网络技术。人脸识别研究

    得到了前所未有的重视,国际上发表有关人脸识别等方面的论文数量大幅度增加,仅从1990年到2000年之间,sCl 及EI可检索到的相关文献多达数千篇,这期间关于人脸识别的综述也屡屡可见。国外有许多学校在研究人脸识别技术,研究涉及的领域很广。这些研究受到军方、警方及大公司的高度重视和资助,国内的一些知名院校也开始从事人脸识别的研究。

      人脸识别是当前模式识别领域的一个前沿课题,但目前人脸识别尚处于研究课题阶段,尚不是实用化领域的活跃课题。虽然人类可以毫不困难地由人脸辨别一个人,但利用计算机进行完全自动的人脸识别存在许多困难,其表现在:人脸是非刚体,存在表情变化:人脸随年龄增长面变化:发型、眼镜等装饰对人脸造成遮挡:人脸所成图像受光照、成像角度、成像距离等影响。人脸识别的困难还在于图像包括大量的数据,输入的像素可能成百上千,每个像素都含有各自不同的灰度级,由此带来的计算的复杂度将会增加。现有的识别方法中,通过从人脸图像中提取出特征信息,来对数据库进行检索的方法速度快,而利用拓扑属性图匹配来确定匹配度的方法则相对较快。
    

    1.5人脸识别的研究内容

    人脸识别技术(AFR)就是利用计算机技术,根据数据库的人脸图像,分析提取出有效的识别信息,用来“辨认”身份的技术。人脸识别技术的研究始于六十年代末七十年代初,其研究领城涉及图像处理、计算机视觉、模式识别、计算机智能等领城,是伴随着现代化计算机技术、数据库技术发展起来的综合交叉学科。
    1.5.1人脸识别研究内容

      人脸识别的研究范围广义上来讲大致包括以下hi个方面的内容。
    
      1.人脸定位和检测(Face Detection) :即从动态的场景与复杂的背景中检测出人臉的存在并且确定其位置,最后分离出来。这一任务主要受到光照、噪声、面部倾斜以及各种各样遮挡的影响。
    
      2.人脸表征(Face Representation) (也称人脸特征提取) :即采用某种表示方法来表示检测出人脸与数据库中的已知人脸。通常的表示方法包括几何特征(如欧氏距离、曲率、角度)、代数特征(如矩阵特征向量)、固定特征模板等。
    
      3.人脸识别(Face Recogni tion) :即将待识别的人脸与数据库中已知人脸比较,得出相关信息。这一过程的核心是选择适当的人脸表征方法与匹配策略。
    
      4.表情姿态分析(Expression/Gesture Analysis) :即对待识别人脸的表情或姿态信息进行分析,并对其加以归类。
    
    
      5.生理分类(Physical Classi fication) :即对待识别人脸的生理特征进行分析,得出其年龄、性别等相关信息,或者从几幅相关的图像推导出希望得到的人脸图像,如从父母图像推导出孩子脸部图像和基于年龄增长的人脸图像估算等。
    
      人臉识别的研究内容,从生物特征技术的应用前景来分类,包括以下两个方面:人脸验证与人脸识别。
    
      1.人脸验证((Face Veri ficat ion/Authenticat ion):即是回答“是不是某人?"的问题.它是给定一幅待识别人脸图像,判断它是否是某人的问题,属于一对一的两类模式分类问题,主要用于安全系统的身份验证。
    
      2.人脸识别(Face 。Recognition) :即是回答“是谁”的问题。它是给定-幅待识别人脸图像,再已有的人脸数据库中,判断它的身份的问题。它是个“-对多”的多类模式分类问题,通常所说的人脸识别即指此类问题,这也是本文的主要研究内容。
    

    1.5.2人脸识别系统的组成

      在人脸识别技术发展的几十年中,研究者们提出了多种多样的人脸识别方法,但大部分的人脸识别系统主要由三部分组成:图像预处理、特征提取和人脸的分类识别。一个完整的自动人脸识别系统还包括人脸检测定位和数据库的组织等模块,如图1.1.其中人脸检测和人脸识别是整个自动人脸识别系统中非常重要的两个环节,并且相对独立。下面分别介绍这两个环节。
    

    人脸检测与定位,检测图像中是否由人脸,若有,将其从背景中分割出来,并确定其在图
    像中的位置。在某些可以控制拍摄条件的场合,如警察拍罪犯照片时将人脸限定在标尺内,此时人脸的定位很简单。证件照背景简单,定位比较容易。在另一些情况下,人脸在图像
    中的位置预先是未知的,比如在复杂背景下拍摄的照片,这时人脸的检测与定位将受以下因素的影响: :

      1.人脸在图像中的位置、角度、不固定尺寸以及光照的影响:
    
      2.发型、眼睛、胡须以及人脸的表情变化等,3.图像中的噪声等。
    
      特征提取与人脸识别,特征提取之前一般都要敌几何归一化和灰度归一化的工作。前者指根据人脸定位结果将图像中的人脸变化到同一位置和大小:后者是指对图像进行光照补偿等处理,以克服光照变化的影响,光照补偿能够一定程度的克服光照变化的影响而提高识别率。提取出待识别的人脸特征之后,即进行特征匹配。这个过程是一对多或者一对一的匹配过程,前者是确定输入图像为图象库中的哪一个人(即人脸识别),后者是验证输入图像的人的身份是否属实(人脸验证).  
    

    以上两个环节的独立性很强。在许多特定场合下人脸的检测与定位相对比较容易,因此“特征提取与人脸识别环节”得到了更广泛和深入的研究。近几年随着人们越来越关心各种复杂的情形下的人臉自动识别系统以及多功能感知研究的兴起,人脸检测与定位才作为一个独立的模式识别问题得到了较多的重视。本文主要研究人脸的特征提取与分类识别的问题。

    2基于bp神经网络的人脸识别算法

      虽然人脸识别方法的分类标准可能有所不同,但是8前的研究主要有两个方向,一类是从人脸图像整体(Holistic Approaches)出发,基于图像的总体信息进行分类识别,他重点考虑了模式的整体属性,其中较为著名的方法有:人工神经网络的方法、统计模式的方法等。另一类是基于提取人脸图像的几何特征参数(Feature-Based Approaches), 例如眼、嘴和鼻子的特征,再按照某种距离准则进行分类识别。这种方法非常有效,因为人脸不是刚体,有着复杂的表情,对其严格进行特征匹配会出现困难。面分别介绍- -些常 用的方法,前两种方法属于从图像的整体方面进行研究,后三种方法主要从提取图像的局部特征讲行研究。
    
    
      2.1基于特征脸的方法
    

    特征脸方法(cigenface)是从生元分析方法PCA c Principal ComponentAnalysis 导出的一种人脸分析识别方法,它根据一-组人脸图像构造主元子空间,由于主元具有人脸的形状也称作特征脸。识别时将测试图像投影到主元子空间上得到了-组投影系数,然后和各个已知人的人脸图像进行比较识别,取得了很好的识别效果。在此基础上出现了很多特征脸的改进算法。

      特征脸方法原理简单、易于实现,它把人脸作为一个整体来处理,大大降低了识别复杂度。但是特征脸方法忽视了人脸的个性差异,存在着一定的理论缺陷。研究表明:特征脸方法随光线角度及人脸尺寸的影响,识别率会有所下降。
    

    2.2基于bp神经网络的方法

    一、实验要求采用三层前馈BP神经网络实现标准人脸YALE数据库的识别,编程语言为C系列语言。
    二、BP神经网络的结构和学习算法实验中建议采用如下最简单的三层BP神经网络,输入层为,有n个神经元节点,输出层具有m个神经元,网络输出为,隐含层具有k个神经元,采用BP学习算法训练神经网络。BP神经网络的结构BP网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对BP网络加以训练,网络就具有输入输出对之间的映射能力。BP网络执行的是有教师训练,其样本集是由形如(输入向量,期望输出向量)的向量对构成的。在开始训练前,所有的权值和阈值都应该用一些不同的小随机数进行初始化。BP算法主要包括两个阶段:

    2.2.1向前传播阶段

    ①从样本集中取一个样本(Xp,Yp),将Xp输入网络,其中Xp为输入向量,Yp为期望输出向量。
    ②计算相应的实际输出Op。在此阶段,信息从输入层经过逐级的变换,传送到输出层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是下列运算:

    (2) 向后传播阶段
    ①计算实际输出Op与相应的理想输出Yp的差;
    ②按极小化误差的方法调整权矩阵。这两个阶段的工作一般应受到精度要求的控制

    (1)作为网络关于第p个样本的误差测度(误差函数)。

    (2)如前所述,之所以将此阶段称为向后传播阶段,是对应于输入信号的正常传播而言的,也称之为误差传播阶段。为了更清楚地说明本文所使用的BP网络的训练过程,首先假设输入层、中间层和输出层的单元数分别是N、L和M。X=(x0,x1,…,xN-1)是加到网络的输入矢量,H=(h0,h1,…,hL-1)是中间层输出矢量,Y=(y0,y1,…,yM-1)是网络的实际输出矢量,并且用D=(d0,d1,…,dM-1)来表示训练组中各模式的目标输出矢量。输出单元i到隐单元j的权值是Vij,而隐单元j到输出单元k的权值是Wjk。另外用θk和Φj来分别表示输出单元和隐单元的阈值。于是,中间层各单元的输出为:

    (3)而输出层各单元的输出是:

    其中f(*)是激励函数,采用S型函数:

    2.2.2在上述条件下,网络的训练过程如下:

    (1) 选定训练集。由相应的训练策略选择样本图像作为训练集。
    (2) 初始化各权值Vij,Wjk和阈值Φj,θk,将其设置为接近于0的随机值,并初始化精度控制参数ε和学习率α。
    (3) 从训练集中取一个输入向量X加到网络,并给定它的目标输出向量D。
    (4) 利用式(3)计算出一个中间层输出H,再用式(4)计算出网络的实际输出Y。
    (5) 将输出矢量中的元素yk与目标矢量中的元素dk进行比较,计算出M个输出

    误差项:

    对中间层的隐单元也计算出L个误差项:

    (6) 依次计算出各权值和阈值的调整量:

    (8) 当k每经历1至M后,判断指标是否满足精度要求:E≤ε,其中E是总误差函数。

    如果不满足,就返回(3),继续迭代。如果满足,就进入下一步。
    (9) 训练结束,将权值和阈值保存在文件中。这时可以认为各个权值已经达到稳定,分类器形成。再一次进行训练时,直接从文件导出权值和阈值进行训练,不需要进行初始化。

    YALE数据库是由耶鲁大学计算视觉与扼制中心创立,包括15位志愿者,每个人有11张不同姿势、光照和表情的图片,共计165张图片,图片均为80*100像素的BMP格式图像。我们将整个数据库分为两个部分,每个人的前5幅图片作为网络的训练使用,后6副图片作为测试使用。测试样例:

    输入输出:

      神经网络在人脸识别应用中有很长的历史。早期用于人脸识别的神经网络主要是Kohonen自联想映射神经网络,用于人脸的“回忆”。所谓“回忆”是指当输入图像上的人脸受噪声污染严重或部分缺损时,能用Kohonen网络恢复出原来完整的人脸。Intrator 等人用一个无监督/监督混合神经网络进行人脸识别。其输入是原始图像的梯度图像,以此可以去除光照的变化。监督学习目的是寻找类的特征,有监督学习的目的是减少训练样本被错分的比例。这种网络提取的特征明显,识别率高,如果用几个网络同时运算,求其平均,识别效果还会提高。
    
      与其他类型的方法相比,神经网络方法在人脸识别上有其独到的优势,它避免了复:杂的特征提取工作,可以通过学习的过程获得其他方法难以实现的关于人脸识别的规律和规则的隐性表达。此外,神经网络以时示方式处理信息,如果能用硬件实现,就能显著提高速度。神经网络方法除了用于人脸识别外,还适用于性别识别、种族识别等。
    

    2.3弹性图匹配法

    弹性图匹配方法是-种基于动态链接结构DLA C Dynamic Link Architecture的方法。它将人脸用格状的稀疏图表示,图中的节点用图像位置的Gabor小波分解得到的特征向量标记,图的边用连接节点的距离向量标记。匹配时,首先J找与输入图像最相似的模型图,再对图中的每个节点位置进行最佳匹配,这样产生-一个变形图,其节点逼近模型图的对应点的位置。弹性图匹配方法对光照、位移、旋转及尺度变化都敏感。此方法的主要缺点是对每个存储的人臉需计算其模型图,计算量大,存储量大。为此,Wiskott 在原有方法的基础上提出聚東图匹配,部分克服了这些缺点。在聚束图中,所有节点都已经定位在相应目标上。对于大量数据库,这样可以大大减少识别时间。另外,利用聚束图还能够匹配小同人的最相似特征,因此可以获得关于未知人的性别、胡须和眼镜等相关信息。
    2.4基于模板匹配的方法
    模板匹配法是一-种经典的模式识别方法,这种方法大多是用归一一化和互相关,直接计算两副图像之间的匹配程度。由于这种方法要求两副图像上的目标要有相同的尺度、取向和光照条件,所以预处理要做尺度归一化和灰度归一化的工作。最简单的人脸模板是将人脸看成-一个椭圆,检测人臉也就是检测图像中的椭圆。另一种方法是将人脸用一-组独立的小模板表示,如眼睛模板、嘴巴模板、鼻子模板、眉毛模板和下巴模板等。但这些模板的获得必须利用各个特征的轮廓,而传统的基于边缘提取的方法很难获得较高的连续边缘。即使获得了可靠度高的边缘,也很难从中自动提取所需的特征量。模板匹配方法在尺度、光照、旋转角度等各种条件稳定的状态下,它的识别的效果优于其它方法,但它对光照、旋转和表情变化比较敏感,影响了它的直接使用。2.5基于人脸特征的方法人脸由眼睛、鼻子、嘴巴、下巴等部件构成,正因为这些部件的形状、大小和结构上的各种差异才使得世界上每个人脸千差万别,因此对这些部件的形状和结构关系的几何描述,可以作为人脸识别的重要特征。几何特征最早是用于人脸检测轮廓的描述与识别,首先根据检测轮廓曲线确定若干显著点,并由这些显著点导出- -组用于识别的特征度量如距离、角度等。采用儿何特征进行正面人脸识别一般是通过提取人眼、口、鼻等重要特征点的位置和眼睛等重要器官的几何形状作为分类特征。
    定位眼睛往往是提取人脸几何特征的第-步。由于眼睛的对称性以及眼珠呈现为低灰度值的圆形,因此在人脸图像清晰瑞正的时候,眼睛的提取是比较容易的。但是如果人脸图像模糊,或者噪声很多,则往往需要利用更多的信息(如眼睛和眉毛、鼻子的相对位置等),而且.这将使得眼睛的定位变得很复杂。而且实际图像中,部件未必轮廓分明,有时人用眼看也只是个大概,计算机提取就更成问题,因而导致描述同-一个人的不同人脸时,其模型参数可能相差很大,面失去识别意义。尽管如此,在正确提取部件以及表情变化微小的前提下,该方法依然奏效,因此在许多方面仍可应用,如对标准身份证照片的应用。

    2.5九个人脸库介绍

    1. FERET人脸数据库
      http://www.nist.gov/itl/iad/ig/colorferet.cfm
      由FERET项目创建,此图像集包含大量的人脸图像,并且每幅图中均只有一个人脸。该集中,同一个人的照片有不同表情、光照、姿态和年龄的变化。包含1万多张多姿态和光照的人脸图像,是人脸识别领域应用最广泛的人脸数据库之一。其中的多数人是西方人,每个人所包含的人脸图像的变化比较单一。

    2. CMU Multi-PIE人脸数据库
      http://www.flintbox.com/public/project/4742/
      由美国卡耐基梅隆大学建立。所谓“PIE”就是姿态(Pose),光照(Illumination)和表情(Expression)的缩写。CMU Multi-PIE人脸数据库是在CMU-PIE人脸数据库的基础上发展起来的。包含337位志愿者的75000多张多姿态,光照和表情的面部图像。其中的姿态和光照变化图像也是在严格控制的条件下采集的,目前已经逐渐成为人脸识别领域的一个重要的测试集合。

    3. YALE人脸数据库(美国,耶鲁大学)
      http://cvc.cs.yale.edu/cvc/projects/yalefaces/yalefaces.html
      由耶鲁大学计算视觉与控制中心创建,包含15位志愿者的165张图片,包含光照、表情和姿态的变化。
      Yale人脸数据库中一个采集志愿者的10张样本,相比较ORL人脸数据库Yale库中每个对象采集的样本包含更明显的光照、表情和姿态以及遮挡变化。

    4. YALE人脸数据库B
      https://computervisiononline.com/dataset/1105138686
      包含了10个人的5850幅在9种姿态,64种光照条件下的图像。其中的姿态和光照变化的图像都是在严格控制的条件下采集的,主要用于光照和姿态问题的建模与分析。由于采集人数较少,该数据库的进一步应用受到了比较大的限制。

    5. MIT人脸数据库
      由麻省理工大学媒体实验室创建,包含16位志愿者的2592张不同姿态(每人27张照片),光照和大小的面部图像。

    6. ORL人脸数据库
      https://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html
      由英国剑桥大学AT&T实验室创建,包含40人共400张面部图像,部分志愿者的图像包括了姿态,表情和面部饰物的变化。该人脸库在人脸识别研究的早期经常被人们采用,但由于变化模式较少,多数系统的识别率均可以达到90%以上,因此进一步利用的价值已经不大。
      ORL人脸数据库中一个采集对象的全部样本库中每个采集对象包含10幅经过归一化处理的灰度图像,图像尺寸均为92×112,图像背景为黑色。其中采集对象的面部表情和细节均有变化,例如笑与不笑、眼睛睁着或闭着以及戴或不戴眼镜等,不同人脸样本的姿态也有变化,其深度旋转和平面旋转可达20度。

    7. BioID人脸数据库
      https://www.bioid.com/facedb/
      包含在各种光照和复杂背景下的1521张灰度面部图像,眼睛位置已经被手工标注。

    8. UMIST图像集
      由英国曼彻斯特大学建立。包括20个人共564幅图像,每个人具有不同角度、不同姿态的多幅图像。

    9. 年龄识别数据集IMDB-WIKI
      https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/
      包含524230张从IMDB和Wikipedia爬取的名人数据图片。应用了一个新颖的化回归为分类的年龄算法。本质就是在0-100之间的101类分类后,对于得到的分数和0-100相乘,并将最终结果求和,得到最终识别的年龄

    3matlab分析人脸方法介绍
    人脸识别之一:查找图片中的人脸并用方框圈出
    这种类似于智能手机拍照时,屏幕里那个框任务头部的红框。大致步骤为:获取RGB图片—>转换为灰度图像—>图像处理—>人脸识别。代码如下:clear all
    clc

    %获取原始图片
    i=imread(‘face.jpg’);
    I=rgb2gray(i);
    BW=im2bw(I); %利用阈值值变换法将灰度图像转换成二进制图像
    figure(1);
    imshow(BW);
    %最小化背景
    [n1 n2]=size(BW);
    r=floor(n1/10);
    c=floor(n2/10);
    x1=1;x2=r;
    s=r*c;

    for i=1:10
    y1=1;y2=c;
    for j=1:10
    if(y2<=c || y2>=9c) || (x11 || x2r10)
    loc=find(BW(x1:x2,y1:y2)==0);
    [o p]=size(loc);
    pr=o*100/s;
    if pr<=100
    BW(x1:x2,y1:y2)=0;
    r1=x1;r2=x2;s1=y1;s2=y2;
    pr1=0;
    end
    imshow(BW);
    end
    y1=y1+c;
    y2=y2+c;
    end
    x1=x1+r;
    x2=x2+c;
    end
    figure(2)
    subplot(1,2,1);
    imshow(BW)
    title(‘图像处理’);
    %人脸识别
    L=bwlabel(BW,8);
    BB=regionprops(L,‘BoundingBox’);
    BB1=struct2cell(BB);
    BB2=cell2mat(BB1);

    [s1 s2]=size(BB2);
    mx=0;
    for k=3:4:s2-1
    p=BB2(1,k)*BB2(1,k+1);
    if p>mx && (BB2(1,k)/BB2(1,k+1))<1.8
    mx=p;
    j=k;
    end
    end
    subplot(1,2,2);
    title(‘人脸识别’);
    imshow(I);
    hold on;
    rectangle(‘Position’,[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j)],‘EdgeColor’,‘r’)实验效果图:

             从实验效果图中,可以看出红框框出了人脸部分。
    

    人脸识别之二:由输入的人像识别出数据库中人像
    这种情况类似于手机人脸解锁,通过当前的人脸去和保存的人脸做比对来实现解锁等功能;从网上看了好多资料,由于个人能力有限大多都没仿真出来,最后通过学习PCA算法,了解到可通过PCA算法对输入矩阵降维,提取特征值和特征向量的方式来做人脸比对。具体的PCA的东西在这里不作介绍,主要介绍一下如何实现人脸比对。
    大致步骤:制作人脸数据样本—>PCA提取样本数据特征值—>人脸比对1.人脸样本
    从网上搜集了10张人脸图片,来制作成样本。

                         %读取转换10张图片,生成数据矩阵function ImgData = imgdata()  
    

    %导入图片
    picture1 = rgb2gray(imread(‘1.jpg’));
    picture2 = rgb2gray(imread(‘2.jpg’));
    picture3 = rgb2gray(imread(‘3.jpg’));
    picture4 = rgb2gray(imread(‘4.jpg’));
    picture5 = rgb2gray(imread(‘5.jpg’));
    picture6 = rgb2gray(imread(‘6.jpg’));
    picture7 = rgb2gray(imread(‘7.jpg’));
    picture8 = rgb2gray(imread(‘8.jpg’));
    picture9 = rgb2gray(imread(‘9.jpg’));
    picture10 = rgb2gray(imread(‘10.jpg’));
    [m,n] = size(picture1);
    picture_ten = {picture1,picture2,picture3,picture4,picture5,picture6,picture7,picture8,picture9,picture10};
    for i=1:10
    %把mn的矩阵变换成1(mn)的矩阵
    ImgData(i,:) = reshape(picture_ten{i},1,m
    n);
    end
    %数据范围缩小到0到1之间
    ImgData = double(ImgData)/255;

    PCA分析function Cell_ten = PCA(imgdata,k)
    [m,n] = size(imgdata);
    img_mean = mean(imgdata); %计算每列平均值
    img_mean_ten = repmat(img_mean,m,1); %复制m行平均值至矩阵img_mean_ten
    Z = imgdata - img_mean_ten;
    T = Z’Z;%协方差矩阵
    [V,D] = eigs(T,k); %计算T中最大的前k个特征值与特征向量
    img_new = imgdata
    V*D; %低维度下的各个人脸的数据
    Cell_ten = {img_new,V,D};3.通过输入测试人脸从数据库中找到相对应人脸function face= facefind(Cell_ten,testdata)%此函数代码借鉴于他人,还未征求其同意,这里就暂时略过这里testdata是测试图片的数据4.主程序调用img=imgdata(); %图片矩阵数据
    Cell_ten=PCA(img,2);% PCA
    face1=facefind(Cell_ten,imread(‘test.jpg’));%识别
    subplot(1,2,1)
    imshow(‘test.jpg’)
    title(‘测试图像’)
    subplot(1,2,2)
    imshow(strcat(num2str(face1),’.jpg’))
    title(‘数据库图像’)测试效果: 使用这个方式可以实现简单的人脸识别,但精确度不高;

    4 分析算法
    在人脸识别系统中有许多关键环节,其中最重要的莫过于特征提取。利用主成分分析法(PCA)进行特征提取是目前应用最多的提取方法。作为一种科学的统计方法,它在模式识别、信号处理、数字图像处理等等领域都有广泛涉猎。基于PCA中空间原始数据主要特征提取,减少数据冗余的思想,一些在低维特征空间的数据被处理,并合理保留了原始数据中有用的信息,数据空间中维数过高的问题也得以解决。
    4.1  主成分分析的基本原理

    实际上主成分分析就是一种数学降维演算方法,用若干个综合变量来代替原本更多的变量,让这些综合变量尽可能的实现对原有变量信息的取代,并保持彼此之间不存在关联。这种多变量化为少数相互无关的变量且信息量不变的统计分析方法就叫做主成分分析法。
      假设F1表示原变量的首个线性组合所组成的主要成分指标,就有F1=a11X1+a21X2+…ap1Xp。根据这个数学式可知,如果在每一个主成分中提取一个信息量,即可用方差(F1)进行度量,随着方差F1的增大,F1所包含的信息也就越多,同时它的线性组合选取也可表示为X1、X2…XP,它们都被称为方差F1中的第一主成分。如果第一主成分不足以代表原有的P个变量信息时,就可以考虑选取F2,即第二个线性组合,借由它来反映原本的有效信息。在F2中可以不显示第一主成分中已有的信息,以数学语言来表达要求的话即Cov(F1,F2)=0,其中F2为第二主成分。所以按照实际原变量的变化需求,就可以构造出多个主成分指标。
      4.2人脸识别的技术特点

    人脸识别是模式识别中的重要分支,它是指通过计算机系统来分析人脸图像,从中获取有价值的识别信息,从而辨识身份。所以说从技术特点上来看,人脸识别具有以下几个关键特色。
     1、PCA算法
    算法大致步骤:
    设有m条n维数据。
    1)将原始数据按列组成n行m列矩阵X;
    2)将X的每一行(这里是图片也就是一张图片变换到一行)进行零均值化,即减去这一行的均值(样本中心化和标准化);将所有的样本融合到一个矩阵里面特征向量就是变换空间的基向量U=[u1,u2,u3,u4,…],脑袋里面要想到一个样本投影变换就是该空间的一个点,然后对于许多点可以用KNN等不同的方法进行分类。
    3)求出协方差矩阵C=1mXXTC=1mXXT C=\frac {1 }{m } XX^TC=m1XXT;
    4)求出协方差矩阵的特征值及对应的特征向量;
    5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P;
    6)Y=PXY=PX Y=PXY=PX即为降维到kk kk维后的数据。
      对数据进行中心化预处理,这样做的目的是要增加基向量的正交性,便于高维度向低纬度的投影,即便于更好的描述数据。
      对数据标准化的目的是消除特征之间的差异性,当原始数据不同维度上的特征的尺度不一致时,需要标准化步骤对数据进行预处理,使得在训练神经网络的过程中,能够加速权重参数的收敛。
      过中心化和标准化,最后得到均值为0,标准差为1的服从标准正态分布的数据。
      求协方差矩阵的目的是为了计算各维度之间的相关性,而协方差矩阵的特征值大小就反映了变换后在特征向量方向上变换的幅度,幅度越大,说明这个方向上的元素差异也越大(越有投影的必要,矩阵相乘的过程就是投影),故而选取合适的前k个能以及小的损失来大量的减少元数据的维度。

    2、PCA原理推导
    基于K-L展开的PCA特征提取:

    5.算法优化方法
    我用了三种方法对其进行优化
    1.采用动量梯度下降算法训练 BP 网络。
    训练样本定义如下:
    输入矢量为
    p =[-1 -2 3 1
    -1 1 5 -3]
    目标矢量为 t = [-1 -1 1 1]
    2. 采用贝叶斯正则化算法提高 BP 网络的推广能力。在本例中,我们采用两种训练方法,即 L-M 优化算法(trainlm)和贝叶斯正则化算法(trainbr),用以训练 BP 网络,使其能够拟合某一附加有白噪声的正弦样本数据。其中,样本数据可以采用如下MATLAB 语句生成:
    输入矢量:P = [-1:0.05:1];
    目标矢量:randn(’seed’,78341223);
    T = sin(2piP)+0.1randn(size§);
    3. 采用“提前停止”方法提高 BP 网络的推广能力。对于和例 2相同的问题,在本例中我们将采用训练函数 traingdx 和“提前停止”相结合的方法来训练 BP 网络,以提高 BP 网络的推广能力。在利用“提前停止”方法时,首先应分别定义训练样本、验证样本或测试样本,其中,验证样本是必不可少的。在本例中,我们只定义并使用验证样本,即有
    验证样本输入矢量:val.P = [-0.975:.05:0.975]
    验证样本目标矢量:val.T = sin(2
    pival.P)+0.1randn(size(val.P))
    值得注意的是,尽管“提前停止”方法可以和任何一种 BP 网络训练函数一起使用,但是不适合同训练速度过快的算法联合使用,比如 trainlm 函数,所以本例中我们采用训练速度相对较慢的变学习速率算法 traingdx 函数作为训练函数。
    参考文献

    [1] HongZiquan.AlgbricFeatureExcaciofmftfoReonino[JPatteo Recognition. 1991. 22 (1) :43~44.
    [2] Yuille A L Detcction Templates for Face Recognitio[JCognitive Neuroscience , 1991. 191-200
    [3]卢春雨张长水局城区城特征的快速人脸检测法[D北京:清华大学学报.1999.96 (1) ;4-6.
    [4]陈刚,减飞虎实用人脸识别系统的本征脸法实现[D]2001年5月230():45-46.
    [
    5]杜平,徐大为,刘重庆,基F整体特征的人脸识别方法的研究[12003年6月49 (3) ;382-383.
    [6] Chow G, Li X. Towards A System for Automatic Facial Feature Detctio[U] 1993. 2903)2-3.
    [7]杨变若,王煎法,杨未来人脸全局特iE识别研究[Z]1997年11月3(5):; 871-875.
    [8]边肇棋,张学工阎平凡等模式识别D]北京:清华大学出版社2000 302)16-17.

    致 谢

      从毕业设计的选题到论文的指导到最后定稿,期间遇到了无数的困难和阻碍,也曾想过对自己降低要求,也曾想过放弃最初想要坚持的设计,但是最后在孙老师和同学的鼓励和陪伴下,努力克服了所有的困难,独立完成了毕业设计和论文的书写。尤其是要感射我的论文指导老师孙老师,不厌其烦的对我的设计进行指导修改,耐心的帮助我改进设计帮助我搜集相关的资料,感谢孙老师如母亲--般的关怀,在孙老师身上不仅学习到了对学术严谨的态度,更被孙老师亲切无私的个人魅力所感染。
    
      还要感谢我的同学和其他所有的老师,他们严谨的学术态度,宽容待人严于律己的处世风范都使我受益良多。
    
    展开全文
  • 软件测试面试题汇总

    万次阅读 多人点赞 2018-09-27 12:31:09
    1、什么是兼容性测试?兼容性测试侧重哪些方面? .................................................................................... 5 2、我现在有个程序,发现在Windows上运行得很慢,怎么判别是程序存在...
  • 《数据库原理》— 数据库系统概论第五版习题解析

    万次阅读 多人点赞 2017-05-29 14:57:48
    一类是数据模型,是按计算机系统的观点对数据建模,用于机器世界,人们可以用它定义、操纵数据库中的数据,一般需要有严格的形式化定义和一组严格定义了语法和语义的语言,并有一些规定和限制,便于在机器上实现。...
  • 数据分析入门()

    千次阅读 多人点赞 2020-02-29 11:17:19
    用适当的统计分析方法对收集来的大量数据进行分析,将他们加以汇总和理解并消化,以求最大化地开发数据的功能,发挥数据的作用。 1.2数据分析包括 描述性数据分析(初级数据分析):使用几个关键数据来描述整体...
  • RFID学习笔记

    千次阅读 多人点赞 2017-06-06 13:18:46
     射频识别技术RFID(Radio Frequency Identification),又称为电子标签、无线射频识别,是种非接触式的自动识别技术,通过无线电讯号识别特定目标并读写相关数据而无需识别系统与特定目标之间建立机械或光学...
  • 起来了解垃圾分类

    千次阅读 2017-08-31 22:42:46
    1.什么是垃圾分类 2.为什么需要分类 3.垃圾分类的意义 4.垃圾种类  4.1可回收垃圾  4.2不可回收垃圾  4.2.1餐厨垃圾  4.2.2有害垃圾  4.2.3其他垃圾 5.我国垃圾分类现状 6.国外优秀案例(极致的日本...
  • 垃圾分类小程序(含源码)

    万次阅读 多人点赞 2019-09-12 09:25:17
    可回收物就是再生资源,生活垃圾中未经污染、适宜回收循环利用的废物,主要包括废弃电器电子产品、废纸张、废塑料、废玻璃、废金属等五,是现阶段生活垃圾分类的主要工作和影响垃圾减量的重要因素。 投放要求 ...
  • 条码是由组按一定编码规则排列的条、空符号,用以表示一定的字符、数字及符号组成的信息。...维条码通常是对物品的标识,二维条码是对物品的描述。信息容量大、安全性高、读取率高、错误纠正能力强...
  • 数据分析面试题

    万次阅读 多人点赞 2018-12-14 12:46:24
    self 代表的实例,self 在定义的方法时是必须有的,虽然在调用时不必传入相应的参数。 d.请阐述下列代码运行后会有什么结果 f1 = trigonometric_function ( 3 , 4 , 6 ) #的实例化 #对进行初始化 x...
  • 什么是边缘计算?

    万次阅读 多人点赞 2018-07-07 16:59:44
    什么是边缘计算 为什么需要边缘计算 什么是边缘计算 边缘计算的优点 案例研究 云卸载 视频分析 智能家居 智慧城市 边缘协作 机遇和挑战 编程可行性 命名 数据抽象 服务管理 私密性 最优化方法 小结 ...
  • 从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关...本篇文章将分享《人工智能狂潮》书籍内容,包括人工智能的应用和什么是人工智能,结合作者的理解分享人工智能原理及基础知识,希望对您有所帮助!
  • 什么是数据仓库?

    万次阅读 多人点赞 2019-04-24 19:44:14
    传统的数据库中,存放的数据都是一些定制性数据较多,表是二维的,一张表可以有很多字段,字段字排开,对应的数据就行写入表中,特点就是利用二维表表现多维关系。 但这种表现关系的上限和下限就定死了,...
  • 基于JAVA的购物网站(毕业论文)

    万次阅读 多人点赞 2010-12-20 14:25:00
    电子商务利用简单、快捷、低成本的电子通讯方式,买卖双方通过网络进行各种商贸活动的种商业交易模式。随着互联网的发展,以及人们消费观念和生活方式的改变,这种新型的商业模式逐渐融入了人们的生活中。通过...
  • 以我个人的经验来看,不断地了解用户需求和场景,也是积累产品感的种良好的方式。有了不错的产品感,我们要继续往前走,才能将产品推向个更高的高度。 产品经理之前已经将产品第个版本的
  • 什么是物联网1.1 定义1.2 起源1.3 相关技术1.3.1 软件技术1.3.2 硬件技术1.3.3 连接技术1.4 常见物联网通信技术1.5 《2020中国物联网产业全景图谱》 1.什么是物联网 导 读 ​ 2020年3月4日,中央政治局常务委员...
  • 目录 0 环境 1 引言 2 思路 3 图像分类 4 总结 0 环境 Python版本:3.6.8 系统版本:macOS Mojave Python Jupyter Notebook ...七月了,大家最近一定被项新的政策给折磨的焦头烂额,那就是...感觉每天都在学习遍垃...
  • 这可能是关于 TCP 和 UDP 最好的篇文章!!

    千次阅读 多人点赞 2021-04-26 09:43:57
    IP端口号确定端口号多路复用和多路分解无连接的多路复用和多路分解面向连接的多路复用与多路分解UDPUDP 特点UDP 报文结构TCPTCP 报文段结构序号、...速度窗口控制和重发流量控制连接管理三次握手建立连接四次挥手什么是...
  • 什么是信息茧房 信息茧房其实是现在社会个很可怕的现象,从字面意思来看的话其实比喻的是信息被虫茧一般封锁住。这个问题反映了现在随着个性化推荐的普及衍射的个社会问题。 平时在浏览新闻或者淘宝的时候,...
  • 首先我们需要澄清上篇中的这两个概念,在上篇文章中“货品”是指一种概念物品,这种物品并不是个具体的实物,当它具备具体的属性、价格时,才是种实物,也就是商品。“商品”就是库存中个具体的实物。例...
  • 什么是物联网?看到这个问题,相信很多人都是蒙圈状态,虽然物联网已经10周年了,但是经过10年的发展,大多数的人都无法说不清楚物联网,说不清物联网到底是什么,更不用说看清物联网的商业模式,自然也就无法界定谁...
  • 什么是集体户口,优势、劣势

    千次阅读 2019-12-01 17:31:02
    集体户口,暂时还不具备单独立户条件,或者暂时还没有办理单独立户手续的居民,其户籍关系挂靠在某个集体户头上的居民户口。 1)集体户口的户主是单位,是单位的所在地; 2)居民户口是除了身份证之外最好的...
  • 第2章 RFID相关理论介绍

    千次阅读 2019-04-26 17:32:35
    更多免费论文及视频教程资源请访问:我是码农 ... 免费下载RFID相关毕业论文、RFID相关代码、RFID相关教程请访问...RFID(Radio Frequency Identification)技术即无线射频识别技术,是20世纪90年代开始兴起的种非接...
  • 随着AlphaGo战胜李世石,人工智能和深度学习这些概念已经成为个非常火的话题。人工智能、机器学习与深度学习这几个关键词时常出现在媒体新闻中,并错误地被认为是等同的概念。本文将介绍人工智能、机器学习以及...
  • 什么是RPG游戏

    千次阅读 2017-01-11 10:32:28
    RPG= Role-playing Game∶角色扮演游戏 ...什么是RPG游戏类型呢?英文全称“Role-playing game”,意为“角色扮演游戏”,相对于平台动作游戏和仿真模拟游戏而言。Role是角色的意思,派生于古典话剧术语,play
  • 爆炸~设计模式、面向对象

    千次阅读 2019-06-24 23:25:41
    爆炸不是指类的具体数量的多少,而是在实现个功能时,本来可以不用这么多,但是却设计成这么多,使得维护成本过高,明显高于设计的效用。 爆炸的产生原因我的理解可总结为以下几点 1.我认为产生爆炸...
  • 近些年,很多人在茶余饭后讨论的致富话题中,一定少不了比特币和区块链,仿佛没有深入研究过这话题就是没见过世面的土包子。那么,比特币和区块链到底是什么,又有什么关系呢? 比特币是什么? 比特币是种基于...
  • 什么是云技术 定义 云技术(Cloud technology)基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、应用技术等的总称,可以组成资源池,按需所用,灵活便利。云计算技术将变成重要支撑。技术...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,690
精华内容 11,476
关键字:

一类物品指的是什么