Ver como markdown

Estimativa de profundidade

A estimativa de profundidade prevê a que distância cada pixel está da câmera usando uma única imagem. O LibreYOLO expõe isso como a tarefa depth, que devolve um mapa denso de profundidade inversa relativa sobre o canvas da imagem original.

Definição

A tarefa depth prevê um valor por pixel a partir de uma única imagem RGB. O LibreYOLO define esse valor como profundidade inversa relativa: maior significa mais perto da câmera, e os números não carregam unidade métrica nem uma escala que se mantenha entre duas imagens. Comparar a profundidade entre dois pixels da mesma predição faz sentido; comparar um valor com o valor de outra imagem, não.

Uma predição preenche result.depth_map, um payload DepthMap que guarda um array (H, W) sobre o canvas da imagem original. .min, .max e .mean leem os valores finitos, e .normalized() reescala o mapa para [0, 1] para exibição. result.boxes fica vazio, então conf, iou e max_det não têm efeito, e save=True grava uma imagem do mapa com mapa de cores aplicado, em vez de uma foto anotada.

Modelos

Seis famílias atendem depth.

Depth Anything V2 combina um encoder DINOv2 com um decoder DPT e é a opção padrão de uso geral aqui. O licenciamento decide o tamanho tanto quanto a acurácia: o checkpoint Small é Apache-2.0, enquanto Base e Large são de uso não comercial, então confira a tabela de checkpoints na página dele antes de escolher um.

Depth Anything 3 porta o checkpoint DA3MONO-LARGE, um transformer comum, sem nenhuma especialização arquitetural para profundidade.

ZipDepth é o nível compacto: uma CNN reparametrizável destilada do Depth Anything V2 Large, com um segundo checkpoint cujo decoder evita operações de gather e unfold para compiladores de NPU que não as têm.

MiDaS é a linha de trabalho que estabeleceu o protocolo de profundidade relativa zero-shot com que as outras famílias são medidas. É a única família de profundidade que o LibreYOLO não republica: pedir um checkpoint baixa o asset oficial do release do GitHub dos autores e confere um SHA-256 fixado.

LibreMODUS chega à profundidade como um dos alvos de um modelo any-to-any, e não como uma cabeça dedicada. Precisa do extra modus e da sua própria conta autenticada no Hugging Face, e não oferece nem val() nem export().

SenseNova-Vision gera o mapa de profundidade como uma imagem por meio de um decode por difusão, a partir do mesmo checkpoint de 7B que atende suas outras seis tarefas. Precisa do extra sensenova, e seus pesos são restritos a uso não comercial; a licença está na página dele.

Predição

Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache localmente, exceto nas duas famílias citadas acima.

Prever um mapa de profundidade
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")result = model(SAMPLE_IMAGE, save=True) depth = result.depth_mapprint(depth.data.shape)              # (H, W) no canvas originalprint(depth.min, depth.max, depth.mean)
Trabalhar com os valores
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")result = model(SAMPLE_IMAGE) depth = result.depth_mapraw = depth.data          # maior é mais perto; sem unidade métrica, sem escalagray = depth.normalized() # reescalado para [0, 1] para visualizaçãoprint(raw.shape, float(gray.max()))
Uma alternativa compacta
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Mesmo contrato de tarefa, uma rede bem menor feita para runtimes de borda (edge).model = LibreYOLO("LibreZipDepthb-depth.pt")result = model(SAMPLE_IMAGE) print(result.depth_map.data.shape)

A resolução de entrada é limitada por família. Depth Anything V2 e Depth Anything 3 se apoiam em uma grade de patches DINOv2, então imgsz precisa ser divisível por 14, o que o LibreYOLO confere antes de rodar. Results.plot() não cobre esta tarefa; está definido apenas para normais de superfície e bordas. Veja predição para fontes, streaming e tratamento de resultados.

Formato do dataset

A validação de profundidade emparelha cada imagem com um mapa de profundidade denso de canal único e mesma resolução, encontrado ao substituir o diretório de profundidade no caminho da imagem.

dataset/
  data.yaml
  images/
    val/room.jpg
  depths/
    val/room.png
yaml
path: dataset
val: images/val
depths_dir: depths
nc: 1
names: {0: depth}

Os mapas são PNG ou TIF de canal único, ou .npy. Os valores são profundidade pura em uma unidade que o dataset mantém consistente, e pixels 0, negativos, NaN e infinitos marcam amostras inválidas, que ficam de fora das métricas. Mapas inteiros são divididos por depth_scale, cujo padrão é 256.0, a convenção dos PNG de 16 bits; mapas .npy em ponto flutuante são usados como estão. depth_stem_suffix e depth_mask_suffix cobrem datasets que nomeiam de outro jeito seus arquivos de profundidade ou suas máscaras de validade. Veja formatos de dataset para o contrato completo.

Treinamento

Nenhuma família de profundidade no LibreYOLO tem implementação de treinamento: train() levanta NotImplementedError nas seis. A página de cada modelo indica o script de conversão que transforma um checkpoint treinado upstream em um que o LibreYOLO consegue carregar.

Validação

val() roda o validador de profundidade compartilhado. A profundidade relativa não tem escala absoluta, então cada predição é primeiro ajustada ao inverso do seu ground truth com uma escala e um deslocamento de mínimos quadrados calculados por imagem, e depois invertida de volta para profundidade. Todas as métricas abaixo são calculadas por imagem sobre esse mapa alinhado, com média sobre o dataset, contando apenas os pixels que o dataset marca como válidos.

Validar e ler as chaves das métricas
from libreyolo import LibreYOLO model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/abs_rel"])print(metrics["metrics/rmse"])print(metrics["metrics/delta1"])   # fitnessprint(metrics["metrics/delta2"], metrics["metrics/delta3"])

metrics/abs_rel é o erro relativo absoluto médio, o resíduo dividido pela profundidade do ground truth, e quanto menor, melhor. metrics/rmse é a raiz do erro quadrático médio na própria unidade de profundidade do dataset, também quanto menor, melhor. metrics/delta1, metrics/delta2 e metrics/delta3 são as acurácias por limiar: a fração de pixels válidos cuja razão em relação ao ground truth, tomada na direção que for maior, fica abaixo de 1.25, de 1.25 ao quadrado e de 1.25 ao cubo, então quanto maior, melhor. metrics/delta1 também é o fitness, o número que a seleção do melhor checkpoint lê.

Exportação

Um modelo de profundidade exportado é carregado de volta por LibreYOLO() pelo sufixo do arquivo, então um arquivo .onnx ou .engine se comporta como um checkpoint e devolve o mesmo Results, com depth_map no lugar dos boxes.

Exportar
from libreyolo import LibreYOLO model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")model.export(format="onnx")
Rodar o arquivo exportado
from libreyolo import LibreYOLO, SAMPLE_IMAGE # A factory decide pelo sufixo do arquivo, então um artefato exportado# carrega como qualquer checkpoint e devolve o mesmo objeto Results.model = LibreYOLO("LibreDepthAnythingV2s-depth.onnx")result = model(SAMPLE_IMAGE) print(result.depth_map.data.shape)

A cobertura varia por família, e o Depth Anything 3 rejeita qualquer formato fora do seu conjunto validado em vez de tentar uma conversão não validada. Confira a página do modelo e a matriz completa de exportação antes de se comprometer com um alvo. LibreMODUS e SenseNova-Vision não exportam de jeito nenhum. Exportação lista os argumentos que cada formato aceita.

Verificado com o LibreYOLO v1.5.0.