From f245cea36a1acd07c2c843939f9eb100816e2ba0 Mon Sep 17 00:00:00 2001 From: Manuel Guenther <manuel.guenther@idiap.ch> Date: Thu, 26 Apr 2012 18:14:05 +0200 Subject: [PATCH] Created some examples how to use Bob and its bob.db module to execute face verification experiments on the AT&T image database. --- LICENSE.txt | 674 ++++++++++++++++++++++++++++++++++++++ MANIFEST.in | 1 + README.md | 2 - README.rst | 43 +++ bootstrap.py | 262 +++++++++++++++ buildout.cfg | 30 ++ doc/Makefile | 130 ++++++++ doc/conf.py | 216 ++++++++++++ doc/dct_ubm.png | Bin 0 -> 36560 bytes doc/eigenface.png | Bin 0 -> 39303 bytes doc/examples.rst | 147 +++++++++ doc/gabor_phase.png | Bin 0 -> 41292 bytes doc/index.rst | 23 ++ doc/installation.rst | 71 ++++ faceverify/__init__.py | 0 faceverify/dct_ubm.py | 225 +++++++++++++ faceverify/eigenface.py | 148 +++++++++ faceverify/gabor_phase.py | 135 ++++++++ localbob.cfg | 48 +++ setup.py | 78 +++++ 20 files changed, 2231 insertions(+), 2 deletions(-) create mode 100644 LICENSE.txt create mode 100644 MANIFEST.in delete mode 100644 README.md create mode 100644 README.rst create mode 100644 bootstrap.py create mode 100644 buildout.cfg create mode 100644 doc/Makefile create mode 100644 doc/conf.py create mode 100644 doc/dct_ubm.png create mode 100644 doc/eigenface.png create mode 100644 doc/examples.rst create mode 100644 doc/gabor_phase.png create mode 100644 doc/index.rst create mode 100644 doc/installation.rst create mode 100644 faceverify/__init__.py create mode 100644 faceverify/dct_ubm.py create mode 100644 faceverify/eigenface.py create mode 100644 faceverify/gabor_phase.py create mode 100644 localbob.cfg create mode 100644 setup.py diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..466879f --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +recursive-include doc *.rst diff --git a/README.md b/README.md deleted file mode 100644 index a9bfe50..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -bob.example.faceverify -====================== \ No newline at end of file diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..a7402fb --- /dev/null +++ b/README.rst @@ -0,0 +1,43 @@ +Face verification using Bob +=========================== + +This example demonstrates how to use Bob to build different face verification +systems. It includes examples with three different complexities: + +* A simple eigenface based example +* An example using Gabor jets and a Gabor-phase based similarity function +* An example building an UBM/GMM model on top of DCT blocks. + +To use this example, you will require Bob and the AT&T database. If you do not +have a Bob version yet, you can get it from:: + + http://idiap.github.com/bob/ + +The AT&T image database is quite small, but sufficient to show how the face +verification methods work. Still, the results may not be meaningful. One good +thing about the AT&T database is that it is freely available. You can download +it from:: + + http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html + + +Finally, to download this package, please open a shell, go to a directory of +your choice and call: + +.. code-block:: sh + + $ git clone https://github.com/bioidiap/bob.example.faceverify.git + $ cd bob.example.faceverify + + +To generate the Documentation, please further go into the "doc" directory and +call: + +.. code-block:: sh + + make html + firefox _build/html/index.html + +(or use any other browser of your choice). After you did this, please read the +documentation and try to execute the examples. + diff --git a/bootstrap.py b/bootstrap.py new file mode 100644 index 0000000..7647cbb --- /dev/null +++ b/bootstrap.py @@ -0,0 +1,262 @@ +############################################################################## +# +# Copyright (c) 2006 Zope Foundation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +"""Bootstrap a buildout-based project + +Simply run this script in a directory containing a buildout.cfg. +The script accepts buildout command-line options, so you can +use the -c option to specify an alternate configuration file. +""" + +import os, shutil, sys, tempfile, urllib, urllib2, subprocess +from optparse import OptionParser + +if sys.platform == 'win32': + def quote(c): + if ' ' in c: + return '"%s"' % c # work around spawn lamosity on windows + else: + return c +else: + quote = str + +# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments. +stdout, stderr = subprocess.Popen( + [sys.executable, '-Sc', + 'try:\n' + ' import ConfigParser\n' + 'except ImportError:\n' + ' print 1\n' + 'else:\n' + ' print 0\n'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() +has_broken_dash_S = bool(int(stdout.strip())) + +# In order to be more robust in the face of system Pythons, we want to +# run without site-packages loaded. This is somewhat tricky, in +# particular because Python 2.6's distutils imports site, so starting +# with the -S flag is not sufficient. However, we'll start with that: +if not has_broken_dash_S and 'site' in sys.modules: + # We will restart with python -S. + args = sys.argv[:] + args[0:0] = [sys.executable, '-S'] + args = map(quote, args) + os.execv(sys.executable, args) +# Now we are running with -S. We'll get the clean sys.path, import site +# because distutils will do it later, and then reset the path and clean +# out any namespace packages from site-packages that might have been +# loaded by .pth files. +clean_path = sys.path[:] +import site # imported because of its side effects +sys.path[:] = clean_path +for k, v in sys.modules.items(): + if k in ('setuptools', 'pkg_resources') or ( + hasattr(v, '__path__') and + len(v.__path__) == 1 and + not os.path.exists(os.path.join(v.__path__[0], '__init__.py'))): + # This is a namespace package. Remove it. + sys.modules.pop(k) + +is_jython = sys.platform.startswith('java') + +setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py' +distribute_source = 'http://python-distribute.org/distribute_setup.py' + + +# parsing arguments +def normalize_to_url(option, opt_str, value, parser): + if value: + if '://' not in value: # It doesn't smell like a URL. + value = 'file://%s' % ( + urllib.pathname2url( + os.path.abspath(os.path.expanduser(value))),) + if opt_str == '--download-base' and not value.endswith('/'): + # Download base needs a trailing slash to make the world happy. + value += '/' + else: + value = None + name = opt_str[2:].replace('-', '_') + setattr(parser.values, name, value) + +usage = '''\ +[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options] + +Bootstraps a buildout-based project. + +Simply run this script in a directory containing a buildout.cfg, using the +Python that you want bin/buildout to use. + +Note that by using --setup-source and --download-base to point to +local resources, you can keep this script from going over the network. +''' + +parser = OptionParser(usage=usage) +parser.add_option("-v", "--version", dest="version", + help="use a specific zc.buildout version") +parser.add_option("-d", "--distribute", + action="store_true", dest="use_distribute", default=False, + help="Use Distribute rather than Setuptools.") +parser.add_option("--setup-source", action="callback", dest="setup_source", + callback=normalize_to_url, nargs=1, type="string", + help=("Specify a URL or file location for the setup file. " + "If you use Setuptools, this will default to " + + setuptools_source + "; if you use Distribute, this " + "will default to " + distribute_source + ".")) +parser.add_option("--download-base", action="callback", dest="download_base", + callback=normalize_to_url, nargs=1, type="string", + help=("Specify a URL or directory for downloading " + "zc.buildout and either Setuptools or Distribute. " + "Defaults to PyPI.")) +parser.add_option("--eggs", + help=("Specify a directory for storing eggs. Defaults to " + "a temporary directory that is deleted when the " + "bootstrap script completes.")) +parser.add_option("-t", "--accept-buildout-test-releases", + dest='accept_buildout_test_releases', + action="store_true", default=False, + help=("Normally, if you do not specify a --version, the " + "bootstrap script and buildout gets the newest " + "*final* versions of zc.buildout and its recipes and " + "extensions for you. If you use this flag, " + "bootstrap and buildout will get the newest releases " + "even if they are alphas or betas.")) +parser.add_option("-c", None, action="store", dest="config_file", + help=("Specify the path to the buildout configuration " + "file to be used.")) + +options, args = parser.parse_args() + +# if -c was provided, we push it back into args for buildout's main function +if options.config_file is not None: + args += ['-c', options.config_file] + +if options.eggs: + eggs_dir = os.path.abspath(os.path.expanduser(options.eggs)) +else: + eggs_dir = tempfile.mkdtemp() + +if options.setup_source is None: + if options.use_distribute: + options.setup_source = distribute_source + else: + options.setup_source = setuptools_source + +if options.accept_buildout_test_releases: + args.append('buildout:accept-buildout-test-releases=true') +args.append('bootstrap') + +try: + import pkg_resources + import setuptools # A flag. Sometimes pkg_resources is installed alone. + if not hasattr(pkg_resources, '_distribute'): + raise ImportError +except ImportError: + ez_code = urllib2.urlopen( + options.setup_source).read().replace('\r\n', '\n') + ez = {} + exec ez_code in ez + setup_args = dict(to_dir=eggs_dir, download_delay=0) + if options.download_base: + setup_args['download_base'] = options.download_base + if options.use_distribute: + setup_args['no_fake'] = True + ez['use_setuptools'](**setup_args) + if 'pkg_resources' in sys.modules: + reload(sys.modules['pkg_resources']) + import pkg_resources + # This does not (always?) update the default working set. We will + # do it. + for path in sys.path: + if path not in pkg_resources.working_set.entries: + pkg_resources.working_set.add_entry(path) + +cmd = [quote(sys.executable), + '-c', + quote('from setuptools.command.easy_install import main; main()'), + '-mqNxd', + quote(eggs_dir)] + +if not has_broken_dash_S: + cmd.insert(1, '-S') + +find_links = options.download_base +if not find_links: + find_links = os.environ.get('bootstrap-testing-find-links') +if find_links: + cmd.extend(['-f', quote(find_links)]) + +if options.use_distribute: + setup_requirement = 'distribute' +else: + setup_requirement = 'setuptools' +ws = pkg_resources.working_set +setup_requirement_path = ws.find( + pkg_resources.Requirement.parse(setup_requirement)).location +env = dict( + os.environ, + PYTHONPATH=setup_requirement_path) + +requirement = 'zc.buildout' +version = options.version +if version is None and not options.accept_buildout_test_releases: + # Figure out the most recent final version of zc.buildout. + import setuptools.package_index + _final_parts = '*final-', '*final' + + def _final_version(parsed_version): + for part in parsed_version: + if (part[:1] == '*') and (part not in _final_parts): + return False + return True + index = setuptools.package_index.PackageIndex( + search_path=[setup_requirement_path]) + if find_links: + index.add_find_links((find_links,)) + req = pkg_resources.Requirement.parse(requirement) + if index.obtain(req) is not None: + best = [] + bestv = None + for dist in index[req.project_name]: + distv = dist.parsed_version + if _final_version(distv): + if bestv is None or distv > bestv: + best = [dist] + bestv = distv + elif distv == bestv: + best.append(dist) + if best: + best.sort() + version = best[-1].version +if version: + requirement = '=='.join((requirement, version)) +cmd.append(requirement) + +if is_jython: + import subprocess + exitcode = subprocess.Popen(cmd, env=env).wait() +else: # Windows prefers this, apparently; otherwise we would prefer subprocess + exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env])) +if exitcode != 0: + sys.stdout.flush() + sys.stderr.flush() + print ("An error occurred when trying to install zc.buildout. " + "Look above this message for any errors that " + "were output by easy_install.") + sys.exit(exitcode) + +ws.add_entry(eggs_dir) +ws.require(requirement) +import zc.buildout.buildout +zc.buildout.buildout.main(args) +if not options.eggs: # clean up temporary egg directory + shutil.rmtree(eggs_dir) diff --git a/buildout.cfg b/buildout.cfg new file mode 100644 index 0000000..f2fe8ec --- /dev/null +++ b/buildout.cfg @@ -0,0 +1,30 @@ +; vim: set fileencoding=utf-8 : +; Andre Anjos <andre.anjos@idiap.ch> +; Mon 16 Apr 08:29:18 2012 CEST + +; This is the configuration file for buildout. It is a windows-init style file +; divided into sections. This is probably the most minimalistic example you can +; have. +; +; The first section of this file defines to which other sections buildout will +; look at for information. We only have 1 other section (or part) to look at, +; the 'python' section. + +[buildout] +parts = python + +; We will be 'developing' the current package, so we should put '.' here +develop = . + +; Names of other packages that we need installed locally, including this one. +; You can use this instruction here to 'augment' the portfolio of packages that +; will be available at this local installation. This happens besides what has +; already been described at your package's setup.py. So, don't repeat those +; requirements here unless you would like to define specific version numbers +; for testing purposes. +eggs = bob.example.faceverify + +[python] +recipe = zc.recipe.egg +interpreter = python +eggs = ${buildout:eggs} diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..234f658 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,130 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make <target>' where <target> is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/FaceRecLib.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/FaceRecLib.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/FaceRecLib" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/FaceRecLib" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..c971fc5 --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +# +# FaceRecLib documentation build configuration file, created by +# sphinx-quickstart on Wed Jan 25 17:23:57 2012. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'bob.example.faceverify' +copyright = u'2012, Manuel Guenther' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.1' +# The full version, including alpha/beta/rc tags. +release = '0.1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# "<project> v<release> documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +#html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a <link> tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'bob.example.faceverify.doc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +#latex_documents = [ +# ('index', 'FaceRecLib.tex', u'FaceRecLib Documentation', +# u'Laurent El Shafey', 'manual'), +#] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'bob.example.faceverify', u'Documentation for the examples how to use Bob for face verification', + [u'Manuel Guenther'], 1) +] diff --git a/doc/dct_ubm.png b/doc/dct_ubm.png new file mode 100644 index 0000000000000000000000000000000000000000..324e358372b2e3ca19e664bb7e6cda25d2e9d62c GIT binary patch literal 36560 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 E05<_3G5`Po literal 0 HcmV?d00001 diff --git a/doc/eigenface.png b/doc/eigenface.png new file mode 100644 index 0000000000000000000000000000000000000000..4249388f8c2adfc2e37d37071568ff862dd11b51 GIT binary patch literal 39303 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	uq!mU@THTCqgg^tZ^1w}=NUS3|lG4-_A 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 literal 0 HcmV?d00001 diff --git a/doc/examples.rst b/doc/examples.rst new file mode 100644 index 0000000..e9bef5b --- /dev/null +++ b/doc/examples.rst @@ -0,0 +1,147 @@ +===================== + Running the examples +===================== + +To run the examples, just call the scripts from within the ``bin`` directory, +e.g.: + +.. code-block:: sh + + $ bin/eigenface.py + +If you installed the image database in another folder than ``Database``, please +give this directrory as parameter to the script, e.g.: + +.. code-block:: sh + + $ bin/eigenface.py <AT&T_DATABASE_DIR> + + +There are three example scripts: + +.. code-block:: sh + + $ bin/eigenface.py + $ bin/gabor_phase.py + $ bin/dct_ubm.py + +that perform more or less complicated face verification experiments. Each +experiment creates an ROC curve that contains the final verification result of +the test. The generated files will be ``eigenface.png``, ``gabor_phase.png``, +and ``dct_ubm.png``. + +Since the complexity of the algorithms increase the expected execution time of +them differ a lot. While the eigenface example should be finished in a couple of +seconds, the Gabor phase example could take some minutes, and the UBM/GMM model +needs in the order of half an hour to compute. + + +The eigenface example +~~~~~~~~~~~~~~~~~~~~~ +The eigenface example follows the work-flow that is presented in the original +paper *Eigenfaces for Recognition* [TP91]_ by Turk and Pentland. First, it +creates an object to query the database: + +.. code-block:: python + + >>> atnt_db = bob.db.atnt.Database() + +For training the projection matrix, the training images need to be read: + +.. code-block:: python + + >>> training_image_files = atnt_db.files(groups = 'train', ...) + >>> for filename in training_image_files.values(): + ... training_image = bob.io.load(filename) + +Since the images are already aligned to the eye positions, they can simply be +linearized (converted into one long vector) and put into an ``bob.io.ArraySet``: + +.. code-block:: python + + >>> training_set = bob.io.Arrayset() + >>> for image in training_images.values(): + ... training_set.append(image.flatten()) + +which is used to train a ``bob.machine.LinearMachine``: + +.. code-block:: python + + >>> pca_trainer = bob.trainer.SVDPCATrainer() + >>> pca_machine, eigen_values = pca_trainer.train(training_set) + +For some distance functions, the eigenvalues are needed, but in our example we +just ignore them. + +After training, the model and probe images are loaded, linearized, and projected +into the eigenspace using the trained ``pca_machine``: + +.. code-block:: python + + >>> model_image_files = atnt_db.files(groups = 'test', purpose = 'enrol', ...) + >>> for filename in model_image_files.values(): + ... model_image = bob.io.load(filename) + ... model_feature = pca_machine(model_image.flatten()) + + >>> probe_image_files = atnt_db.files(groups = 'test', purpose = 'probe', ...) + >>> for filename in probe_image_files.values(): + ... probe_image = bob.io.load(filename) + ... probe_feature = pca_machine(probe_image.flatten()) + +To compute the verification result, each model feature is compared to each probe +feature by computing the Euclidean distance: + +.. code-block:: python + + >>> for model_feature in model_features: + ... for probe_feature in probe_features: + ... score = bob.math.euclidean_distance(model_feature, probe_feature) + +The results are divided into a list of positive scores (model and probe are from +the same identity) and a a list of negative scores (identities of model and +probe differ). Using these lists, the ROC curve is plotted: + +.. code-block:: python + + >>> bob.measure.plot.roc(negatives, positives) + +.. image:: eigenface.png + :scale: 70 % + +and the performance is computed: + +.. code-block:: python + + >>> threshold = bob.measure.eer_threshold(negatives, positives) + >>> FAR, FRR = bob.measure.farfrr(negatives, positives, threshold) + +The expected result is: FAR 83.6% and FRR 83.6% at distance threshold 2048.9 + +.. note:: + + Computing eigenfaces with such a low amount of training data is usually not an + excellent idea. Hence, the performance in this example is extremely poor. + + +Gabor jet comparisons +~~~~~~~~~~~~~~~~~~~~~ +Description of algorithm will follow. The expected output is: + +.. image:: gabor_phase.png + :scale: 70 % + +The expected result is: FAR 22% and FRR 22% at distance threshold 0.1799 + + +The UBM/GMM modeling of DCT Blocks +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Description of algorithm will follow. The expected output is: + +.. image:: dct_ubm.png + :scale: 70 % + +The expected result is: FAR 5% and FRR 5% at distance threshold 7640.9 + + +.. [TP91] Matthew Turk and Alex Pentland. Eigenfaces for recognition. Journal of Cognitive Neuroscience, 3(1):71-86, 1991. + diff --git a/doc/gabor_phase.png b/doc/gabor_phase.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf4a324dbb07e536a6497d04f6af283671e1377 GIT binary patch literal 41292 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 A*8l(j literal 0 HcmV?d00001 diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..5a81959 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,23 @@ +.. FaceRecLib documentation master file, created by + sphinx-quickstart on Wed Jan 25 17:23:57 2012. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to the documentation of the face verification examples! +=============================================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + installation + examples + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/doc/installation.rst b/doc/installation.rst new file mode 100644 index 0000000..9f3eb8a --- /dev/null +++ b/doc/installation.rst @@ -0,0 +1,71 @@ +============= + Installation +============= + +.. note:: + + To follow these instructions locally you will need a local copy of this + package. Start by cloning this project with something like:: + + $ git clone https://github.com/bioidiap/bob.example.faceverify.git + $ cd bob.example.faceverify + + +Installation of the toolkit uses the `buildout <http://www.buildout.org/>`_ +build environment. You don't need to understand its inner workings to use this +package. Here is a recipe to get you started (shell commands are marked with a +``$`` signal): + +.. code-block:: sh + + $ python bootstrap.py + $ ./bin/buildout + +These 2 commands should download and install all non-installed dependencies and +get you a fully operational test and development environment. + +.. note:: + + The python shell used in the first line of the previous command set + determines the python interpreter that will be used for all scripts developed + inside this package. Because this package makes use of `Bob + <http://idiap.github.com/bob>`_, you must make sure that the ``bootstrap.py`` + script is called with the **same** interpreter used to build Bob, or + unexpected problems might occur. + + If Bob is installed by the administrator of your system, it is safe to + consider it uses the default python interpreter. In this case, the above 3 + command lines should work as expected. + + +Use this example with Bob not installed globally +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +If your Bob version is not installed globally, this package provides a +configuration file *localbob.cfg* that has to be modified. Please search for the +``bob.install.directory`` region and set the value according to your local Bob +install directory. If you are at Idiap, you can simply choose one the existing +directories. + + +Use Bob at Idiap +~~~~~~~~~~~~~~~~ +To get the example running nicely at Idiap, as noted above, ``bootstrap.py`` has +to be executed with the correct python version. For Idiap, this is (currently): + +.. code-block:: sh + + $ /idiap/group/torch5spro/nightlies/externals/v2/linux-x86_64/bin/python2.6 bootstrap.py + $ ./bin/buildout -c localbob.cfg + + +Downloading the test database +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The images that are required to run the test are not included in this package, +but they are freely downloadable from the internet: + +http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html + +Unpack the database in a directory that fits you. The easiest solution is to +create a subdirectory ``Database`` in this package. If you decide to put the +data somewhere else, please remember the image directory. + diff --git a/faceverify/__init__.py b/faceverify/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/faceverify/dct_ubm.py b/faceverify/dct_ubm.py new file mode 100644 index 0000000..17e86d9 --- /dev/null +++ b/faceverify/dct_ubm.py @@ -0,0 +1,225 @@ +import bob +import os, sys +import numpy +from matplotlib import pyplot + +# This is the base directory where by default the AT&T images are found. You can +# overwrite this directory on the command line +global ATNT_IMAGE_DIRECTORY +ATNT_IMAGE_DIRECTORY = "Database" + +# The default file name extension of the AT&T images +ATNT_IMAGE_EXTENSION = ".pgm" + + +def load_images(db, group = None, purpose = None, client_id = None): + """Reads the images for the given group and the given client id from the given database""" + # get the file names from the database + file_names = db.files(groups = group, purposes = purpose, client_ids = client_id, directory = ATNT_IMAGE_DIRECTORY, extension = ATNT_IMAGE_EXTENSION) + # iterate through the list of file names + images = {} + for key, image_name in file_names.iteritems(): + # load image and linearize it into a vector + images[key] = bob.io.load(image_name).astype(numpy.float64) + return images + + +# Parameters of the DCT extraction +DCT_BLOCK_SIZE = 12 +DCT_BLOCK_OVERLAP = 11 +NUMBER_OF_DCT_COMPONENTS = 45 + +# create a DCT block extractor model +dct_extractor = bob.ip.DCTFeatures(DCT_BLOCK_SIZE, DCT_BLOCK_SIZE, DCT_BLOCK_OVERLAP, DCT_BLOCK_OVERLAP, NUMBER_OF_DCT_COMPONENTS) + +def extract_feature(image): + """Extracts the DCT features for the given image""" + + # compute shape of the image blocks + block_shape = bob.ip.get_block_3d_output_shape(image, DCT_BLOCK_SIZE, DCT_BLOCK_SIZE, DCT_BLOCK_OVERLAP, DCT_BLOCK_OVERLAP) + image_blocks = numpy.ndarray(block_shape, 'float64') + + # fill image blocks + bob.ip.block(image, image_blocks, DCT_BLOCK_SIZE, DCT_BLOCK_SIZE, DCT_BLOCK_OVERLAP, DCT_BLOCK_OVERLAP) + + # perform DCT on image blocks + dct_blocks = dct_extractor(image_blocks) + + return dct_blocks + + + +# Parameters of the UBM/GMM module training +NUMBER_OF_GAUSSIANS = 100 + +def train(training_features): + """Trains the UBM/GMM module with the given set of training DCT features""" + + # create array set used for training + training_set = bob.io.Arrayset() + # iterate through the training examples + for feature in training_features.values(): + # stack the examples to generate training matrix + training_set.extend(feature) + + input_size = training_set.shape[0] + # create the KMeans and UBM machine + kmeans = bob.machine.KMeansMachine(NUMBER_OF_GAUSSIANS, input_size) + ubm = bob.machine.GMMMachine(NUMBER_OF_GAUSSIANS, input_size) + + # create the KMeansTrainer + kmeans_trainer = bob.trainer.KMeansTrainer() + + # train using the KMeansTrainer + kmeans_trainer.train(kmeans, training_set) + + [variances, weights] = kmeans.get_variances_and_weights_for_each_cluster(training_set) + means = kmeans.means + + # initialize the GMM + ubm.means = means + ubm.variances = variances + ubm.weights = weights + + # train the GMM + trainer = bob.trainer.ML_GMMTrainer() + trainer.train(ubm, training_set) + + return ubm + + +def enrol(model_features, ubm, gmm_trainer): + """Enrolls the GMM model for the given model features (which should stem from the same identity)""" + # create array set used for training + training_set = bob.io.Arrayset() + for feature in model_features.values(): + training_set.extend(feature) + # create a GMM from the UBM + gmm = bob.machine.GMMMachine(ubm) + + # train the GMM + gmm_trainer.train(gmm, training_set) + + # return the resulting gmm + return gmm + + +def stats(feature, ubm): + """Computes the UBM Statistics for the given feature vector""" + # compute the UBM stats for the given feature + feature = bob.io.Arrayset(feature) + + # Accumulate statistics + gmm_stats = bob.machine.GMMStats(ubm.dim_c, ubm.dim_d) + gmm_stats.init() + ubm.acc_statistics(feature, gmm_stats) + + return gmm_stats + + +def main(): + """This function will perform an a DCT block extraction and a UBM/GMM modeling test on the AT&T database""" + + # use the bob.db interface to retrieve information about the Database + atnt_db = bob.db.atnt.Database() + + # check if the AT&T database directory is overwritten by the command line + global ATNT_IMAGE_DIRECTORY + if len(sys.argv) > 1: + ATNT_IMAGE_DIRECTORY = sys.argv[1] + + # check if the database directory exists + if not os.path.isdir(ATNT_IMAGE_DIRECTORY): + print "The database directory '" + ATNT_IMAGE_DIRECTORY + "' does not exists!" + return + + ##################################################################### + ### UBM Training + # load all training images + training_images = load_images(atnt_db, group = 'train') + + print "Extracting training features" + training_features = {} + for key, image in training_images.iteritems(): + training_features[key] = extract_feature(image) + + print "Training UBM model" + ubm = train(training_features) + + ##################################################################### + ### GMM model enrollment + print "Enrolling GMM models" + gmm_trainer = bob.trainer.MAP_GMMTrainer() + gmm_trainer.max_iterations = 1 + gmm_trainer.set_prior_gmm(ubm) + + # create a GMM model for each model identity + model_ids = atnt_db.client_ids(groups = 'test') + models = {} + for model_id in model_ids: + # load images for the current model id + model_images = load_images(atnt_db, group = 'test', purpose = 'enrol', client_id = model_id) + models_for_current_id = {} + # extract model features + for key, image in model_images.iteritems(): + models_for_current_id[key] = extract_feature(image) + # enroll model for the current identity from these features + model = enrol(models_for_current_id, ubm, gmm_trainer) + models[model_id] = model + + ##################################################################### + ### probe stats + + print "Computing probe statistics" + probe_images = load_images(atnt_db, group = 'test', purpose = 'probe') + probes = {} + for key, image in probe_images.iteritems(): + # extract probe features + probe_feature = extract_feature(image) + # compute GMM statistics + probes[key] = stats(probe_feature, ubm) + + ##################################################################### + ### compute scores, we here choose a simple Euclidean distance measure + positive_scores = [] + negative_scores = [] + + print "Computing scores" + distance_function = bob.machine.linear_scoring + + # iterate through models and probes and compute scores + for model_id, model_gmm in models.iteritems(): + for probe_key, probe_stats in probes.iteritems(): + # compute score + score = distance_function([model_gmm], ubm, [probe_stats])[0,0] + + # check if this is a positive score + if model_id == atnt_db.get_client_id_from_file_id(probe_key): + positive_scores.append(score) + else: + negative_scores.append(score) + + print "Evaluation" + # convert list of scores to numpy arrays + positives = numpy.array(positive_scores) + negatives = numpy.array(negative_scores) + + # compute equal error rate + threshold = bob.measure.eer_threshold(negatives, positives) + FAR, FRR = bob.measure.farfrr(negatives, positives, threshold) + + print "Result: FAR", FAR, "and FRR", FRR, "at threshold", threshold + + # plot ROC curve + bob.measure.plot.roc(negatives, positives) + pyplot.xlabel("False Rejection Rate (%)") + pyplot.ylabel("False Acceptance Rate (%)") + pyplot.title("ROC Curve for UBM/GMM based AT&T Verification Experiment") + pyplot.grid() + pyplot.axis([0, 100, 0, 100]) #xmin, xmax, ymin, ymax + + # save plot to file + pyplot.savefig("dct_ubm.png") + # show ROC curve + pyplot.show() + diff --git a/faceverify/eigenface.py b/faceverify/eigenface.py new file mode 100644 index 0000000..753b93b --- /dev/null +++ b/faceverify/eigenface.py @@ -0,0 +1,148 @@ +import bob +import os, sys +import numpy +from matplotlib import pyplot + +# This is the base directory where by default the AT&T images are found. You can +# overwrite this directory on the command line +global ATNT_IMAGE_DIRECTORY +ATNT_IMAGE_DIRECTORY = "Database" + +# The default file name extension of the AT&T images +ATNT_IMAGE_EXTENSION = ".pgm" + + +def load_images(db, group = None, purpose = None): + """Reads the images for the given group and the given purpose from the given database""" + # get the file names from the database + file_names = db.files(groups = group, purposes = purpose, directory = ATNT_IMAGE_DIRECTORY, extension = ATNT_IMAGE_EXTENSION) + # iterate through the list of file names + images = {} + for key, image_name in file_names.iteritems(): + # load image and linearize it into a vector + images[key] = bob.io.load(image_name).astype(numpy.float64) + return images + + +# The number of eigenfaces that should be kept +KEPT_EIGENFACES = 5 + +def train(training_images): + """Trains the PCA module with the given list of training images""" + # perform training using a SVD PCA trainer + pca_trainer = bob.trainer.SVDPCATrainer() + + # create array set used for training + training_set = bob.io.Arrayset() + + # iterate through the training examples and linearize the images + for image in training_images.values(): + training_set.append(image.flatten()) + + # training the SVD PCA returns a machine that can be used for projection + pca_machine, eigen_values = pca_trainer.train(training_set) + + # limit the number of kept eigenfaces + pca_machine.resize(pca_machine.shape[0], KEPT_EIGENFACES) + + return pca_machine + + +def extract_feature(image, pca_machine): + """Projects the given list of images to the PCA subspace and returns the results""" + # create projection result in the desired size + projected_feature = numpy.ndarray((KEPT_EIGENFACES,), dtype = numpy.float64) + + # project the data after linearizing them + pca_machine(image.flatten(), projected_feature) + + # return the projected data + return projected_feature + + +def main(): + """This function will perform an eigenface test on the AT&T database""" + + # use the bob.db interface to retrieve information about the Database + atnt_db = bob.db.atnt.Database() + + # check if the AT&T database directory is overwritten by the command line + global ATNT_IMAGE_DIRECTORY + if len(sys.argv) > 1: + ATNT_IMAGE_DIRECTORY = sys.argv[1] + + # check if the database directory exists + if not os.path.isdir(ATNT_IMAGE_DIRECTORY): + print "The database directory '" + ATNT_IMAGE_DIRECTORY + "' does not exists!" + return + + ##################################################################### + ### Training + + # load all training images + training_images = load_images(atnt_db, group = 'train') + + print "Training PCA machine" + pca_machine = train(training_images) + + ##################################################################### + ### extract eigenface features of model and probe images + + # load model and probe images + model_images = load_images(atnt_db, group = 'test', purpose = 'enrol') + probe_images = load_images(atnt_db, group = 'test', purpose = 'probe') + + print "Extracting models" + model_features = {} + for key, image in model_images.iteritems(): + model_features[key] = extract_feature(image, pca_machine) + print "Extracting probes" + probe_features = {} + for key, image in probe_images.iteritems(): + probe_features[key] = extract_feature(image, pca_machine) + + + ##################################################################### + ### compute scores, we here choose a simple Euclidean distance measure + positive_scores = [] + negative_scores = [] + + print "Computing scores" + distance_function = bob.math.euclidean_distance + + # iterate through models and probes and compute scores + for model_key, model_feature in model_features.iteritems(): + for probe_key, probe_feature in probe_features.iteritems(): + # compute score + score = distance_function(model_feature, probe_feature) + + # check if this is a positive score + if atnt_db.get_client_id_from_file_id(model_key) == atnt_db.get_client_id_from_file_id(probe_key): + positive_scores.append(score) + else: + negative_scores.append(score) + + print "Evaluation" + # convert list of scores to numpy arrays + positives = numpy.array(positive_scores) + negatives = numpy.array(negative_scores) + + # compute equal error rate + threshold = bob.measure.eer_threshold(negatives, positives) + FAR, FRR = bob.measure.farfrr(negatives, positives, threshold) + + print "Result: FAR", FAR, "and FRR", FRR, "at threshold", threshold + + # plot ROC curve + bob.measure.plot.roc(negatives, positives) + pyplot.xlabel("False Rejection Rate (%)") + pyplot.ylabel("False Acceptance Rate (%)") + pyplot.title("ROC Curve for Eigenface based AT&T Verification Experiment") + pyplot.grid() + pyplot.axis([0, 100, 0, 100]) #xmin, xmax, ymin, ymax + + # save plot to file + pyplot.savefig("eigenface.png") + # show ROC curve + pyplot.show() + diff --git a/faceverify/gabor_phase.py b/faceverify/gabor_phase.py new file mode 100644 index 0000000..e8c1ed5 --- /dev/null +++ b/faceverify/gabor_phase.py @@ -0,0 +1,135 @@ +import bob +import os, sys +import numpy +from matplotlib import pyplot + +# This is the base directory where by default the AT&T images are found. You can +# overwrite this directory on the command line +global ATNT_IMAGE_DIRECTORY +ATNT_IMAGE_DIRECTORY = "Database" + +# The default file name extension of the AT&T images +ATNT_IMAGE_EXTENSION = ".pgm" + + +def load_images(db, group = None, purpose = None): + """Reads the images for the given group and the given purpose from the given database""" + # get the file names from the database + file_names = db.files(groups = group, purposes = purpose, directory = ATNT_IMAGE_DIRECTORY, extension = ATNT_IMAGE_EXTENSION) + # iterate through the list of file names + images = {} + for key, image_name in file_names.iteritems(): + # load image and linearize it into a vector + images[key] = bob.io.load(image_name).astype(numpy.float64) + return images + + +# define Gabor wavelet transform class globally since it is reused for all images +gabor_wavelet_transform = bob.ip.GaborWaveletTransform() +# create empty Gabor jet image including Gabor phases in the required size +jet_image = gabor_wavelet_transform.empty_jet_image(numpy.ndarray((112,92)), True) + +def extract_feature(image, graph_machine): + """Extracts the Gabor graphs from the given image""" + + # create extraction result in the desired size + shape = [graph_machine.number_of_nodes] + # add the shape of one Gabor jet + shape.extend(jet_image[0,0].shape) + gabor_graph = numpy.ndarray(shape, dtype = numpy.float64) + + # perform Gabor wavelet transform on the image + gabor_wavelet_transform.compute_jets(image, jet_image) + + # extract the Gabor graphs from the feature image + graph_machine(jet_image, gabor_graph) + + # return the extracted graph + return gabor_graph + + +def main(): + """This function will perform Gabor graph comparison test on the AT&T database""" + + # use the bob.db interface to retrieve information about the Database + atnt_db = bob.db.atnt.Database() + + # check if the AT&T database directory is overwritten by the command line + global ATNT_IMAGE_DIRECTORY + if len(sys.argv) > 1: + ATNT_IMAGE_DIRECTORY = sys.argv[1] + + # check if the database directory exists + if not os.path.isdir(ATNT_IMAGE_DIRECTORY): + print "The database directory '" + ATNT_IMAGE_DIRECTORY + "' does not exists!" + return + + ##################################################################### + ### Training + + # for Gabor graphs, no training is required. + + print "Creating Gabor graph machine" + # create a machine that will produce tight Gabor graphs with inter-node distance (1,1) + graph_machine = bob.machine.GaborGraphMachine((0,0), (111,91), (1,1)) + + ##################################################################### + ### extract Gabor graph features for all model and probe images + # load all model and probe images + model_images = load_images(atnt_db, group = 'test', purpose = 'enrol') + probe_images = load_images(atnt_db, group = 'test', purpose = 'probe') + + print "Extracting models" + model_features = {} + for key, image in model_images.iteritems(): + model_features[key] = extract_feature(image, graph_machine) + print "Extracting probes" + probe_features = {} + for key, image in probe_images.iteritems(): + probe_features[key] = extract_feature(image, graph_machine) + + + ##################################################################### + ### compute scores, we here choose a simple Euclidean distance measure + positive_scores = [] + negative_scores = [] + + print "Computing scores" + # define a certain Gabor jet similarity function that should be used + similarity_function = bob.machine.DisparityCorrectedPhaseDifference() + + # iterate through models and probes and compute scores + for model_key, model_feature in model_features.iteritems(): + for probe_key, probe_feature in probe_features.iteritems(): + # compute score using the desired Gabor jet similarity function + score = graph_machine.similarity(model_feature, probe_feature, similarity_function) + + # check if this is a positive score + if atnt_db.get_client_id_from_file_id(model_key) == atnt_db.get_client_id_from_file_id(probe_key): + positive_scores.append(score) + else: + negative_scores.append(score) + + print "Evaluation" + # convert list of scores to numpy arrays + positives = numpy.array(positive_scores) + negatives = numpy.array(negative_scores) + + # compute equal error rate + threshold = bob.measure.eer_threshold(negatives, positives) + FAR, FRR = bob.measure.farfrr(negatives, positives, threshold) + + print "Result: FAR", FAR, "and FRR", FRR, "at threshold", threshold + + # plot ROC curve + bob.measure.plot.roc(negatives, positives) + pyplot.xlabel("False Rejection Rate (%)") + pyplot.ylabel("False Acceptance Rate (%)") + pyplot.title("ROC Curve for Gabor phase based AT&T Verification Experiment") + pyplot.grid() + pyplot.axis([0, 100, 0, 100]) #xmin, xmax, ymin, ymax + + # save plot to file + pyplot.savefig("gabor_phase.png") + # show ROC curve + pyplot.show() diff --git a/localbob.cfg b/localbob.cfg new file mode 100644 index 0000000..f51b78b --- /dev/null +++ b/localbob.cfg @@ -0,0 +1,48 @@ +; vim: set fileencoding=utf-8 : +; Andre Anjos <andre.anjos@idiap.ch> +; Mon 16 Apr 08:29:18 2012 CEST + +; Example buildout recipe using a local (off-root) Bob installation + +[buildout] +parts = bob python +develop = . + +; The 'mr.developer' extension is available publicly at PyPI (the python +; package index). You don't need to worry about it as buildout will download +; install it for you. +extensions = mr.developer +auto-checkout = * + +; Note: You will notice 'bob' is listed as an egg here. If you have a version +; of Bob installed by the administrator, centrally, but want to use your +; locally compiled version, that is required to assure the include path order +; in generated scripts. +eggs = bob.example.faceverify + bob + +[sources] +; You will need this package so that buildout includes the path to Bob's build +; or installation directory using this configuration file as reference. +local.bob.recipe = git git@github.com:idiap/local.bob.recipe.git + +[bob] +recipe = local.bob.recipe:config + +; Choose here your bob installation - **re-run buildout if you change it** +; the path here can be relative or absolute to either the build directory of +; Bob or to an installation directory. Both should work w/o problems. +; +; If you go for a relative path, remember this path is relative to the path +; you are calling buildout from. This is normally the path that contains the +; file 'setup.py' for your own package. +install-directory = ../bob/build + +; Some examples for Idiap: +;install-directory = /idiap/group/torch5spro/releases/bob-1.0.2/install/linux-x86_64-release +;install-directory = /idiap/group/torch5spro/nightlies/last/install/linux-x86_64-release + +[python] +recipe = zc.recipe.egg +interpreter = python +eggs = ${buildout:eggs} diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..de3bdb8 --- /dev/null +++ b/setup.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# vim: set fileencoding=utf-8 : +# Manuel Guenther <Manuel.Guenther@idiap.ch> +# Tue Apr 24 18:55:40 CEST 2012 + +# This file contains the python (distutils/setuptools) instructions so your +# package can be installed on **any** host system. It defines some basic +# information like the package name for instance, or its homepage. +# +# It also defines which other packages this python package depends on and that +# are required for this package's operation. The python subsystem will make +# sure all dependent packages are installed or will install them for you upon +# the installation of this package. +# +# The 'buildout' system we use here will go further and wrap this package in +# such a way to create an isolated python working environment. Buildout will +# make sure that dependencies which are not yet installed do get installed, but +# **without** requiring adminstrative privileges on the host system. This +# allows you to test your package with new python dependencies w/o requiring +# administrative interventions. + +from setuptools import setup, find_packages + +# The only thing we do in this file is to call the setup() function with all +# parameters that define our package. +setup( + + # This is the basic information about your project. Modify all this + # information before releasing code publicly. + name='bob.example.faceverify', + version='0.1', + description='Example for using Bob to create face verification systems', + url='http://github.com/idiap/bob.example.faceverify', + license='LICENSE.txt', + author_email='Manuel Guenther <Manuel.Guenther@idiap.ch>', + + # If you have a better, long description of your package, place it on the + # 'doc' directory and then hook it here + #long_description=open('doc/long-description.rst').read(), + + # This line is required for any distutils based packaging. + packages=find_packages(), + + # This line defines which packages should be installed when you "install" + # this package. All packages that are mentioned here, but are not installed + # on the current system will be installed locally and only visible to the + # scripts of this package. Don't worry - You won't need adminstrative + # privileges when using buildout. + install_requires=[ + "bob", # base signal proc./machine learning library + + # here are some more examples you could include: + #"argparse", # better option parsing + ], + + # This entry defines which scripts you will have inside the 'bin' directory + # once you install the package (or run 'bin/buildout'). The order of each + # entry under 'console_scripts' is like this: + # script-name-at-bin-directory = module.at.your.library:function + # + # The module.at.your.library is the python file within your library, using + # the python syntax for directories (i.e., a '.' instead of '/' or '\'). + # This syntax also omits the '.py' extension of the filename. So, a file + # installed under 'example/foo.py' that contains a function which + # implements the 'main()' function of particular script you want to have + # should be referred as 'example.foo:main'. + # + # In this simple example we will create a single program that will print + # the version of bob. + entry_points={ + 'console_scripts': [ + 'eigenface.py = faceverify.eigenface:main', + 'gabor_phase.py = faceverify.gabor_phase:main', + 'dct_ubm.py = faceverify.dct_ubm:main' + ], + }, + +) -- GitLab