From f14e9ef3a13e306ad909a682554a997d9f5f11cc Mon Sep 17 00:00:00 2001 From: gulvarol Date: Wed, 22 May 2019 18:03:53 +0200 Subject: [PATCH] Init. --- .gitignore | 10 + LICENSE | 674 +++++++++++++++++++++++++++ README.md | 54 +++ demo.py | 38 ++ display_utils.py | 71 +++ environment.yml | 10 + image.png | Bin 0 -> 106808 bytes smpl/native/__init__.py | 0 smpl/native/models/README.md | 1 + smpl/native/webuser/__init__.py | 0 smpl/native/webuser/posemapper.py | 31 ++ smpl/native/webuser/serialization.py | 39 ++ smpl/pytorch/__init__.py | 0 smpl/pytorch/rodrigues_layer.py | 85 ++++ smpl/pytorch/smpl_layer.py | 152 ++++++ smpl/pytorch/tensutils.py | 52 +++ 16 files changed, 1217 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 demo.py create mode 100644 display_utils.py create mode 100644 environment.yml create mode 100644 image.png create mode 100644 smpl/native/__init__.py create mode 100644 smpl/native/models/README.md create mode 100644 smpl/native/webuser/__init__.py create mode 100644 smpl/native/webuser/posemapper.py create mode 100644 smpl/native/webuser/serialization.py create mode 100644 smpl/pytorch/__init__.py create mode 100644 smpl/pytorch/rodrigues_layer.py create mode 100644 smpl/pytorch/smpl_layer.py create mode 100644 smpl/pytorch/tensutils.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c50674d --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.sw* +*.bak +*_bak.py + +.cache/ +__pycache__/ +build/ +dist/ + +smpl/native/models/*.pkl diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + + + Copyright (C) + + 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 . + +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: + + Copyright (C) + 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 +. + + 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 +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..dcd5db1 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +SMPL layer for PyTorch +======= + +[SMPL](http://smpl.is.tue.mpg.de) human body [\[1\]](#references) layer for [PyTorch](https://pytorch.org/) (tested with v0.4 and v1.x) +is a differentiable PyTorch layer that deterministically maps from pose and shape parameters to human body joints and vertices. +It can be integrated into any architecture as a differentiable layer to predict body meshes. +The code is adapted from the [manopth](https://github.com/hassony2/manopth) repository by [Yana Hasson](https://github.com/hassony2). + +

+smpl +

+ +## Setting up + +* Dependencies: + * Install the dependencies listed in [environment.yml](environment.yml) + * In an existing conda environment, `conda env update -f environment.yml` + * In a new environment, `conda env create -f environment.yml`, will create a conda environment named `smplpytorch` +* Download SMPL pickle files: + * Download the models from the [SMPL website](http://smpl.is.tue.mpg.de/) by choosing "SMPL for Python users". Note that you need to comply with the [SMPL model license](http://smpl.is.tue.mpg.de/license_model). + * Extract and copy the `models` folder into the `smpl/native/` folder. + +## Demo + +Forward pass the randomly created pose and shape parameters from the SMPL layer and display the human body mesh and joints: + +`python demo.py` + +## Acknowledgements +The code **largely** builds on the [manopth](https://github.com/hassony2/manopth) repository from [Yana Hasson](https://github.com/hassony2), which implements the [MANO](http://mano.is.tue.mpg.de) hand model [\[2\]](#references) layer. + +The code is a PyTorch port of the original [SMPL](http://smpl.is.tue.mpg.de) model from [chumpy](https://github.com/mattloper/chumpy). It builds on the work of [Loper](https://github.com/mattloper) et al. [\[1\]](#references). + +The code [reuses](https://github.com/gulvarol/smpl/pytorch/rodrigues_layer.py) [part of the code](https://github.com/MandyMo/pytorch_HMR/blob/master/src/util.py) by [Zhang Xiong](https://github.com/MandyMo) to compute the rotation utilities. + +If you find this code useful for your research, please cite the original [SMPL](http://smpl.is.tue.mpg.de) publication: + +``` +@article{SMPL:2015, + author = {Loper, Matthew and Mahmood, Naureen and Romero, Javier and Pons-Moll, Gerard and Black, Michael J.}, + title = {{SMPL}: A Skinned Multi-Person Linear Model}, + journal = {ACM Trans. Graphics (Proc. SIGGRAPH Asia)}, + number = {6}, + pages = {248:1--248:16}, + volume = {34}, + year = {2015} +} +``` + +## References + +\[1\] Matthew Loper, Naureen Mahmood, Javier Romero, Gerard Pons-Moll, and Michael J. Black, "SMPL: A Skinned Multi-Person Linear Model," SIGGRAPH Asia, 2015. + +\[2\] Javier Romero, Dimitrios Tzionas, and Michael J. Black, "Embodied Hands: Modeling and Capturing Hands and Bodies Together," SIGGRAPH Asia, 2017. diff --git a/demo.py b/demo.py new file mode 100644 index 0000000..20252a6 --- /dev/null +++ b/demo.py @@ -0,0 +1,38 @@ +import torch + +from smpl.pytorch.smpl_layer import SMPL_Layer +from display_utils import display_model + + +if __name__ == '__main__': + cuda = False + batch_size = 1 + + # Create the SMPL layer + smpl_layer = SMPL_Layer( + center_idx=0, + gender='neutral', + model_root='smpl/native/models') + + # Generate random pose and shape parameters + pose_params = torch.rand(batch_size, 72) * 0.2 + shape_params = torch.rand(batch_size, 10) * 0.03 + + # GPU mode + if cuda: + pose_params = pose_params.cuda() + shape_params = shape_params.cuda() + smpl_layer.cuda() + + # Forward from the SMPL layer + verts, Jtr = smpl_layer(pose_params, th_betas=shape_params) + + # Draw output vertices and joints + display_model( + {'verts': verts.cpu().detach(), + 'joints': Jtr.cpu().detach()}, + model_faces=smpl_layer.th_faces, + with_joints=True, + kintree_table=smpl_layer.kintree_table, + savepath='image.png', + show=True) diff --git a/display_utils.py b/display_utils.py new file mode 100644 index 0000000..8e4f7dd --- /dev/null +++ b/display_utils.py @@ -0,0 +1,71 @@ +from matplotlib import pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from mpl_toolkits.mplot3d.art3d import Poly3DCollection +# plt.switch_backend('agg') + + +def display_model( + model_info, + model_faces=None, + with_joints=False, + kintree_table=None, + ax=None, + batch_idx=0, + show=True, + savepath=None): + """ + Displays mesh batch_idx in batch of model_info, model_info as returned by + generate_random_model + """ + if ax is None: + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + verts, joints = model_info['verts'][batch_idx], model_info['joints'][ + batch_idx] + if model_faces is None: + ax.scatter(verts[:, 0], verts[:, 1], verts[:, 2], alpha=0.2) + else: + mesh = Poly3DCollection(verts[model_faces], alpha=0.2) + face_color = (141 / 255, 184 / 255, 226 / 255) + edge_color = (50 / 255, 50 / 255, 50 / 255) + mesh.set_edgecolor(edge_color) + mesh.set_facecolor(face_color) + ax.add_collection3d(mesh) + if with_joints: + draw_skeleton(joints, kintree_table=kintree_table, ax=ax) + ax.set_xlabel('X') + ax.set_ylabel('Y') + ax.set_zlabel('Z') + ax.set_xlim(-0.7, 0.7) + ax.set_ylim(-0.7, 0.7) + ax.set_zlim(-0.7, 0.7) + ax.view_init(azim=-90, elev=100) + fig.subplots_adjust(left=0, right=1, bottom=0, top=1) + if savepath: + plt.savefig(savepath, bbox_inches='tight', pad_inches=0) + if show: + plt.show() + return ax + + +def draw_skeleton(joints3D, kintree_table, ax=None): + if ax is None: + fig = plt.figure(frameon=False) + ax = fig.add_subplot(111, projection='3d') + else: + ax = ax + + colors = [] + left_right_mid = ['r', 'g', 'b'] + kintree_colors = [2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 0, 1, 0, 1, 0, 1] + for c in kintree_colors: + colors += left_right_mid[c] + # For each 24 joint + for i in range(1, kintree_table.shape[1]): + j1 = kintree_table[0][i] + j2 = kintree_table[1][i] + ax.plot([joints3D[j1, 0], joints3D[j2, 0]], + [joints3D[j1, 1], joints3D[j2, 1]], + [joints3D[j1, 2], joints3D[j2, 2]], + color=colors[i], linestyle='-', linewidth=2, marker='o', markersize=5) + return ax diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..92378e0 --- /dev/null +++ b/environment.yml @@ -0,0 +1,10 @@ +name: smplpytorch + +dependencies: + - opencv + - python=3.7 + - matplotlib + - numpy + - pytorch + - pip: + - git+https://github.com/hassony2/chumpy.git diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..3adc8ff8130d2dda8bc887bc6f42f26de79eb9ff GIT binary patch literal 106808 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, x, y, z) + Returns: + Rotation matrix corresponding to the quaternion -- size = [batch_size, 3, 3] + """ + norm_quat = quat + norm_quat = norm_quat / norm_quat.norm(p=2, dim=1, keepdim=True) + w, x, y, z = norm_quat[:, 0], norm_quat[:, 1], norm_quat[:, + 2], norm_quat[:, + 3] + + batch_size = quat.size(0) + + w2, x2, y2, z2 = w.pow(2), x.pow(2), y.pow(2), z.pow(2) + wx, wy, wz = w * x, w * y, w * z + xy, xz, yz = x * y, x * z, y * z + + rotMat = torch.stack([ + w2 + x2 - y2 - z2, 2 * xy - 2 * wz, 2 * wy + 2 * xz, 2 * wz + 2 * xy, + w2 - x2 + y2 - z2, 2 * yz - 2 * wx, 2 * xz - 2 * wy, 2 * wx + 2 * yz, + w2 - x2 - y2 + z2 + ], + dim=1).view(batch_size, 3, 3) + return rotMat + + +def batch_rodrigues(axisang): + #axisang N x 3 + axisang_norm = torch.norm(axisang + 1e-8, p=2, dim=1) + angle = torch.unsqueeze(axisang_norm, -1) + axisang_normalized = torch.div(axisang, angle) + angle = angle * 0.5 + v_cos = torch.cos(angle) + v_sin = torch.sin(angle) + quat = torch.cat([v_cos, v_sin * axisang_normalized], dim=1) + rot_mat = quat2mat(quat) + rot_mat = rot_mat.view(rot_mat.shape[0], 9) + return rot_mat + + +def th_get_axis_angle(vector): + angle = torch.norm(vector, 2, 1) + axes = vector / angle.unsqueeze(1) + return axes, angle + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--batch_size', default=1, type=int) + parser.add_argument('--cuda', action='store_true') + args = parser.parse_args() + + n_components = 6 + rot = 3 + inputs = torch.rand(args.batch_size, rot) + inputs_var = Variable(inputs.double(), requires_grad=True) + if args.cuda: + inputs = inputs.cuda() + # outputs = batch_rodrigues(inputs) + test_function = gradcheck(batch_rodrigues, (inputs_var, )) + print('batch test passed !') + + inputs = torch.rand(rot) + inputs_var = Variable(inputs.double(), requires_grad=True) + test_function = gradcheck(th_cv2_rod_sub_id.apply, (inputs_var, )) + print('th_cv2_rod test passed') + + inputs = torch.rand(rot) + inputs_var = Variable(inputs.double(), requires_grad=True) + test_th = gradcheck(th_cv2_rod.apply, (inputs_var, )) + print('th_cv2_rod_id test passed !') diff --git a/smpl/pytorch/smpl_layer.py b/smpl/pytorch/smpl_layer.py new file mode 100644 index 0000000..9ab4cb3 --- /dev/null +++ b/smpl/pytorch/smpl_layer.py @@ -0,0 +1,152 @@ +import os + +import numpy as np +import torch +from torch.nn import Module + +from smpl.native.webuser.serialization import ready_arguments +from smpl.pytorch import rodrigues_layer +from smpl.pytorch.tensutils import (th_posemap_axisang, th_with_zeros, th_pack, make_list) + + +class SMPL_Layer(Module): + __constants__ = ['kintree_parents', 'gender', 'center_idx', 'num_joints'] + + def __init__(self, + center_idx=None, + gender='neutral', + model_root='smpl/native/models'): + """ + Args: + center_idx: index of center joint in our computations, + model_root: path to pkl files for the model + gender: 'neutral' (default) or 'female' or 'male' + """ + super().__init__() + + self.center_idx = center_idx + self.gender = gender + + if gender == 'neutral': + self.model_path = os.path.join(model_root, 'basicModel_neutral_lbs_10_207_0_v1.0.0.pkl') + elif gender == 'female': + self.model_path = os.path.join(model_root, 'basicModel_f_lbs_10_207_0_v1.0.0.pkl') + elif gender == 'male': + self.model_path = os.path.join(model_root, 'basicModel_m_lbs_10_207_0_v1.0.0.pkl') + + smpl_data = ready_arguments(self.model_path) + self.smpl_data = smpl_data + + self.register_buffer('th_betas', + torch.Tensor(smpl_data['betas'].r).unsqueeze(0)) + self.register_buffer('th_shapedirs', + torch.Tensor(smpl_data['shapedirs'].r)) + self.register_buffer('th_posedirs', + torch.Tensor(smpl_data['posedirs'].r)) + self.register_buffer( + 'th_v_template', + torch.Tensor(smpl_data['v_template'].r).unsqueeze(0)) + self.register_buffer( + 'th_J_regressor', + torch.Tensor(np.array(smpl_data['J_regressor'].toarray()))) + self.register_buffer('th_weights', + torch.Tensor(smpl_data['weights'].r)) + self.register_buffer('th_faces', + torch.Tensor(smpl_data['f'].astype(np.int32)).long()) + + # Kinematic chain params + self.kintree_table = smpl_data['kintree_table'] + parents = list(self.kintree_table[0].tolist()) + self.kintree_parents = parents + self.num_joints = len(parents) # 24 + + def forward(self, + th_pose_coeffs, + th_betas=torch.zeros(1), + th_trans=torch.zeros(1)): + """ + Args: + th_betas (Tensor (batch_size x 10)): if provided, uses given shape parameters + th_trans (Tensor (batch_size x 3)): if provided, applies trans to joints and vertices + """ + + batch_size = th_pose_coeffs.shape[0] + th_pose_map, th_rot_map = th_posemap_axisang(th_pose_coeffs) + th_pose_coeffs = th_pose_coeffs.view(batch_size, -1, 3) + root_rot = rodrigues_layer.batch_rodrigues( + th_pose_coeffs[:, 0]).view(batch_size, 3, 3) + + if th_betas is None or bool(torch.norm(th_betas) == 0): + th_v_shaped = torch.matmul(self.th_shapedirs, + self.th_betas.transpose(1, 0)).permute( + 2, 0, 1) + self.th_v_template + th_j = torch.matmul(self.th_J_regressor, th_v_shaped).repeat( + batch_size, 1, 1) + else: + th_v_shaped = torch.matmul(self.th_shapedirs, + th_betas.transpose(1, 0)).permute( + 2, 0, 1) + self.th_v_template + th_j = torch.matmul(self.th_J_regressor, th_v_shaped) + + th_v_posed = th_v_shaped + torch.matmul( + self.th_posedirs, th_pose_map.transpose(0, 1)).permute(2, 0, 1) + # Final T pose with transformation done ! + + # Global rigid transformation + th_results = [] + + root_j = th_j[:, 0, :].contiguous().view(batch_size, 3, 1) + th_results.append(th_with_zeros(torch.cat([root_rot, root_j], 2))) + + # Rotate each part + for i in range(self.num_joints - 1): + i_val = int(i + 1) + joint_rot = th_rot_map[:, (i_val - 1) * 9:i_val * + 9].contiguous().view(batch_size, 3, 3) + joint_j = th_j[:, i_val, :].contiguous().view(batch_size, 3, 1) + parent = make_list(self.kintree_parents)[i_val] + parent_j = th_j[:, parent, :].contiguous().view(batch_size, 3, 1) + joint_rel_transform = th_with_zeros( + torch.cat([joint_rot, joint_j - parent_j], 2)) + th_results.append( + torch.matmul(th_results[parent], joint_rel_transform)) + th_results_global = th_results + + th_results2 = torch.zeros((batch_size, 4, 4, self.num_joints), + dtype=root_j.dtype, + device=root_j.device) + + for i in range(self.num_joints): + padd_zero = torch.zeros(1, dtype=th_j.dtype, device=th_j.device) + joint_j = torch.cat( + [th_j[:, i], + padd_zero.view(1, 1).repeat(batch_size, 1)], 1) + tmp = torch.bmm(th_results[i], joint_j.unsqueeze(2)) + th_results2[:, :, :, i] = th_results[i] - th_pack(tmp) + + th_T = torch.matmul(th_results2, self.th_weights.transpose(0, 1)) + + th_rest_shape_h = torch.cat([ + th_v_posed.transpose(2, 1), + torch.ones((batch_size, 1, th_v_posed.shape[1]), + dtype=th_T.dtype, + device=th_T.device), + ], 1) + + th_verts = (th_T * th_rest_shape_h.unsqueeze(1)).sum(2).transpose(2, 1) + th_verts = th_verts[:, :, :3] + th_jtr = torch.stack(th_results_global, dim=1)[:, :, :3, 3] + + if th_trans is None or bool(torch.norm(th_trans) == 0): + if self.center_idx is not None: + center_joint = th_jtr[:, self.center_idx].unsqueeze(1) + th_jtr = th_jtr - center_joint + th_verts = th_verts - center_joint + else: + th_jtr = th_jtr + th_trans.unsqueeze(1) + th_verts = th_verts + th_trans.unsqueeze(1) + + # Scale to milimeters + # th_verts = th_verts * 1000 + # th_jtr = th_jtr * 1000 + return th_verts, th_jtr diff --git a/smpl/pytorch/tensutils.py b/smpl/pytorch/tensutils.py new file mode 100644 index 0000000..5d07bbc --- /dev/null +++ b/smpl/pytorch/tensutils.py @@ -0,0 +1,52 @@ +import torch + +from smpl.pytorch import rodrigues_layer + + +def th_posemap_axisang(pose_vectors): + rot_nb = int(pose_vectors.shape[1] / 3) + rot_mats = [] + for joint_idx in range(rot_nb - 1): + joint_idx_val = joint_idx + 1 + axis_ang = pose_vectors[:, joint_idx_val * 3:(joint_idx_val + 1) * 3] + rot_mat = rodrigues_layer.batch_rodrigues(axis_ang) + rot_mats.append(rot_mat) + + # rot_mats = torch.stack(rot_mats, 1).view(-1, 15 *9) + rot_mats = torch.cat(rot_mats, 1) + pose_maps = subtract_flat_id(rot_mats) + return pose_maps, rot_mats + + +def th_with_zeros(tensor): + batch_size = tensor.shape[0] + padding = tensor.new([0.0, 0.0, 0.0, 1.0]) + padding.requires_grad = False + + concat_list = [tensor, padding.view(1, 1, 4).repeat(batch_size, 1, 1)] + cat_res = torch.cat(concat_list, 1) + return cat_res + + +def th_pack(tensor): + batch_size = tensor.shape[0] + padding = tensor.new_zeros((batch_size, 4, 3)) + padding.requires_grad = False + pack_list = [padding, tensor] + pack_res = torch.cat(pack_list, 2) + return pack_res + + +def subtract_flat_id(rot_mats): + # Subtracts identity as a flattened tensor + id_flat = torch.eye( + 3, dtype=rot_mats.dtype, device=rot_mats.device).view(1, 9).repeat( + rot_mats.shape[0], 23) + # id_flat.requires_grad = False + results = rot_mats - id_flat + return results + + +def make_list(tensor): + # type: (List[int]) -> List[int] + return tensor