Skip to main content

RadioUnet

Architecture

RadioUnet exhibits two U-shaped structures, as shown below

Zoom: 100% | X: 20px | Y: 16px
layer00
layer00
layer0
layer0
layer1
layer1
layer10
layer10
layer2
layer2
layer20
layer20
layer3
layer3
layer4
layer4
layer5
layer5
conv_up5
conv_up5
conv_up4
conv_up4
conv_up3
conv_up3
conv_up20
conv_up20
conv_up2
conv_up2
conv_up10
conv_up10
conv_up1
conv_up1
conv_up0
conv_up0
conv_up00
conv_up00
conv_up000
conv_up000
Wlayer00
Wlayer00
Wlayer0
Wlayer0
Wlayer1
Wlayer1
Wlayer10
Wlayer10
Wlayer2
Wlayer2
Wlayer20
Wlayer20
Wlayer3
Wlayer3
Wlayer4
Wlayer4
Wlayer5
Wlayer5
Wconv_up5
Wconv_up5
Wconv_up4
Wconv_up4
Wconv_up3
Wconv_up3
Wconv_up20
Wconv_up20
Wconv_up2
Wconv_up2
Wconv_up10
Wconv_up10
Wconv_up1
Wconv_up1
Wconv_up0
Wconv_up0
Wconv_up00
Wconv_up00
Wconv_up000
Wconv_up000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
input0
input0
+
+
+
+
Winput
Winput
input
input
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
output
output
+
+
Text is not SVG - cannot display
Architecture

Scroll wheel to zoom / Left-click to drag

Main Convolutional Blocks

The model uses several different convolutional blocks; three representative blocks are given as examples here.

We assume the input channels are 2 (build + transmitter).

Maintain Resolution, Increase Channels

Representative layer: layer00, layer10, layer20, Wlayer00, Wlayer10, Wlayer20

Zoom: 70% | X: -119px | Y: 8px
ConvolutionMax-Pool2@256x2566@256x2566@256x256
layer00

Scroll wheel to zoom / Left-click to drag

Maintain Resolution, Decrease Channels

Representative layer: conv_up000, conv_up00, conv_up10, conv_up20, Wconv_up000, Wconv_up00, Wconv_up10, Wconv_up20

Zoom: 60% | X: -39px | Y: 39px
ConvolutionMax-Pool22@256x2561@256x2561@256x256
conv_up000

Scroll wheel to zoom / Left-click to drag

Decrease Resolution / Downsampling, Increase Channels

Representative layer: layer0, layer1, layer2, layer3, layer4, layer5, Wlayer0, Wlayer1, Wlayer2, Wlayer3, Wlayer4, Wlayer5

Zoom: 55% | X: -128px | Y: -9px
ConvolutionMax-Pool6@256x25640@256x25640@128x128
layer0

Scroll wheel to zoom / Left-click to drag

Increase Resolution / Upsampling, Decrease Channels

Representative layer: conv_up0, conv_up1, conv_up2, conv_up3, conv_up4, conv_up5, Wconv_up0, Wconv_up1, Wconv_up2, Wconv_up3, Wconv_up4, Wconv_up5

Zoom: 65% | X: -59px | Y: 3px
ConvTranspose60@128x12820@256x256
Wconv_up0

Scroll wheel to zoom / Left-click to drag

  • convrelu: Conv2d (Increase Channels) + ReLU + MaxPool2d (Decrease Resolution)
  • convreluT: ConvTranspose2d (Increase Resolution) + ReLU

We can find this two function in file lib/modules.py

Parameter Calculation Tool

When decreasing resolution/downsampling, the resolution is halved using MaxPool, while the convolutional layer maintains its resolution. The following tool can quickly calculate the kernel and padding values ​​of the convolutional layer to ensure that the resolution remains unchanged.

Kernel (k)Padding (p)
Relational formula: k = 2p + 1(Maintain Resolution)

When Increasing resolution/upsampling, the resolution is halved using ConvolutinalTranspose. The following tool can quickly calculate the kernel and padding values ​​of the convolutional layer to ensure that the resolution doubles.

Kernel (k)Padding (p)
Relational formula: k = 2(p + 1) (Double Resolution)

Reproduction Tips

  • The s.environ["CUDA_VISIBLE_DEVICES"]="0" label must match the label of the graphics card in the current environment. In a Linux environment, we can use "nvidia-smi" to check the NVIDIA graphics card.
  • Recommend to change torch.set_default_tensor_type('torch.cuda.FloatTensor') to torch.set_default_tensor_type('torch.FloatTensor') to avoid device incompatibility issues.
  • Recommend to use dataset link in original paper instead of github repository.

Ideas

  • Can the optimal solutions for parameters like channels, pooling, and padding be obtained through training?

RadioMapSeer

  • Include 56,000 simulated radio maps in different city locations and different Tx locations with a number of versions.
  • Include 1,400 high accuracy simulations, with and without cars (IRT4). They are sparse.

Directory Structure:

RadioMapSeer
├── antenna
├── gain
│ ├── DPM
│ ├── IRT2
│ ├── IRT4
│ ├── carsDPM
│ ├── carsIRT2
│ └── carsIRT4
├── png
│ ├── antennas
│ ├── buildings_complete
│ ├── buildings_missing1
│ ├── buildings_missing2
│ ├── buildings_missing3
│ ├── buildings_missing4
│ ├── buildings_removed1
│ ├── buildings_removed2
│ ├── buildings_removed3
│ ├── buildings_removed4
│ ├── cars
│ └── roads
└── polygon
├── buildings_and_cars
├── buildings_complete
├── buildings_difference1
├── buildings_difference2
├── buildings_difference3
├── buildings_difference4
├── buildings_removed1
├── buildings_removed2
├── buildings_removed3
├── buildings_removed4
└── roads

Important Directories: gain, png, this two directories have the images we need. png has the model inputs and gain has the model targets.

  • png/antennas: transmitter map
  • png/buildings_complete: complete building map
  • png/buildings_missing[number]: building map with [number] missing buildings, which can be used to simulate real-world measurement errors.
  • png/buildings_removed[number]: building map containing only the removed buildings, and the files are matched with the files in the difference directory based on their names. (Not used in the original repository)
  • png/cars: car map
  • gain/[cars][method]: radio map, calculated using [method], [with/without] cars, is used as targets/actually measured data/ground truth.
  • antenna and polygon: store the coordinates of the corresponding antenna/building/... in JSON format. buildings_difference[number] corresponds to buildings_missing[number]

DataLoader

Related Fuctions are in 'lib/loaders.py'

Tips

  • A building map may correspond to multiple transmitters, and each transmitter has its own independent target map/gain map/ground truth radio map. In IRT4, only a maximum of 2 transmitters are supported, while other types support up to 80 receivers.
  • We can randomly sample the ground-truth values ​​of a few points as input to aid training. The relevant dataloader functions are 'RadioUNet_s' and 'RadioUNet_s_sprseIRT4'.
  • We can only calculate the loss at a few points to simulate a real-world scenario where we only know the ground-truth values ​​of partial points. The relevant dataloader are "RadioUNet_c_sprseIRT4" and "RadioUNet_s_sprseIRT4".