# UPerNet

## Genel Bakış

UPerNet modeli, Tete Xiao, Yingcheng Liu, Bolei Zhou, Yuning Jiang ve Jian Sun tarafından [Unified Perceptual Parsing for Scene Understanding](https://huggingface.co/papers/1807.10221) makalesinde önerilmiştir. UPerNet, [ConvNeXt](convnext) veya [Swin](swin) gibi herhangi bir görme omurgasını (vision backbone) kullanarak görüntülerden geniş bir kavram yelpazesini etkili bir şekilde segmente etmek için genel bir çerçevedir.

Makalenin özeti aşağıdaki gibidir:

*İnsanlar görsel dünyayı birden fazla düzeyde algılar: sahneleri zahmetsizce sınıflandırır ve içindeki nesneleri tespit ederken, nesnelerin dokularını ve yüzeylerini, bunların farklı yapısal parçalarını da belirler. Bu makalede, makine görü sistemlerinden verilen bir görüntüden olabildiğince çok görsel kavramı tanımasını gerektiren Unified Perceptual Parsing adlı yeni bir görevi inceliyoruz. Heterojen görüntü etiketlerinden öğrenmek için UPerNet adlı çoklu görev bir çerçeve ve bir eğitim stratejisi geliştirilmiştir. Çerçevemizi Unified Perceptual Parsing üzerinde test ettik ve görüntülerden geniş bir kavram yelpazesini etkili bir şekilde segmente edebildiğini gösterdik. Eğitilen ağlar, doğal sahnelerdeki görsel bilgiyi keşfetmek için daha da ileriye taşınmıştır.*

<img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/model_doc/upernet_architecture.jpg"
alt="drawing" width="600"/>

 UPerNet çerçevesi. Orijinal makaleden alınmıştır.

Bu model [nielsr](https://huggingface.co/nielsr) tarafından katkıda bulunmuştur. Orijinal kod, OpenMMLab'ın mmsegmentation projesine dayanmaktadır ve [burada](https://github.com/open-mmlab/mmsegmentation/blob/master/mmseg/models/decode_heads/uper_head.py) bulunabilir.

## Kullanım örnekleri

UPerNet, anlamsal segmentasyon için genel bir çerçevedir. Aşağıdaki gibi herhangi bir görme omurgasıyla kullanılabilir:

```python
from transformers import SwinConfig, UperNetConfig, UperNetForSemanticSegmentation

backbone_config = SwinConfig(out_features=["stage1", "stage2", "stage3", "stage4"])

config = UperNetConfig(backbone_config=backbone_config)
model = UperNetForSemanticSegmentation(config)
```

ConvNeXt gibi başka bir görme omurgası kullanmak için, modeli [ConvNeXt](convnext) ile örneklemeniz yeterlidir:

```python
from transformers import ConvNextConfig, UperNetConfig, UperNetForSemanticSegmentation

backbone_config = ConvNextConfig(out_features=["stage1", "stage2", "stage3", "stage4"])

config = UperNetConfig(backbone_config=backbone_config)
model = UperNetForSemanticSegmentation(config)
```

Bu, modelin tüm ağırlıklarını rastgele başlatacağına dikkat edin.

## Kaynaklar

UPerNet ile başlamanıza yardımcı olmak için resmi Hugging Face ve topluluk (🌎 ile belirtilen) kaynaklarının listesi.

- UPerNet için demo defterleri [burada](https://github.com/NielsRogge/Transformers-Tutorials/tree/master/UPerNet) bulunabilir.
- Bu [defter](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/semantic_segmentation.ipynb) [UperNetForSemanticSegmentation](/docs/transformers/main/tr/model_doc/upernet#transformers.UperNetForSemanticSegmentation) sınıfını destekler.
- Bkz: [Anlamsal segmentasyon görevi kılavuzu](../tasks/semantic_segmentation)

Buraya bir kaynak eklemek isterseniz, lütfen bir Pull Request açmaktan çekinmeyin; inceleyeceğiz! Kaynağın, mevcut bir kaynağı tekrarlamak yerine ideal olarak yeni bir şeyi göstermesi beklenir.

## UperNetConfig[[transformers.UperNetConfig]]

#### transformers.UperNetConfig[[transformers.UperNetConfig]]

```python
transformers.UperNetConfig(transformers_version: str | None = None, architectures: list[str] | None = None, output_hidden_states: bool | None = False, return_dict: bool | None = True, dtype: str | torch.dtype | None = None, chunk_size_feed_forward: int = 0, is_encoder_decoder: bool = False, id2label: dict[int, str] | dict[str, str] | None = None, label2id: dict[str, int] | dict[str, str] | None = None, problem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = None, backbone_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None, hidden_size: int = 512, initializer_range: float = 0.02, pool_scales: list[int] | tuple[int, ...] = (1, 2, 3, 6), use_auxiliary_head: bool = True, auxiliary_loss_weight: float = 0.4, auxiliary_in_channels: int | None = None, auxiliary_channels: int = 256, auxiliary_num_convs: int = 1, auxiliary_concat_input: bool = False, loss_ignore_index: int = 255)
```

[Kaynak](https://github.com/huggingface/transformers/blob/main/src/transformers/models/upernet/configuration_upernet.py#L25)

**Parametreler:**

backbone_config (`Union[dict, ~configuration_utils.PreTrainedConfig]`, *isteğe bağlı*) : Omurga modelinin yapılandırması.

hidden_size (`int`, *isteğe bağlı*, varsayılan `512`) : Gizli temsillerin boyutu.

initializer_range (`float`, *opsiyonel*, varsayılan `0.02`) : Tüm ağırlık matrislerini başlatmak için kullanılan truncated_normal_initializer'ın standart sapması.

pool_scales (`tuple[int]`, *opsiyonel*, varsayılan `[1, 2, 3, 6]`) : Son özellik haritasına uygulanan Pooling Pyramid Module'de kullanılan havuzlama ölçekleri.

use_auxiliary_head (`bool`, *isteğe bağlı*, varsayılan `True`) : Eğitim sırasında yardımcı bir başlık kullanılıp kullanılmayacağı.

auxiliary_loss_weight (`float`, *opsiyonel*, varsayılan 0.4) : Yardımcı başın çapraz entropi kaybının ağırlığı.

auxiliary_in_channels (`int`, *isteğe bağlı*, varsayılan 256) : Yardımcı başlıktaki giriş kanal sayısı.

auxiliary_channels (`int`, *isteğe bağlı*, varsayılan 256) : Yardımcı başlıkta kullanılacak kanal sayısı.

auxiliary_num_convs (`int`, *isteğe bağlı*, varsayılan 1) : Yardımcı başlıkta kullanılacak konvolüsyon katmanlarının sayısı.

auxiliary_concat_input (`bool`, *isteğe bağlı*, varsayılan `False`) : Sınıflandırma katmanından önce yardımcı başlığın çıktısının girdiyle birleştirilip birleştirilmeyeceğini belirtir.

loss_ignore_index (`int`, *isteğe bağlı*, varsayılan 255) : Kayıp fonksiyonu tarafından yoksayılan indeks.

Bu, bir UpernetModel yapılandırmasını depolamak için kullanılan yapılandırma sınıfıdır. Belirtilen argümanlara göre bir Upernet modelini örneklemek ve model mimarisini tanımlamak için kullanılır. Varsayılan değerlerle bir yapılandırma örneği oluşturmak, [openmmlab/upernet-convnext-tiny](https://huggingface.co/openmmlab/upernet-convnext-tiny) modelinin yapılandırmasına benzer bir yapılandırma üretir.

Yapılandırma nesneleri [PreTrainedConfig](/docs/transformers/main/tr/main_classes/configuration#transformers.PreTrainedConfig) sınıfından türetilir ve model çıktılarını kontrol etmek için kullanılabilir. Daha fazla bilgi için [PreTrainedConfig](/docs/transformers/main/tr/main_classes/configuration#transformers.PreTrainedConfig) belgesini okuyun.

Örnekler:

```python
>>> from transformers import UperNetConfig, UperNetForSemanticSegmentation

>>> # Initializing a configuration
>>> configuration = UperNetConfig()

>>> # Initializing a model (with random weights) from the configuration
>>> model = UperNetForSemanticSegmentation(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config
```

## UperNetForSemanticSegmentation[[transformers.UperNetForSemanticSegmentation]]

#### transformers.UperNetForSemanticSegmentation[[transformers.UperNetForSemanticSegmentation]]

```python
transformers.UperNetForSemanticSegmentation(config: UperNetConfig)
```

[Kaynak](https://github.com/huggingface/transformers/blob/main/src/transformers/models/upernet/modeling_upernet.py#L278)

**Parametreler:**

config ([UperNetConfig](/docs/transformers/main/tr/model_doc/upernet#transformers.UperNetConfig)) : Modelin tüm parametrelerini içeren model yapılandırma sınıfı. Bir yapılandırma dosyasıyla başlatmak, modelle ilişkili ağırlıkları yüklemez, yalnızca yapılandırmayı yükler. Model ağırlıklarını yüklemek için [from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.from_pretrained) yöntemine göz atın.

ADE20k, CityScapes gibi veri setleri için herhangi bir görü omurgasını kullanan UperNet çerçevesi.

Bu model [PreTrainedModel](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel) sınıfından devralır. Kütüphanenin tüm modelleri için uyguladığı genel yöntemler (indirme veya kaydetme, giriş gömme boyutlarını yeniden ayarlama, başları budama vb.) için üst sınıf belgelendirmesine bakın.

Bu model aynı zamanda bir PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) alt sınıfıdır. Bunu standart bir PyTorch Module olarak kullanın ve genel kullanım ve davranışla ilgili tüm konular için PyTorch dokümantasyonuna başvurun.

#### forward[[transformers.UperNetForSemanticSegmentation.forward]]

```python
forward(pixel_values: typing.Optional[torch.Tensor] = None, output_attentions: bool | None = None, output_hidden_states: bool | None = None, labels: typing.Optional[torch.Tensor] = None, return_dict: bool | None = None, **kwargs)
```

[Kaynak](https://github.com/huggingface/transformers/blob/main/src/transformers/models/upernet/modeling_upernet.py#L293)

**Parametreler:**

pixel_values (`torch.Tensor`, şekli `(batch_size, num_channels, image_size, image_size)`, *isteğe bağlı*) : Girdi görüntülerine karşılık gelen tensörler. Piksel değerleri [SegformerImageProcessor](/docs/transformers/main/tr/model_doc/segformer#transformers.SegformerImageProcessor) kullanılarak elde edilebilir. Ayrıntılar için [SegformerImageProcessor.__call__()](/docs/transformers/main/tr/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) bölümüne bakın (`processor_class`, görüntüleri işlemek için [SegformerImageProcessor](/docs/transformers/main/tr/model_doc/segformer#transformers.SegformerImageProcessor) kullanır).

output_attentions (`bool`, *isteğe bağlı*) : Tüm dikkat katmanlarının dikkat tensörlerinin döndürülüp döndürülmediğini belirtir. Daha fazla ayrıntı için döndürülen tensörler altındaki `attentions` bölümüne bakın.

output_hidden_states (`bool`, *isteğe bağlı*) : Tüm katmanların gizli durumlarının (hidden states) döndürülüp döndürülmeyeceğini belirtir. Daha fazla ayrıntı için döndürülen tensörler altındaki `hidden_states` bölümüne bakın.

labels (`torch.LongTensor`, şekli `(batch_size, height, width)`, *isteğe bağlı*) : Kayıp hesabı için kullanılan gerçeklik semantik segmentasyon haritaları. İndisler `[0, ..., config.num_labels - 1]` aralığında olmalıdır. `config.num_labels > 1` ise bir sınıflandırma kaybı hesaplanır (Cross-Entropy).

return_dict (`bool`, *isteğe bağlı*) : Düz bir tuple yerine [ModelOutput](/docs/transformers/main/tr/main_classes/output#transformers.utils.ModelOutput) döndürülecek mi?

**Dönüş:** [SemanticSegmenterOutput](/docs/transformers/main/tr/main_classes/output#transformers.modeling_outputs.SemanticSegmenterOutput) veya `tuple(torch.Tensor)`

[SemanticSegmenterOutput](/docs/transformers/main/tr/main_classes/output#transformers.modeling_outputs.SemanticSegmenterOutput) veya bir `torch.Tensor` demeti (eğer `return_dict=False` geçirildiyse veya `config.return_dict=False` ise), yapılandırma ([UperNetConfig](/docs/transformers/main/tr/model_doc/upernet#transformers.UperNetConfig)) ve girdilere bağlı olarak çeşitli öğelerden oluşur.

[UperNetForSemanticSegmentation](/docs/transformers/main/tr/model_doc/upernet#transformers.UperNetForSemanticSegmentation) forward metodu, `__call__` özel metodunu geçersiz kılar.

İleri geçiş tarifi bu fonksiyon içinde tanımlanmalı olsa da, sonrasında bunun yerine `Module` örneğini çağırmak gerekir; çünkü ilki ön ve son işleme adımlarını çalıştırmaktan sorumluyken ikincisi bunları sessizce yok sayar.

- **loss** (`torch.Tensor`, şekli `(1,)`, *isteğe bağlı*, `labels` sağlandığında döndürülür) -- Sınıflandırma (config.num_labels==1 ise regresyon) kaybı.
- **logits** (`torch.Tensor`, şekli `(batch_size, config.num_labels, logits_height, logits_width)`) -- Her piksel için sınıflandırma puanları.

  

  Döndürülen logits değerlerinin boyutu, girdi olarak geçirilen `pixel_values` ile aynı olmak zorunda değildir. Bu, bir kullanıcının logits değerlerini son işlem olarak orijinal görüntü boyutuna yeniden boyutlandırdığında iki kez interpolasyon yapılarak bazı kalite kayıpları yaşanmasını önlemek içindir. Logits şeklinizi her zaman kontrol etmeli ve gerektiğinde yeniden boyutlandırmalısınız.

  
- **hidden_states** (`tuple(torch.Tensor)`, *isteğe bağlı*, `output_hidden_states=True` geçirildiğinde veya `config.output_hidden_states=True` olduğunda döndürülür) -- `torch.Tensor` (gömme katmanı varsa gömme katmanının çıktısı için bir tane + her katmanın çıktısı için bir tane) içeren, `(batch_size, patch_size, hidden_size)` biçiminde bir demet.

  Her katmanın çıktısında modelin gizli durumları ve isteğe bağlı başlangıç gömme çıktıları.
- **attentions** (`tuple(torch.Tensor)`, *isteğe bağlı*, `output_attentions=True` geçirildiğinde veya `config.output_attentions=True` olduğunda döndürülür) -- `torch.Tensor` (her katman için bir tane) içeren bir tuple, şekli `(batch_size, num_heads, patch_size, sequence_length)`.

  Dikkat softmax'ı sonrası dikkat ağırlıkları, öz-dikkat kafalarında ağırlıklı ortalamanın hesaplanmasında kullanılır.

Örnekler:
```python
>>> from transformers import AutoImageProcessor, UperNetForSemanticSegmentation
>>> from PIL import Image
>>> from huggingface_hub import hf_hub_download

>>> image_processor = AutoImageProcessor.from_pretrained("openmmlab/upernet-convnext-tiny")
>>> model = UperNetForSemanticSegmentation.from_pretrained("openmmlab/upernet-convnext-tiny")

>>> filepath = hf_hub_download(
...     repo_id="hf-internal-testing/fixtures_ade20k", filename="ADE_val_00000001.jpg", repo_type="dataset"
... )
>>> image = Image.open(filepath).convert("RGB")

>>> inputs = image_processor(images=image, return_tensors="pt")

>>> outputs = model(**inputs)

>>> logits = outputs.logits  # shape (batch_size, num_labels, height, width)
>>> list(logits.shape)
[1, 150, 512, 512]
```

