Key points
- TransUNet packages transformer attention into two separate, swappable modules, a Transformer Encoder for global context and a Transformer Decoder that reframes segmentation as a mask classification problem using learnable queries.
- Across four medical imaging tasks the team found a consistent pattern, the encoder module helps most with multi organ segmentation, while the decoder module helps most with small targets like tumors.
- The full architecture beat the strong nnU-Net baseline by 1.06 percent average Dice on multi organ segmentation and by 4.30 percent on pancreatic tumor segmentation, and it surpassed the top ranked solution from the BraTS2021 brain tumor challenge.
- On small pancreatic tumors under 20 millimeters, historically one of the hardest targets in abdominal imaging, the decoder equipped model improved detection by 9.7 percent Dice over nnU-Net.
- The team released both 2D and 3D code publicly, and the paper is unusually transparent about parameter counts and compute cost alongside accuracy, rather than reporting accuracy alone.
Why plain U-Net starts to struggle
U-Net has been the default architecture for medical image segmentation for close to a decade, built around a symmetric encoder decoder shape with skip connections that let fine detail from early layers reach the final output. It works because convolutions are excellent at picking up local texture and edges. That same local focus is also U-Net’s weak spot. A convolution kernel only ever looks at a small neighborhood of pixels at a time, so understanding relationships between distant parts of an image, how the pancreas sits relative to the spleen, or how a tumor’s boundary relates to surrounding tissue several centimeters away, requires stacking many layers just to build up enough receptive field. That indirection costs both accuracy and efficiency, and it becomes a real liability when patient anatomy varies a lot in texture, shape, and size, which describes most abdominal imaging.
Transformers, originally built for language processing, sidestep this by computing attention between every pair of positions in a sequence at once, no matter how far apart they are. Vision Transformer showed this could work directly on image patches, but a pure transformer discards the fine spatial resolution that made convolutions useful for segmentation in the first place. The obvious fix is to combine the two, let convolutions handle local detail and let a transformer handle the long range relationships, and TransUNet was one of the earliest architectures to actually build that combination for medical images back in 2021. This new paper is not a new architecture so much as a much deeper investigation of that original idea, asking specifically where inside a U-Net a transformer earns its keep.
Two separate transformer modules, two separate jobs
The paper’s central architectural move is splitting transformer attention into two independent, optional modules rather than treating transformer integration as one monolithic choice.
The Transformer Encoder, reading the whole scene at once
The encoder module takes the feature map produced by a CNN backbone, breaks it into flattened three dimensional patches, and projects each patch into an embedding space with a learned position added on, following the same tokenization recipe Vision Transformer popularized for 2D images. Standard transformer layers, alternating multi head self attention and a small feedforward network, then let every patch attend to every other patch, building genuinely global context before the features get handed back to a CNN decoder for the actual pixel level reconstruction. The intuition is straightforward, this module should be good at understanding how different anatomical structures relate to each other across an entire scan, which matters a great deal when segmenting eight or nine separate abdominal organs that all interact spatially.
The Transformer Decoder, treating segmentation as a matching problem
The decoder module is the more unusual piece, and it borrows an idea from object detection rather than from prior segmentation work. Instead of classifying every pixel independently the way U-Net normally does, the decoder introduces a set of learnable organ queries, essentially a fixed number of feature vectors, each one meant to eventually claim ownership of one region in the final segmentation. The paper deliberately sets the number of queries higher than the actual number of classes, reasoning that extra unclaimed queries reduce the risk of missing a genuine region entirely, a lesson borrowed from similar query based detection work.
These queries start from a coarse prediction, computed as a simple dot product against the network’s deepest CNN feature map, and then get refined layer by layer through cross attention against multi scale CNN features pulled from progressively higher resolution stages of the decoder. Each round of refinement lets a query pull in more localized detail from the corresponding CNN features, gradually sharpening a rough initial guess into a precise mask.
Coarse to fine attention, ignoring irrelevant background early
The paper adds one further refinement on top of ordinary cross attention, something it calls coarse to fine attention. At each refinement step, the cross attention calculation is masked so that a query can only attend to the region its own previous, coarser prediction identified as foreground, everything outside that region gets effectively zeroed out of the attention computation entirely.
The practical effect is that later, more detailed refinement stages stop wasting attention capacity scanning obviously irrelevant background pixels and instead spend that capacity sharpening the boundary of a region that has already been roughly located. This matters most for small targets, a tumor a few millimeters across sitting inside a large organ is exactly the kind of case where unconstrained attention could get diluted across a huge amount of irrelevant tissue.
Three configurations, tested against a clear hypothesis
Because the encoder and decoder modules are both optional and independent, the team could cleanly test three combinations, Encoder-only, Decoder-only, and Encoder+Decoder together, and compare each against a plain nnU-Net baseline with no transformer at all. Their working hypothesis going in was specific, the encoder should help most where a task depends on understanding relationships between several distinct structures across a whole scan, multi organ segmentation being the clearest example, while the decoder’s coarse to fine, query based refinement should help most on small, hard to localize targets like tumors. Testing that hypothesis cleanly required evaluating across genuinely different task types rather than one dataset, which is where the paper’s four benchmark choices come in.
Four datasets, four different segmentation challenges
The BTCV multi organ dataset, drawn from the MICCAI 2015 Multi Atlas Abdomen Labeling Challenge, contains 30 abdominal CT scans and asks a model to segment eight separate organs at once, aorta, gallbladder, spleen, both kidneys, liver, pancreas, and stomach, a genuinely multi structure task. The BraTS2021 challenge, the largest brain tumor segmentation benchmark available, contains 1251 multi parametric MRI scans across four imaging contrasts and asks for three overlapping tumor sub region labels. The Medical Segmentation Decathlon HepaticVessel task uses 443 CT scans to segment both liver vessels and liver tumors, chosen specifically because vessels are thin, tubular, and sit right next to heterogeneous tumor tissue, a genuinely hard small target problem. Finally, the team’s own large scale pancreatic mass dataset, 2930 venous phase CT scans from a high volume United States hospital, is one of the largest pancreatic tumor CT collections assembled anywhere, and it targets pancreatic ductal adenocarcinoma specifically, the most common and most lethal form of pancreatic cancer, with roughly a ten percent five year survival rate, alongside pancreatic cysts.
What the results actually show
The encoder versus decoder hypothesis held up cleanly across every dataset tested. On the BTCV multi organ benchmark, the twelve layer Transformer Encoder, initialized with weights pretrained on ImageNet21k, delivered the strongest single module improvement, pushing average Dice from a plain nnU-Net baseline of 87.33 percent up to 88.11 percent, while the Decoder-only configuration offered a smaller gain to 87.63 percent. On the MSD HepaticVessel task, that pattern flipped decisively, Decoder-only reached 67.67 percent average Dice, a 1.63 percentage point jump over the 66.04 percent baseline, while Encoder-only barely moved the needle to around 66.35 percent.
| Dataset | Task type | Baseline nnU-Net | Best encoder config | Best decoder config |
|---|---|---|---|---|
| BTCV multi organ CT | Eight organ segmentation | 87.33% | 88.11% (Encoder-only, 12 layer) | 87.63% (Decoder-only) |
| MSD HepaticVessel | Vessel and tumor segmentation | 66.04% | 66.35% (Encoder-only, 12 layer) | 67.67% (Decoder-only) |
| In house pancreatic tumors | Pancreas, PDAC, cyst | 65.97% avg | 66.71% avg (Encoder-only) | 69.69% avg (Decoder-only) |
Combining both modules together, Encoder+Decoder, produced results that were competitive with whichever single module already won for a given task, but rarely meaningfully better than that single best module alone. On BTCV it edged slightly ahead to 88.39 percent, the best number in the whole comparison, but on the vessel and pancreatic tumor tasks it landed between the encoder only and decoder only results rather than beating both. The authors read this as evidence that each module contributes a somewhat distinct kind of benefit rather than the two simply stacking additively, and it shaped their final recommendation to default to Encoder-only for organ heavy tasks and Decoder-only for tumor heavy tasks rather than always reaching for the combined model.
The small tumor result that matters most clinically
Buried a bit further into the results section is arguably the paper’s most clinically relevant finding, a breakdown of tumor detection accuracy by physical tumor size on the pancreatic dataset. Small pancreatic ductal adenocarcinoma tumors, under 20 millimeters across, are notoriously difficult to catch on imaging, and catching them early matters enormously given how aggressive this cancer type is. For tumors in the 10 to 20 millimeter range, TransUNet’s decoder equipped model improved detection by 9.7 percentage points of Dice score over the nnU-Net baseline, and for small cysts under 10 millimeters it improved detection by 4.3 points. Larger tumors, 20 millimeters and above, still improved but by a smaller margin, 5.0 points for PDAC and 3.0 points for cysts. That pattern, bigger relative gains on the hardest, smallest targets, is exactly what the coarse to fine attention mechanism was designed to help with, and it is a more convincing validation of the design choice than the headline average Dice numbers alone.
| Tumor type | Size range | nnU-Net baseline | TransUNet (proposed) | Gain |
|---|---|---|---|---|
| PDAC | 10 to 20 mm | 26.8% | 36.5% | +9.7 points |
| PDAC | 20 mm or larger | 63.7% | 68.7% | +5.0 points |
| Cyst | under 10 mm | 55.7% | 60.0% | +4.3 points |
| Cyst | 20 mm or larger | 66.8% | 69.8% | +3.0 points |
Worth flagging honestly, the tiniest PDAC tumors, under 10 millimeters, scored 0 percent Dice for both the baseline and the proposed method, meaning neither approach could reliably detect PDAC tumors at that smallest size at all in this dataset. TransUNet’s improvement is real and clinically meaningful for the size range it does help with, but it has not solved tumor detection at every scale, and the paper is upfront about that gap rather than glossing over it.
Beating a strong, purpose built baseline and a challenge winner
nnU-Net is not a weak baseline to beat, it is a widely respected, heavily engineered segmentation framework that wins medical imaging challenges specifically because of how thoroughly its data augmentation and training recipe is tuned per dataset. TransUNet builds directly on top of nnU-Net’s backbone and augmentation pipeline rather than replacing it, which makes the comparison a genuinely fair test of what the added transformer modules contribute rather than a comparison against a deliberately weak starting point. Against a wider field of transformer based competitors including CoTr, nnFormer, and SwinUNETR-V2, the paper reports roughly a 10 percent Dice improvement specifically on the hardest organ in the BTCV set, the gallbladder, and about a 3 percent improvement in overall multi organ accuracy. On the BraTS2021 challenge specifically, TransUNet’s Decoder-only configuration reached 91.74 percent average Dice, edging past the 91.47 percent posted by nnUNet-Large, the actual number one ranked solution from that competition, which is a meaningful benchmark to clear given how competitive that particular challenge is.
Ablation results confirm each piece is pulling its weight
A separate ablation study on the decoder module isolates exactly which sub components matter. Starting from a baseline with no attention at all, average Dice sat at 66.04 percent. Adding plain cross attention between queries and CNN features brought that to 67.04 percent, a full percentage point gain from attention alone. Layering in multi scale features, letting queries attend across several CNN decoder resolutions rather than just the final layer, pushed performance to 67.54 percent. Adding the coarse to fine masked attention on top of that reached the full 67.67 percent reported as the paper’s best decoder result. Each piece contributed something on its own, and the full stack together outperformed any subset. A separate check on positional encodings found removing them entirely cost only about 0.1 percent, suggesting the convolutional layers already carry enough implicit positional information that explicit position embeddings add relatively little on top, an interesting finding for anyone considering simplifying the architecture further. The number of learnable organ queries, tested at 5, 20, and 40, made surprisingly little difference either, with 20 landing marginally ahead of both alternatives.
Efficiency, not just accuracy
A genuinely useful feature of this paper compared to a lot of architecture papers is that it reports compute cost alongside accuracy rather than treating accuracy as the only number that matters. The Encoder+Decoder configuration uses 41.4 million parameters, which sounds like a lot until you compare it against other recent transformer based competitors, SwinUNETR at 62.0 million parameters, 3D UX-Net at 53.0 million, and SwinUNETR-V2 at 72.8 million, all larger than TransUNet while generally scoring lower on the actual segmentation benchmarks. Measured directly on an NVidia A6000 GPU, TransUNet’s inference time, training time per epoch, and GPU memory footprint all landed below those larger competing transformer architectures, while its plain nnU-Net baseline remained the fastest and smallest option of all, unsurprising given nnU-Net has no attention mechanism to compute at all. The authors highlight that TransUNet’s memory footprint stays under 12 gigabytes, low enough to train on more modest hardware like an older Titan XP card rather than requiring a top tier data center GPU, which matters for research groups without unlimited compute budgets.
Clinical translation gap
Every number in this paper measures segmentation overlap against expert drawn ground truth masks on retrospective, already collected imaging datasets, not performance in an actual clinical workflow with new patients arriving in real time. The BraTS and BTCV datasets are well established public research benchmarks, but the large pancreatic tumor dataset comes from a single United States hospital, and the paper does not report testing on data from a second, independent institution with different scanner hardware or acquisition protocols. There is also no reported comparison against how radiologists or oncologists actually perform on the same scans, which the paper does not claim to provide and which would be a meaningfully different, harder study to run. Improved Dice score on small tumor segmentation is a genuinely useful engineering result and a plausible building block for future clinical decision support tools, but it is a step short of demonstrating that this specific model changes diagnostic outcomes for actual patients.
Honest limitations
The paper is candid that combining both modules, Encoder+Decoder, did not reliably beat using just the single best performing module for a given task, despite costing more parameters and more compute than the decoder only option. That is a useful negative result for anyone assuming that stacking more architectural sophistication automatically helps, it does not, at least not here. The authors also note their future work should focus on further reducing training cost and improving overall efficiency, an acknowledgment that despite being more efficient than some transformer competitors, TransUNet still trains and runs slower than the plain nnU-Net baseline it builds on, a real tradeoff for any team weighing whether the accuracy gain is worth the added compute in their specific deployment setting. On the smallest pancreatic tumors tested, under 10 millimeters, neither TransUNet nor the baseline could detect them reliably at all, a limitation the paper reports rather than a claim the method has fully solved.
Where this fits and what comes next
Zoom out and the most transferable idea here is not really TransUNet as a specific fixed architecture, it is the encoder versus decoder framing itself, a genuinely useful mental model for anyone designing a transformer augmented segmentation network for a new task. If a segmentation problem is fundamentally about understanding relationships between multiple distinct structures across a whole image, invest attention budget in the encoder. If the problem is fundamentally about precisely localizing a small, hard to find target against a large, mostly irrelevant background, invest attention budget in a query based decoder with coarse to fine refinement instead. That framing generalizes well beyond the four datasets tested here, and the fact that the pattern held consistently across abdominal CT, brain MRI, and liver vessel imaging, three fairly different imaging modalities and anatomical regions, is reasonably strong evidence the underlying principle is not an artifact of any one dataset’s particular quirks.
Conclusion
The core achievement of this paper is turning what was previously a somewhat ad hoc design choice, where exactly to bolt a transformer onto a U-Net, into an empirically grounded design principle backed by a controlled comparison across four genuinely different segmentation tasks. The encoder helps with global anatomical relationships, the decoder helps with small target localization, and that split held up consistently enough across brain, liver, and abdominal imaging to be a real, generalizable finding rather than a one dataset coincidence.
The small tumor detection results, a 9.7 percentage point Dice improvement on 10 to 20 millimeter pancreatic tumors, are the paper’s strongest evidence that this architectural choice translates into something clinically meaningful rather than just a marginal benchmark improvement, precisely because small, easy to miss tumors are where imaging algorithms have historically struggled the most and where catching a tumor early matters the most for patient outcomes.
The honest limitations are worth carrying forward. Combining both transformer modules together did not reliably beat using the single better suited module for a given task, the very smallest tumors remained undetectable by either method, and every result here comes from retrospective benchmark evaluation rather than prospective clinical testing across multiple institutions. None of that undercuts the paper’s core contribution, a released, efficient, open codebase and a genuinely useful design principle for where transformer attention pays off inside a medical segmentation network, useful groundwork for the next wave of architectures in this space to build on rather than a finished clinical product.
Read the full peer reviewed paper for the complete equations, the full benchmark tables, and the efficiency comparisons.
Read the paper in Medical Image Analysis Get the 2D and 3D code on GitHubFrequently asked questions
What is TransUNet trying to solve
TransUNet investigates where a transformer’s attention mechanism should be placed inside a U-Net style segmentation network to get the most benefit, splitting the transformer into a separate encoder module and decoder module and testing each independently across four different medical imaging tasks.
Should I use the encoder or the decoder version
Based on the paper’s results, the Transformer Encoder configuration works best for tasks involving multiple distinct structures across a whole scan, like segmenting several abdominal organs at once, while the Transformer Decoder configuration works best for small, hard to localize targets like tumors or thin blood vessels.
How much better is TransUNet than nnU-Net
TransUNet improved average Dice score by 1.06 percent on multi organ segmentation and by 4.30 percent on pancreatic tumor segmentation compared to nnU-Net, and it surpassed the top ranked solution from the BraTS2021 brain tumor segmentation challenge.
Does TransUNet actually help with small tumors specifically
Yes, this is one of the paper’s most notable findings. On pancreatic tumors between 10 and 20 millimeters, the decoder equipped configuration improved detection by 9.7 percentage points of Dice score over nnU-Net, a substantially larger gain than on bigger tumors, though the very smallest tumors under 10 millimeters remained undetectable by either method in this dataset.
Is TransUNet efficient enough to actually train and use
The paper reports TransUNet’s Encoder+Decoder configuration uses fewer parameters and less GPU memory than several competing transformer based architectures like SwinUNETR and 3D UX-Net, with a memory footprint under 12 gigabytes, though it is still slower to train than the plain nnU-Net baseline it builds on.
Is this model ready for clinical use
No. This is a benchmark study measuring segmentation accuracy against expert annotations on research datasets and one hospital’s retrospective imaging archive. It has not been tested prospectively across multiple institutions or compared directly against radiologist performance, and the authors present it as an architectural contribution and open source codebase rather than a validated clinical tool.
Explore more in this pillar
Reproducible PyTorch implementation
The block below is an independent, runnable implementation of TransUNet’s two core ideas, the patch based Transformer Encoder and the query based Transformer Decoder with coarse to fine masked attention, built on a small CNN backbone standing in for the full nnU-Net used in the paper. It ends with a smoke test on random dummy tensors so you can confirm the shapes flow correctly before pointing it at real volumes.
# transunet_core.py # Independent reproduction of TransUNet's encoder and decoder modules # (Chen et al., Medical Image Analysis, 2024) # Not official code from the authors. Written for educational reuse. import torch import torch.nn as nn import torch.nn.functional as F class TransformerEncoderModule(nn.Module): """Tokenizes a CNN feature map into patches and applies standard multi head self attention transformer layers for global context.""" def __init__(self, in_channels, patch_size=2, d_enc=256, num_layers=4, num_heads=8): super().__init__() self.patch_size = patch_size self.patch_embed = nn.Conv3d(in_channels, d_enc, kernel_size=patch_size, stride=patch_size) self.pos_embed = None # built lazily once spatial size is known self.layers = nn.ModuleList([ nn.TransformerEncoderLayer(d_model=d_enc, nhead=num_heads, batch_first=True) for _ in range(num_layers) ]) self.d_enc = d_enc def forward(self, feature_map): # feature_map: (B, C, D, H, W) from a CNN backbone tokens = self.patch_embed(feature_map) # (B, d_enc, D', H', W') B, C, D, H, W = tokens.shape tokens = tokens.flatten(2).transpose(1, 2) # (B, N, d_enc) if self.pos_embed is None or self.pos_embed.shape[1] != tokens.shape[1]: self.pos_embed = nn.Parameter(torch.randn(1, tokens.shape[1], self.d_enc, device=tokens.device) * 0.02) tokens = tokens + self.pos_embed for layer in self.layers: tokens = layer(tokens) # Reshape back to a spatial feature map for the CNN decoder out = tokens.transpose(1, 2).reshape(B, self.d_enc, D, H, W) return out class OrganQueryDecoder(nn.Module): """Query based Transformer Decoder with coarse-to-fine masked cross attention, following Eq. 4 through 7 in the paper.""" def __init__(self, num_queries=20, d_dec=128, num_classes=9, num_refine_steps=3): super().__init__() self.num_queries = num_queries self.d_dec = d_dec self.num_refine_steps = num_refine_steps self.query_embed = nn.Parameter(torch.randn(1, num_queries, d_dec) * 0.02) self.w_q = nn.Linear(d_dec, d_dec) self.w_k = nn.Linear(d_dec, d_dec) self.w_v = nn.Linear(d_dec, d_dec) self.classifier = nn.Linear(d_dec, num_classes) def _coarse_mask(self, queries, feat_flat): # Eq. 4: dot product between queries and features, sigmoid + threshold logits = torch.einsum("bqd,bnd->bqn", queries, feat_flat) prob = torch.sigmoid(logits) mask = (prob > 0.5).float() return prob, mask def forward(self, cnn_feature_map): # cnn_feature_map: (B, d_dec, D, H, W), a single scale decoder feature. # Real TransUNet cross attends against multiple CNN scales per layer, # this reproduction uses one scale per refinement step for clarity. B, C, D, H, W = cnn_feature_map.shape feat_flat = cnn_feature_map.flatten(2).transpose(1, 2) # (B, N, d_dec) queries = self.query_embed.expand(B, -1, -1) prob, mask = self._coarse_mask(queries, feat_flat) for _ in range(self.num_refine_steps): q = self.w_q(queries) k = self.w_k(feat_flat) v = self.w_v(feat_flat) # Eq. 6 and 7: mask attention scores outside the current foreground attn_scores = torch.einsum("bqd,bnd->bqn", q, k) / (self.d_dec ** 0.5) neg_inf = torch.finfo(attn_scores.dtype).min masked_scores = torch.where(mask > 0, attn_scores, torch.full_like(attn_scores, neg_inf)) attn_weights = F.softmax(masked_scores, dim=-1) update = torch.einsum("bqn,bnd->bqd", attn_weights, v) queries = queries + update prob, mask = self._coarse_mask(queries, feat_flat) class_logits = self.classifier(queries) # (B, num_queries, num_classes) final_mask = mask.view(B, self.num_queries, D, H, W) return final_mask, class_logits def hungarian_style_loss(pred_masks, pred_logits, target_masks, target_labels, lambda_seg=0.7, lambda_cls=0.3): """ Simplified stand in for the paper's Hungarian matching loss (Eq. 10). Assumes predictions and targets are already matched by index for clarity, a real implementation would solve the assignment problem first. """ seg_loss = F.binary_cross_entropy(pred_masks.clamp(1e-6, 1 - 1e-6), target_masks) pred_flat = pred_masks.flatten(2) target_flat = target_masks.flatten(2) intersection = (pred_flat * target_flat).sum(-1) dice = 1 - (2 * intersection + 1) / (pred_flat.sum(-1) + target_flat.sum(-1) + 1) dice_loss = dice.mean() cls_loss = F.cross_entropy(pred_logits.reshape(-1, pred_logits.shape[-1]), target_labels.reshape(-1)) total = lambda_seg * (seg_loss + dice_loss) + lambda_cls * cls_loss return total, seg_loss, dice_loss, cls_loss if __name__ == "__main__": # Smoke test on random dummy data, confirms shapes flow end to end device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 1. Transformer Encoder on a dummy CNN feature map encoder = TransformerEncoderModule(in_channels=64, patch_size=2, d_enc=128, num_layers=2).to(device) dummy_cnn_feat = torch.randn(1, 64, 16, 16, 16).to(device) encoded = encoder(dummy_cnn_feat) print("encoder output shape", encoded.shape) # 2. Organ query decoder on a dummy decoder feature map num_classes = 9 decoder = OrganQueryDecoder(num_queries=20, d_dec=64, num_classes=num_classes, num_refine_steps=3).to(device) dummy_decoder_feat = torch.randn(1, 64, 8, 8, 8).to(device) pred_masks, pred_logits = decoder(dummy_decoder_feat) print("predicted mask shape", pred_masks.shape) print("predicted class logits shape", pred_logits.shape) # 3. Loss computation and a backward pass target_masks = (torch.rand_like(pred_masks) > 0.8).float() target_labels = torch.randint(0, num_classes, (1, 20)).to(device) optimizer = torch.optim.Adam(decoder.parameters(), lr=1e-4) total_loss, seg_loss, dice_loss, cls_loss = hungarian_style_loss(pred_masks, pred_logits, target_masks, target_labels) print("total loss", total_loss.item(), "seg", seg_loss.item(), "dice", dice_loss.item(), "cls", cls_loss.item()) total_loss.backward() optimizer.step() print("smoke test complete")
This analysis is based on the published paper and an independent evaluation of its claims.

Your article helped me a lot, is there any more related content? Thanks! https://accounts.binance.com/de-CH/register?ref=W0BCQMF1
I don’t think the title of your article matches the content lol. Just kidding, mainly because I had some doubts after reading the article.
Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.