Papers › Three-D Safari: Learning to Estimate Zebra Pose, Shape, and Texture from Images "In the Wild"

Three-D Safari: Learning to Estimate Zebra Pose, Shape, and Texture from Images "In the Wild"

20 Aug 2019ICCV 2019 10arXiv:1908.07201archive 2025-07-28

Silvia Zuffi, Angjoo Kanazawa, Tanya Berger-Wolf, Michael J. Black

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.

PaperPDFConference PDFCodeCode Syntology ran

In Syntology Open this paper in Syntology's Atlas, the map of the papers in Syntology's graph and their citations.

For agents, Syntology's MCP tool lists every function and class Syntology harvested from this paper and whether it ran (how to connect): get_harvested_code_for_paper(arxiv_id="1908.07201")

Code

Syntology Ran 0 of 17 code samples harvested from 1 repository linked to this paper; 17 have no recorded run.

By repository: official repository: 17 samples from 1 repository, 0 ran. The run record, sample by sample. “Ran” means executed on a synthesized input, not that the code is correct or reproduces the paper.

silviazuffi/smalst officialmentioned in paperpytorchMIT report

Repository list and official/mentioned flags are the archive's, frozen 2025-07-28. Reachability, where shown, is from one Syntology probe window (2026-09-16 to 2026-09-18); repositories not probed show nothing. GitHub stars are not tracked.

Code Syntology ran Syntology

17 samples harvested; 0 ran; 0 honoured the contract we drafted; 17 have no recorded run. Read from Syntology's graph 2026-09-24; that is when this build read the record, not when the samples ran.

17unverified

Licence: 0 of the 17 samples are pointer only, meaning Syntology does not serve that copy's text. This page shows no code text for any sample; each one links to its file in the repository.

Harvested from silviazuffi/smalst. “Ran” means the sample executed on a synthesized input. It does not mean the output is correct, and nothing here reproduces the paper's results. “Honoured” and “violated” refer to a contract Syntology drafted from the code itself; “our draft was wrong” and “fixture could not drive it” are failures of Syntology's instrument, not of the code.

Each sample ends with its code_sha256, Syntology's identity for that exact code. An agent fetches the stored sample with Syntology's MCP tool get_code(code_sha256="…") (how to connect); click an identity to copy that call.

Repository labels, per sample. official repository: The archive marks this repository official for the paper. named in the paper: The archive records that the paper mentions this repository; it is not marked official. community (archive-listed): In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper. found in paper text by Syntology: 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. Samples from a repository marked official are listed first. Licence labels name the repository's licence as recorded at harvest. “Pointer only” means Syntology does not serve that copy's text, for one of four reasons: no licence file was found; the licence was not identified; the licence is recorded as permissive but that copy's record is not marked cleared; or the licence is outside the permissive list Syntology serves text under (MIT, Apache-2.0, BSD and similar). Some licences outside that list permit redistribution, such as WTFPL, and GPL-3.0 under its conditions; they are simply not on the list. Hover a licence label for the reason. File links open the file on GitHub at the default branch, which may have changed since the harvest.

align_smal_template_to_symmetry_axis silviazuffi/smalst/smal_model/smal_basics.py official repository unverified MIT (permissive) · fffc41d90e743fa6 · report
batch_lrotmin silviazuffi/smalst/smal_model/batch_lbs.py official repository unverified MIT (permissive) · 4f447281537c79d4 · report
batch_rodrigues silviazuffi/smalst/smal_model/batch_lbs.py official repository unverified MIT (permissive) · eb25cab46005f07e · report
batch_skew silviazuffi/smalst/smal_model/batch_lbs.py official repository unverified MIT (permissive) · d7418e81eccf569d · report
convert_as silviazuffi/smalst/nnutils/nmr.py official repository unverified MIT (permissive) · 7667d599b9606913 · report
fc silviazuffi/smalst/nnutils/net_blocks.py official repository unverified MIT (permissive) · 483c5935ef25b6f6 · report
fc_stack silviazuffi/smalst/nnutils/net_blocks.py official repository unverified MIT (permissive) · e59492399c2004d7 · report
fc_stack_dropout silviazuffi/smalst/nnutils/net_blocks.py official repository unverified MIT (permissive) · 989712660a666ac2 · report
get_bbox silviazuffi/smalst/smal_eval.py official repository unverified MIT (permissive) · 251a4caf1c684e45 · report
mirror_keypoints silviazuffi/smalst/smal_eval.py official repository unverified MIT (permissive) · 02bff3f77553f7b4 · report
perspective_proj_withz silviazuffi/smalst/nnutils/geom_utils.py official repository unverified MIT (permissive) · 42874ab7b0a7db85 · report
preprocess_image silviazuffi/smalst/smal_eval.py official repository unverified MIT (permissive) · 8c9b723cddb2255d · report
sample_textures silviazuffi/smalst/nnutils/geom_utils.py official repository unverified MIT (permissive) · cafb397ac53b9cd9 · report
texture_dt_loss silviazuffi/smalst/nnutils/loss_utils.py official repository unverified MIT (permissive) · 742394a7d024dbb9 · report
texture_loss silviazuffi/smalst/nnutils/loss_utils.py official repository unverified MIT (permissive) · 3036961b6f0ad211 · report
undo_chumpy silviazuffi/smalst/smal_model/smal_torch.py official repository unverified MIT (permissive) · e24744b154d5aa09 · report
uv_flow_loss silviazuffi/smalst/nnutils/loss_utils.py official repository unverified MIT (permissive) · 44802711cbcd9f9a · report

Tasks

Pose EstimationTexture Synthesis

Results from the paper archive 2025-07-28

No leaderboard rows for this paper in the archive.

Report a problem or propose a change · a person checks every report against the paper or source before anything changes; decisions are listed on /corrections