{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/three-d-safari-learning-to-estimate-zebra","title":"Three-D Safari: Learning to Estimate Zebra Pose, Shape, and Texture from Images \"In the Wild\"","arxiv_id":"1908.07201","date":"2019-08-20","proceeding":"ICCV 2019 10","authors":["Silvia Zuffi","Angjoo Kanazawa","Tanya Berger-Wolf","Michael J. Black"],"abstract":"We present the first method to perform automatic 3D pose, shape and texture capture of animals from images acquired in-the-wild. In particular, we focus on the problem of capturing 3D information about Grevy's zebras from a collection of images. The Grevy's zebra is one of the most endangered species in Africa, with only a few thousand individuals left. Capturing the shape and pose of these animals can provide biologists and conservationists with information about animal health and behavior. In contrast to research on human pose, shape and texture estimation, training data for endangered species is limited, the animals are in complex natural scenes with occlusion, they are naturally camouflaged, travel in herds, and look similar to each other. To overcome these challenges, we integrate the recent SMAL animal model into a network-based regression pipeline, which we train end-to-end on synthetically generated images with pose, shape, and background variation. Going beyond state-of-the-art methods for human shape and pose estimation, our method learns a shape space for zebras during training. Learning such a shape space from images using only a photometric loss is novel, and the approach can be used to learn shape in other settings with limited 3D supervision. Moreover, we couple 3D pose and shape prediction with the task of texture synthesis, obtaining a full texture map of the animal from a single image. We show that the predicted texture map allows a novel per-instance unsupervised optimization over the network features. This method, SMALST (SMAL with learned Shape and Texture) goes beyond previous work, which assumed manual keypoints and/or segmentation, to regress directly from pixels to 3D animal shape, pose and texture. Code and data are available at https://github.com/silviazuffi/smalst.","url_abs":"https://arxiv.org/abs/1908.07201v2","url_pdf":"https://arxiv.org/pdf/1908.07201v2.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"three-d-safari-learning-to-estimate-zebra","repo_url":"https://github.com/silviazuffi/smalst","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":0,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"pose-estimation","task_name":"Pose Estimation"},{"task_slug":"texture-synthesis","task_name":"Texture Synthesis"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=1908.07201","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"1908.07201"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/silviazuffi/smalst","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"unverified":17},"by_repo_kind":{"official":{"samples":17,"ran":0,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"fffc41d90e743fa6","entry":"align_smal_template_to_symmetry_axis","repo":"silviazuffi/smalst","repo_kind":"official","path":"smal_model/smal_basics.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/smal_model/smal_basics.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"fffc41d90e743fa6"}},{"code_sha256_prefix":"4f447281537c79d4","entry":"batch_lrotmin","repo":"silviazuffi/smalst","repo_kind":"official","path":"smal_model/batch_lbs.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/smal_model/batch_lbs.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"4f447281537c79d4"}},{"code_sha256_prefix":"eb25cab46005f07e","entry":"batch_rodrigues","repo":"silviazuffi/smalst","repo_kind":"official","path":"smal_model/batch_lbs.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/smal_model/batch_lbs.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"eb25cab46005f07e"}},{"code_sha256_prefix":"d7418e81eccf569d","entry":"batch_skew","repo":"silviazuffi/smalst","repo_kind":"official","path":"smal_model/batch_lbs.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/smal_model/batch_lbs.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"d7418e81eccf569d"}},{"code_sha256_prefix":"7667d599b9606913","entry":"convert_as","repo":"silviazuffi/smalst","repo_kind":"official","path":"nnutils/nmr.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/nnutils/nmr.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"7667d599b9606913"}},{"code_sha256_prefix":"483c5935ef25b6f6","entry":"fc","repo":"silviazuffi/smalst","repo_kind":"official","path":"nnutils/net_blocks.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/nnutils/net_blocks.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"483c5935ef25b6f6"}},{"code_sha256_prefix":"e59492399c2004d7","entry":"fc_stack","repo":"silviazuffi/smalst","repo_kind":"official","path":"nnutils/net_blocks.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/nnutils/net_blocks.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"e59492399c2004d7"}},{"code_sha256_prefix":"989712660a666ac2","entry":"fc_stack_dropout","repo":"silviazuffi/smalst","repo_kind":"official","path":"nnutils/net_blocks.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/nnutils/net_blocks.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"989712660a666ac2"}},{"code_sha256_prefix":"251a4caf1c684e45","entry":"get_bbox","repo":"silviazuffi/smalst","repo_kind":"official","path":"smal_eval.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/smal_eval.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"251a4caf1c684e45"}},{"code_sha256_prefix":"02bff3f77553f7b4","entry":"mirror_keypoints","repo":"silviazuffi/smalst","repo_kind":"official","path":"smal_eval.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/smal_eval.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"02bff3f77553f7b4"}},{"code_sha256_prefix":"42874ab7b0a7db85","entry":"perspective_proj_withz","repo":"silviazuffi/smalst","repo_kind":"official","path":"nnutils/geom_utils.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/nnutils/geom_utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"42874ab7b0a7db85"}},{"code_sha256_prefix":"8c9b723cddb2255d","entry":"preprocess_image","repo":"silviazuffi/smalst","repo_kind":"official","path":"smal_eval.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/smal_eval.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"8c9b723cddb2255d"}},{"code_sha256_prefix":"cafb397ac53b9cd9","entry":"sample_textures","repo":"silviazuffi/smalst","repo_kind":"official","path":"nnutils/geom_utils.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/nnutils/geom_utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"cafb397ac53b9cd9"}},{"code_sha256_prefix":"742394a7d024dbb9","entry":"texture_dt_loss","repo":"silviazuffi/smalst","repo_kind":"official","path":"nnutils/loss_utils.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/nnutils/loss_utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"742394a7d024dbb9"}},{"code_sha256_prefix":"3036961b6f0ad211","entry":"texture_loss","repo":"silviazuffi/smalst","repo_kind":"official","path":"nnutils/loss_utils.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/nnutils/loss_utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"3036961b6f0ad211"}},{"code_sha256_prefix":"e24744b154d5aa09","entry":"undo_chumpy","repo":"silviazuffi/smalst","repo_kind":"official","path":"smal_model/smal_torch.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/smal_model/smal_torch.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"e24744b154d5aa09"}},{"code_sha256_prefix":"44802711cbcd9f9a","entry":"uv_flow_loss","repo":"silviazuffi/smalst","repo_kind":"official","path":"nnutils/loss_utils.py","file_url":"https://github.com/silviazuffi/smalst/blob/HEAD/nnutils/loss_utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"44802711cbcd9f9a"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}