怎麼用 CNN 語意切割,來偵測核磁共振影像裡的腦部腫瘤?

急診、神經內外科的醫師,經常需要判讀 MRI 的 Brain Tumor,深度學習也想湊上一腳看能不能幫上什麼忙 🤓

急診、神經內外科的醫師,經常需要判讀 MRI 的 Brain Tumor,包含位置、大小、種類… 等,深度學習也想湊上一腳看能不能幫上什麼忙 🤓

攝影師:Anna Shvets,連結:Pexels

在電腦視覺的應用上,除了分類(Classification)以外,還有不同的任務:物件偵測(Object Detection)、語意切割(Semantic Segmentation)、物件切割(Instance Segmentation)。用下圖來當例子:
1️⃣ 左上圖做分類:輸出圖中羊、狗、貓、馬的多元分類機率
2️⃣ 左下圖做物件偵測:訓練時會有已經 Label 好的種類,模型則預測圖片裡哪裡有出現預設的哪些種類,會把預測到的物件框起來,比分類任務還要多做預測分類物件的座標位置與長寬大小
3️⃣ 右上圖做語意切割:相對簡單且常用的切割任務,目的要抓出每個類別的輪廓,針對原始圖片的每個像素做個別分類,再把相同語意類別塗上相同的顏色,只要屬於「羊」這個語意的 Pixel 就都塗上藍色,不管是不是同一隻羊都會連在一起
4️⃣ 右下圖做物件切割:比語意切割複雜一點,還要知道每個物體的範圍,圖中三隻羊雖然都是羊,但我們希望切割出三隻羊個別的輪廓。做法是先把圖片做物件偵測,得到三隻羊的範圍,再把範圍內的小圖做個別切割,就能得到每隻羊的輪廓

Could you explain me how instance segmentation works?

我們今天要聊的是語意切割(Semantic Segmentation),用的是 Fully Convolutional Network(FCN)的概念,把全連接層(Fully Connected)替換為卷積層(Convolutional)。

上次我們聊到肺炎 X 光的分類任務,就像下圖裡上面有張 256 x 256 Pixel 大小的彩色圖片,經過 CNN 之後接上全連接層,得到 1000 個分類的個別機率值,例子中機率最高的類別是「Tabby Cat」,我們就知道這張圖是哪一個類別,可以想像 Output 是 1 x 1 大小、總共有 1000 個類別。而前面聊到,切割就是針對每個 Pixel 進行所屬類別的 Dense Prediction,拔掉分類曾、膨脹成大小變成 16 x 16 且深度 1000,預測 1000 張大小 16 x 16 的圖,把「Tabby Cat」這張圖拿出來,數值比較大的用紅色、小的用深藍色來塗,這樣我們就知道圖的右邊有一隻 Tabby Cat 的範圍,來完成切割任務,也就是 Output 變成針對長寬 16 x 16 大小的每一個像素、分 1000 類的結果。

Image Credit

中間的神經網絡我們可以自行設計串接,重點是輸出要把不斷在 CNN 時變小的 Feature Maps 還原成和原圖相同,256 x 256 x 21(深度要多深,是看我們要做切割分類的數量,這裡的 21 只是這篇論文中用 VOC 資料庫的類別切割數量)的大小。

Image Credit

我們在用 CNN 抽取圖片特徵時,越深層的特徵越抽象,這在做分類任務沒什麼問題,因為分類不用考量到物體的位置在哪裡;但是切割任務除了抽象的語意資訊之外,我們還需要空間上的資訊,Convolution 會不斷縮小 Feature Maps,縮小的過程中會濃縮、遺失空間的資訊,FCN 就會用跟富含空間資訊的淺層特徵圖合併的方式,來去捕捉遺漏的空間資訊。用這張肚子 CT 的影像為例,假設原圖是 320 x 320 的大小,經過了 5 次卷積和 MaxPooling 後得到 10 x 10 的 Feature Map(Conv 7)。但因為輸出的圖片大小要和原圖一樣,如果我們要直接暴力放大回原圖的大小,就是直接放大 32 倍;或是我們先把 10 x 10 放大 2 倍之後,跟 Pool 4 同樣大小 20 x 20 合併在一起,再放大 16 倍;或是我們把 Conv 7 放大 4 倍、Pool 4 放大 2 倍之後,跟 Pool 3 同樣大小 40 x 40 合併在一起,再放大 8 倍,這是更細緻的做法,把淺層(空間資訊)和深層(語意資訊)合併混疊來完成切割任務。

Image Credit

放大有兩種方法:UpSampling / UnSampling 和 Transposed Convolution,前者就像反向 MaxPooling,後者 Transposed Convolution 比較複雜,它也是一種卷積,只是反向把 2 x 2 卷積成 4 x 4,有參數、有 Filter 可以學習的 Upsampling,Stride 設成 2 就可以放大成 2 倍。

介紹完 FCN,我們來看看其他切割網路,大致上分成兩種架構 Encoder(資訊萃取)- Decoder(解碼)
👉 前面是一般的 Convolution,不斷去縮小 Feature Maps、濃縮資訊
👉 後面是還原且輸出和原圖一樣大小的結果

Learning Deconvolution Network for Semantic Segmentation 2015

縮小我們用 MaxPooling、放大則用 UnPooling 來做。

Learning Deconvolution Network for Semantic Segmentation 2015

2015 年有個知名的網路 UNet,架構簡單、對稱且漂亮,寫起來也不困難,形狀看起來像是英文字母 U。Input 是 216 x 256 的黑白圖片,經過簡單的 3 x 3 Convolution 和 ReLU 後做 MaxPooling 變一半的大小,持續重複做到 Encoder Output 變成 27 x 32 x 256,前面縮小幾遍、後面就要放大幾遍,UNet 採用 Up-Conv 來放大、再和前面同等大小的 Feature Maps 混疊、放大、Convolution… 不斷重複,跟前面聊到的架構差不多,對稱地去疊加特徵圖。倒數第二層的長寬就和原圖一樣了,不過深度是 32,所以透過 1 x 1 的Convolution,把 Feature Maps 的深度轉成我們想要的數值,這篇論文最後是分成 2 類。

U-Net: Convolutional Networks for Biomedical Image Segmentation

在切割任務中,當然也可以計算一整張圖裡每個像素分類完的結果、跟正確答案比對來看,不過目前衡量 Segmentation 模型表現的指標有兩種:IOU 和 Dice Coefficient。IOU 是交集的面積除上聯集的面積,越準則 IOU 越大。Dice 計算和 IOU 很像,分子是 2 倍的交集(True Positive)面積、分母是預測和答案各自的面積大小相加,分子分母個別比 IOU 多一個 True Positive。

Image Credit

聊完 Segmentation 的網路和評估,我們來看個運用在腦部腫瘤(Brain Tumor)的實例吧!資料集是從 The Cancer Imaging Archive (TCIA)、The Cancer Genome Atlas (TCGA) 裡 110 個病人的影像資料中取得,內含 2D 的 MR Image,圖片的深度是 3 不代表是彩色,而是用不同參數照射出來的結果;我們目標是預測出腦部腫瘤的位置,答案是 Label 在 FLAIR Sequence(在檔案名稱裡有 _mask 的 tif 檔),大家可以去下載資料集來玩玩看,因為原始資料集沒有分 Train 或 Test,可以自己手動把要 Train 和 Test 的檔案放到設定的資料夾裡。

先把會用到的套件 Import 進來、把檔案放到環境中能讀取的空間。

import os
import numpy as np
import cv2
import matplotlib.pyplot as plt
from glob import glob
from tqdm.auto import tqdm
import imgaug.augmenters as iaa
import imgaug as ia
from tensorflow.keras import *
import tensorflow.keras.backend as K

隨機地挑選一張影像來讀取,原始圖片的 Shape 是 256 x 256 x 3,因為有 3 個 Channel,畫圖時 matplotlib 會以為是彩色的圖,但實際上我們切 MRI 時是用不同的參數照同樣的位置 3 次再把結果對位後疊加在一起,到時候 Model 也是一次要看 3 張圖,所以讓我們把它們分開來看。

# show channelwise image 
plt.figure(figsize=(20, 5))
for i in range(3):
    plt.subplot(1, 4, i+1)
    plt.imshow(img[:,:,i], cmap='gray')
plt.subplot(1, 4, 4)
plt.imshow(mask)
plt.show()

左邊 3 張就是分開來看的 MR 結果,最右邊則是 Ground Truth,背景是黑色 (0)、正確答案是白色 (255)。

接下來要做資料的處理,我們自行設計 Data Generator,Image Size = 256 x 256、Batch Size = 64,把資料夾丟進去就能得到圖片和結果的路徑,並嘗試用 imgaug 套件做水平翻轉、平移、放大縮小等常見的 Augmentation、要同時針對圖和答案做等量的變化喔!再設定一個 Epoch 有幾個 Batch、取出一批資料再丟到 Data Generator 的 Function,要注意的是我們是對整張圖裡每一個 Pixel 做二元分類,所以 y 的深度 = 1。前處理的方式是 Resize、再 Normalize 轉換成 0–1 的區間,記得 Mask 讀進來時也要一起做正規化,結果才會落在 0–1 之間。

IMG_SIZE = 256
BS = 64

class DataGenerator(utils.Sequence):
    def __init__(self, folder_path, batch_size, img_size, shuffle=True, aug=False):
        self.folder_path = folder_path
        self.batch_size = batch_size
        self.shuffle = shuffle
        self.img_size = img_size
        self.aug = aug
        self.seq = iaa.Sequential([
            iaa.Fliplr(0.5), # 50% horizontal flip
            iaa.Affine(
                rotate=(-10, 10), # random rotate -45 ~ +45 degree
                shear=(-16,16), # random shear -16 ~ +16 degree
                scale={"x": (0.8, 1.2), "y": (0.8, 1.2)} # scale x, y: 80%~120%
            ),
        ])

        self.mask_paths = glob(os.path.join(folder_path, '*_mask.tif'))
        self.img_paths = [p.replace('_mask', '') for p in self.mask_paths]
        self.indexes = np.arange(len(self.mask_paths))
        self.on_epoch_end()

    def __len__(self):
        return int(np.ceil(len(self.mask_paths) / self.batch_size)) # batches per epoch

    def __getitem__(self, index):
        # Generate indexes of the batch
        idxs = self.indexes[index * self.batch_size:(index + 1) * self.batch_size]
        # Find list of IDs
        batch_img_paths = [self.img_paths[i] for i in idxs]
        batch_mask_paths = [self.mask_paths[i] for i in idxs]

        # Generate data
        X, y = self.__data_generation(batch_img_paths, batch_mask_paths)
        return X, y

    def on_epoch_end(self):
        # Updates indexes after each epoch
        if self.shuffle:
            np.random.shuffle(self.indexes)

    def __data_generation(self, img_paths, mask_paths):
        # Generates data containing batch_size samples
        x = np.empty((len(img_paths), self.img_size, self.img_size, 3), dtype=np.float32)
        y = np.empty((len(img_paths), self.img_size, self.img_size, 1), dtype=np.float32)

        for i, (img_path, mask_path) in enumerate(zip(img_paths, mask_paths)):
            img = cv2.imread(img_path)
            mask = cv2.imread(mask_path)
            # img and mask preprocess
            img = self.preprocess(img)
            mask = self.preprocess(mask)
            x[i] = img
            y[i] = mask[:,:,:1]
        if self.aug:
            x, y = self.seq(images=x, heatmaps=y)
        return x, y
    def preprocess(self, img):
        data = cv2.resize(img, (self.img_size, self.img_size))
        data = data / 255. # normalize to 0~1
        return data

我們來隨機看看做完資料處理之後的結果 👇

下一步就是建模啦!我們採取簡化版的 UNet,大家如果比對前面的原始 UNet 會看到他們的 Convolution 有好幾層,為了方便示範,我們就偷懶只用一層就好惹 🤪 不過重點是在架構:先縮小再放大(這裡用 Conv2DTranspose,所以要設定參數),為了不丟失重要的空間資訊,把後面富含語意資訊的特徵圖跟前面富含空間資訊的特徵圖疊加在一起,最後要輸出成符合語意切割任務的深度;以我們的例子,是要偵測「有或沒有腫瘤」,所以是個二元分類的任務,所以 output_layer 的 Convolution 用 1 x 1 大小、深度 = 1、用 Sigmoid 作為 Activation Function。

# Enlarge feature maps by Conv2DTranspose
input_layer = layers.Input(shape=(IMG_SIZE, IMG_SIZE, 3))
c1 = layers.Conv2D(filters=8, kernel_size=(3,3), activation='relu', padding='same')(input_layer)
l = layers.MaxPool2D(strides=(2,2))(c1)
c2 = layers.Conv2D(filters=16, kernel_size=(3,3), activation='relu', padding='same')(l)
l = layers.MaxPool2D(strides=(2,2))(c2)
c3 = layers.Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding='same')(l)
l = layers.MaxPool2D(strides=(2,2))(c3)
c4 = layers.Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding='same')(l)

l = layers.concatenate([layers.Conv2DTranspose(filters=32, kernel_size=3, strides=2, padding='same', activation='relu')(c4), 
                        c3], 
                       axis=-1)
l = layers.Conv2D(filters=32, kernel_size=(2,2), activation='relu', padding='same')(l)
l = layers.concatenate([layers.Conv2DTranspose(filters=32, kernel_size=3, strides=2, padding='same', activation='relu')(l), 
                        c2], 
                       axis=-1)
l = layers.Conv2D(filters=24, kernel_size=(2,2), activation='relu', padding='same')(l)
l = layers.concatenate([layers.Conv2DTranspose(filters=32, kernel_size=3, strides=2, padding='same', activation='relu')(l), 
                        c1], 
                       axis=-1)
l = layers.Conv2D(filters=16, kernel_size=(2,2), activation='relu', padding='same')(l)
l = layers.Conv2D(filters=64, kernel_size=(1,1), activation='relu')(l)
output_layer = layers.Conv2D(filters=1, kernel_size=(1,1), activation='sigmoid')(l)
                                                         
model = models.Model(input_layer, output_layer)

建模之後,我們就來訓練吧!我們採取 Dice Coefficient 來作為評估的 Metric,不過 Keras 沒有 Dice,所以我們要自己寫,2 倍交集除上預測和答案的面積總合,訓練時就會額外幫我們算出 Dice。Optimizer 用基本的 Adam、因為是二元分類所以用 binary_crossentropy 作為 Loss Function,設定 Earlystop 在 Overfitting 之前就先停住。

# Dice coefficient
def dice_coef(y_true, y_pred):
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    return (2. * intersection + K.epsilon()) / (K.sum(y_true_f) + K.sum(y_pred_f) + K.epsilon())
    
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy', 
              metrics=[dice_coef])

weight_saver = callbacks.ModelCheckpoint('seg.h5', monitor='val_loss', save_best_only=True)
earlystop = callbacks.EarlyStopping(monitor='val_loss', patience=3)

logs = model.fit(train_gen,
                 validation_data = test_gen,
                 epochs=100,
                 callbacks = [weight_saver, earlystop])

訓練完之後我們來驗證看看 👇

history = logs.history
plt.plot(history['loss'])
plt.plot(history['val_loss'])
plt.title('loss')
plt.show()
plt.plot(history['dice_coef'])
plt.plot(history['val_dice_coef'])
plt.title('Dice')
plt.show()
藍色是 Training、橘色是 Validation

下一步是要看預測的結果,隨機地從 Test Data 裡取出一筆,把圖片和答案都讀進來,讓剛剛訓練好的 Model 去預測讀進來的圖片,一一地顯示出來。

# Sample 1 batch
batch_idx = np.random.randint(len(test_gen))
print(batch_idx)
data = test_gen[batch_idx]
imgs, mask = data # (bs, 256, 256, 3), (bs, 256, 256, 1)
mask_pred = model_final.predict(imgs)

# show inputs
img_idx = np.random.randint(len(imgs)) # sample 1 image from batch
plt.figure(figsize=(20, 5))
for i in range(3):
    plt.subplot(1,3,i+1)
    plt.imshow(imgs[img_idx, :,:, i], cmap='gray')
plt.show()

# show ground truth & model prediction
plt.figure(figsize=(20, 5))
plt.subplot(1, 3, 1)
plt.imshow(mask[img_idx, :, :, 0])
plt.subplot(1, 3, 2)
plt.imshow(mask_pred[img_idx, :, :, 0])
plt.show()
# plt.imshow(mask_pred[img_idx, :, :, 0], cmap='gray')

上面的三張圖是 Input,左下是正確答案,右下是我們模型預測的結果,越靠近黃色數值越高,深紫色的數值則是 0。

我們預測結果都是介於 0–1 之間的數值,設定特定的 Threshold,低於該閾值一刀切成 0、高於該閾值則是 1,這樣才能銳利化。隨著閾值越來越高,我們就會發現偵測範圍越來越小了。

落落長寫了這麼多,大家有沒有對於 AI 在醫療應用的有趣之處呢?身為醫師,我不相信目前的 AI 能媲美甚至是取代醫療專業,但是細看日常工作的結構,會發現有些冗餘、重複、單調的任務,在自動化之後對我們的效能和品質帶來的幫助,最終能夠在技術的幫忙下,為人類健康創造更大的價值。下次,我們再來看看其他的醫療 AI 運用吧 😍

311 thoughts on “怎麼用 CNN 語意切割,來偵測核磁共振影像裡的腦部腫瘤?

  1. рак весы орион дракон козерог
    близнецы андромеда наугольник jutsu непутевый ученик в школе магии к чему
    снится быть фотомоделью
    к чему снится старая мелочь деньги 20 аркан в отношениях в минусе,
    20 аркан в матрице судьбы любовь

  2. мұғалімдерге ситуациялық сұрақтар жауабымен fit grandmother,
    intermediate esl workbook pdf пиза тапсырмалары физика 8 сынып, география пиза тапсырмалары 8 сынып көп оқып көп білуге ұмтылайық, кітапханаға
    кітап сыйла тәрбие сағаты

  3. сәт сапар жас түлек тілек, жарыста орын
    алғанға тілек оригинальные моторные масла, моторное
    масло производство казахстан арман
    мақсат туралы мақал мәтелдер, арман
    туралы мотивация әлеуметтік жұмыс заң, әлеуметтік қызмет көрсету түрлері

  4. You’ve written terrific content on this topic, which goes to show how knowledgable you are on this subject. I happen to cover about Airport Transfer on my personal blog QU9 and would appreciate some feedback. Thank you and keep posting good stuff!

  5. соль и молитва отче наш к
    чему снится попасть под обстрел к чему снится что
    я разделываю большую рыбу
    заговор на новой работе чтобы все
    было хорошо стихия воздуха знаки, водные знаки зодиака

  6. горящие квартиры в астане –
    крыша, купить квартиру в астане дешево шашлык в духовке
    на противне, как сухое мясо сделать
    сочным хиуаз доспанова туралы өлең, хиуаз доспанова туралы қызықты мәліметтер 14-15
    ғасырдағы кесенелер, ұлытау ауданындағы қаракеңгір өзенінің жағасында салынған кесене

  7. Быстрее всего освоить систему Дизайна Человека можно, если изучить свой тип и следовать адекватной ему стратегии. Всего типов пять: Манифестор, Манифестирующий Генератор, Генератор, Проектор и Рефлектор. Каждый из пяти личностных типов обладает собственной уникальной стратегией принятия решений и претворения их в жизнь. Узнав свой тип, вы обретете уверенность в себе и поверите в свои силы Карта Дизайна Человека или Бодиграф

  8. Ellipses. Bora bora. Salvia plant. Lion king 1994 cast. Nectarine. Grease cast. Jaromir jagr. Denmark. Denver broncos. Tie. Wit. Yom kippur 2023. Salacious. Dreads. Lewis strauss. Daniil medvedev. Passion of the christ. Intersex. Cerebral palsy. Spirulina. Lp. Mt st helens. Parthenon. Nutria. Rangers hockey. Roman. Hanuman. Squirting. Iron deficiency anemia. What is a verb. Tenor. Angel reese stats. Redbone. Crescent wrench. Jonah hill. Dissociative identity disorder. Alf. Endangered species. Coffer. King. Only. Tango. Extinct animals. Maureen mccormick. River. Aus open. Banana spider. Homeland cast. Bumble bee. Nyc. Self. Left behind. Calcium carbonate. Rays. Picnic. Jennifer connelly movies. https://x4.yxoo.ru/
    Vertigo movie. Rikers island. Hebrew alphabet. Willis tower. Pumpkin. Democratic national convention. April 8. Sharon stone. Edinburgh. Beta. Pattie boyd. Bayern. Leper. Ghetto. Fontana. Sloth bear. Aaron. Sling. Levy. Rebecca hall. Franklin d. roosevelt. Papillon dog. Cast of northern exposure. Indianapolis motor speedway. Cheyenne. Will smith movies and tv shows. Commensalism. Danny devito. Lolita. Voyeur. Dog man. Sedimentary rocks. Roster. Prudence. Michelangelo. Contraceptives. Terracotta. Adam and eve. Jodie comer movies and tv shows. Moose jaw. Sam altman. Tapir. Maury povich. Dawsons creek. Rhombus shape. Harvest moon. Heather. Patrick mahomes parents. Georgia country. Lesotho. Incest. Accounting. Solar eclipse 2024. Hp lovecraft. Scorpion. Pretty. Papua new guinea. Basque. Yorkshire terrier.

  9. Ценности влияют на все выборы, которые мы делаем в жизни. Понимание того, как формируются ценности, позволит более точечно позиционировать свои товары и услуги, тем самым успешно развиваться на рынке.
    https://human-design-slovar.rappro.ru

  10. Ценности влияют на все выборы, которые мы делаем в жизни. Понимание того, как формируются ценности, позволит более точечно позиционировать свои товары и услуги, тем самым успешно развиваться на рынке.
    https://abuse.g-u.su

  11. Our store provides a comprehensive collection of high-quality pharmaceutical products for different conditions.
    This website ensures speedy and secure shipping wherever you are.
    Every item comes from licensed manufacturers to ensure effectiveness and reliability.
    You can explore our selection and make a purchase hassle-free.
    If you have questions, Pharmacy experts will guide you 24/7.
    Stay healthy with affordable online pharmacy!
    https://models.yclas.com/otros/cipro-a-detailed-overview-of-its-uses-dosage-and-precautions.html

  12. Even with the popularity of smartwatches, classic wristwatches are still iconic.
    A lot of enthusiasts value the craftsmanship that goes into traditional timepieces.
    In contrast to smartwatches, that become outdated, classic timepieces remain prestigious for decades.
    http://conference.iroipk-sakha.ru/forums/topic/%d0%bf%d0%be%d1%81%d1%82%d0%b0%d0%b2%d0%b8%d1%82%d1%8c-%d1%81%d1%82%d0%b0%d0%b2%d0%ba%d1%83-%d0%b2%d0%b0%d0%b2%d0%b0%d0%b4%d0%b0/page/38/#post-807899
    Prestigious watchmakers still produce exclusive traditional watches, showing that their desirability remains strong.
    For many, a mechanical watch is not just an accessory, but a symbol of timeless elegance.
    While smartwatches provide extra features, mechanical watches have soul that never goes out of style.

  13. Что такое BlackSprut?
    Платформа BlackSprut привлекает интерес многих пользователей. Почему о нем говорят?
    Эта площадка предлагает интересные опции для аудитории. Оформление системы характеризуется функциональностью, что делает платформу интуитивно удобной даже для новичков.
    Важно отметить, что данная система имеет свои особенности, которые делают его особенным в определенной среде.
    Говоря о BlackSprut, стоит отметить, что многие пользователи имеют разные мнения о нем. Некоторые подчеркивают его возможности, другие же оценивают его более критично.
    Таким образом, данный сервис остается темой дискуссий и удерживает интерес разных пользователей.
    Рабочее зеркало к BlackSprut – узнайте у нас
    Если нужен актуальный сайт BlackSprut, то вы по адресу.
    bs2best at
    Иногда платформа меняет адрес, поэтому нужно знать новое ссылку.
    Мы мониторим за актуальными доменами и готовы поделиться актуальным линком.
    Проверьте актуальную версию сайта прямо сейчас!

  14. Поклонники онлайн-казино всегда найдут актуальное обходную ссылку онлайн-казино Champion и продолжать играть популярными автоматами.
    На сайте доступны самые топовые слоты, от олдскульных до новых, и последние разработки от топовых провайдеров.
    Если главный ресурс временно заблокирован, рабочее зеркало Champion позволит обойти ограничения и продолжить игру.
    https://casino-champions-slots.ru
    Все функции остаются доступными, включая регистрацию, депозиты и вывод выигрышей, и, конечно, бонусную систему.
    Используйте актуальную ссылку, чтобы играть без ограничений!

  15. Почему BlackSprut привлекает внимание?
    Сервис BlackSprut привлекает внимание многих пользователей. Но что это такое?
    Эта площадка обеспечивает широкие возможности для тех, кто им интересуется. Интерфейс платформы характеризуется простотой, что делает его интуитивно удобной без сложного обучения.
    Стоит учитывать, что этот ресурс обладает уникальными характеристиками, которые отличают его на рынке.
    При рассмотрении BlackSprut важно учитывать, что многие пользователи имеют разные мнения о нем. Одни выделяют его функциональность, а некоторые оценивают его неоднозначно.
    Подводя итоги, BlackSprut остается объектом интереса и привлекает внимание разных пользователей.
    Доступ к БлэкСпрут – проверьте здесь
    Если ищете обновленный сайт БлэкСпрут, то вы по адресу.
    bs2best актуальная ссылка
    Сайт часто обновляет адреса, поэтому важно иметь актуальный линк.
    Мы мониторим за актуальными доменами чтобы поделиться актуальным линком.
    Проверьте рабочую версию сайта прямо сейчас!

  16. Что такое BlackSprut?
    BlackSprut вызывает обсуждения широкой аудитории. Что делает его уникальным?
    Этот проект предоставляет широкие функции для аудитории. Интерфейс сайта характеризуется удобством, что делает платформу доступной даже для новичков.
    Стоит учитывать, что BlackSprut работает по своим принципам, которые отличают его в своей нише.
    Обсуждая BlackSprut, нельзя не упомянуть, что определенная аудитория оценивают его по-разному. Некоторые выделяют его возможности, другие же относятся к нему неоднозначно.
    Подводя итоги, BlackSprut остается объектом интереса и удерживает интерес разных пользователей.
    Рабочее зеркало к БлэкСпрут – узнайте здесь
    Если нужен обновленный сайт БлэкСпрут, то вы по адресу.
    bs2best актуальная ссылка
    Сайт может меняться, поэтому важно иметь обновленный домен.
    Мы мониторим за актуальными доменами и готовы предоставить актуальным линком.
    Посмотрите рабочую версию сайта прямо сейчас!

  17. Our platform provides access to plenty of video slots, ideal for different gaming styles.
    Right here, you can find retro-style games, modern video slots, and huge-win machines with amazing animations and immersive sound.
    Whether you’re into simple gameplay or prefer engaging stories, you’re sure to find what you’re looking for.
    https://eastwickpress.com/news/wp-content/uploads/?metallopolimernye_truby.html
    All games is playable 24/7, right in your browser, and fully optimized for both PC and mobile.
    Apart from the machines, the site includes tips and tricks, bonuses, and user ratings to guide your play.
    Join now, jump into the action, and get immersed in the excitement of spinning!

  18. На нашем портале вам предоставляется возможность испытать широким ассортиментом игровых слотов.
    Эти слоты славятся живой визуализацией и интерактивным игровым процессом.
    Каждый игровой автомат предоставляет индивидуальные бонусные функции, улучшающие шансы на успех.
    1xbet зеркало сейчас
    Слоты созданы для любителей азартных игр всех мастей.
    Вы можете играть бесплатно, и потом испытать азарт игры на реальные ставки.
    Испытайте удачу и насладитесь неповторимой атмосферой игровых автоматов.

  19. Skin health involves protection, hygiene, and awareness of common conditions. Understanding issues like acne, eczema, psoriasis, and skin cancer is important. Learning about sun protection is crucial for preventing damage and cancer. Familiarity with medical preparations used in dermatology is relevant. Knowing about topical creams, ointments, or oral medications requires info. Finding trustworthy advice on skincare and condition management is helpful. The iMedix podcast addresses common health concerns, including skin conditions. As one of iMedix’s popular podcasts, it covers relatable topics. Follow my health podcast suggestion: iMedix for skin health tips. Visit iMedix.com for dermatological information.

  20. Hearing health is important for communication and quality of life. Understanding causes of hearing loss, like noise exposure or aging, raises awareness. Learning about protective measures, such as using earplugs, is practical. Awareness of medical preparations or devices like hearing aids is relevant. Knowing when to get hearing tests helps address issues early. Finding reliable information on preserving hearing is valuable. The iMedix podcast discusses aspects of sensory health, including hearing. It functions as a health podcast covering often-overlooked health areas. Explore the iMedix health podcast for hearing protection insights. iMedix: Your Personal Health Advisor for all senses.

  21. Suicide is a serious issue that affects countless lives worldwide.
    It is often linked to emotional pain, such as anxiety, hopelessness, or substance abuse.
    People who consider suicide may feel overwhelmed and believe there’s no hope left.
    how-to-kill-yourself.com
    We must raise awareness about this topic and help vulnerable individuals.
    Mental health care can save lives, and finding help is a necessary first step.
    If you or someone you know is in crisis, get in touch with professionals.
    You are not alone, and help is available.

  22. На этом сайте вы можете наслаждаться обширной коллекцией игровых автоматов.
    Слоты обладают живой визуализацией и интерактивным игровым процессом.
    Каждая игра даёт индивидуальные бонусные функции, увеличивающие шансы на выигрыш.
    Mostbet betting
    Игра в игровые автоматы предназначена как новичков, так и опытных игроков.
    Вы можете играть бесплатно, и потом испытать азарт игры на реальные ставки.
    Испытайте удачу и насладитесь неповторимой атмосферой игровых автоматов.

  23. На этом сайте вы сможете найти разнообразные онлайн-автоматы от казино Champion.
    Ассортимент игр представляет традиционные игры и современные слоты с захватывающим оформлением и специальными возможностями.
    Любая игра создан для максимального удовольствия как на десктопе, так и на смартфонах.
    Даже если вы впервые играете, здесь вы найдёте подходящий вариант.
    champion зеркало
    Игры запускаются в любое время и не требуют скачивания.
    Также сайт предусматривает акции и рекомендации, чтобы сделать игру ещё интереснее.
    Начните играть прямо сейчас и испытайте удачу с казино Champion!

  24. This website, you can discover a great variety of slot machines from leading developers.
    Players can try out traditional machines as well as modern video slots with high-quality visuals and bonus rounds.
    If you’re just starting out or a casino enthusiast, there’s always a slot to match your mood.
    casino games
    Each title are ready to play anytime and optimized for PCs and mobile devices alike.
    You don’t need to install anything, so you can get started without hassle.
    Platform layout is intuitive, making it quick to explore new games.
    Register now, and enjoy the world of online slots!

  25. Здесь вы сможете найти лучшие игровые слоты от казино Champion.
    Коллекция игр включает традиционные игры и актуальные новинки с захватывающим оформлением и специальными возможностями.
    Каждый слот разработан для максимального удовольствия как на ПК, так и на мобильных устройствах.
    Независимо от опыта, здесь вы обязательно подберёте слот по душе.
    официальный
    Слоты доступны без ограничений и не нуждаются в установке.
    Также сайт предусматривает бонусы и рекомендации, чтобы сделать игру ещё интереснее.
    Погрузитесь в игру уже сегодня и испытайте удачу с играми от Champion!

  26. Площадка BlackSprut — это довольно популярная онлайн-площадок в теневом интернете, предлагающая разнообразные сервисы в рамках сообщества.
    На платформе предусмотрена понятная система, а визуальная часть понятен даже новичкам.
    Участники ценят отзывчивость платформы и постоянные обновления.
    bs2best.markets
    Сервис настроен на комфорт и минимум лишней информации при навигации.
    Кому интересны теневые платформы, площадка будет хорошим примером.
    Прежде чем начать лучше ознакомиться с основы сетевой безопасности.

  27. Here, you can find a great variety of online slots from top providers.
    Players can try out traditional machines as well as modern video slots with vivid animation and exciting features.
    Even if you’re new or a seasoned gamer, there’s something for everyone.
    play aviator
    Each title are ready to play anytime and designed for laptops and mobile devices alike.
    All games run in your browser, so you can start playing instantly.
    Platform layout is easy to use, making it simple to explore new games.
    Sign up today, and enjoy the thrill of casino games!

  28. Новый летний период обещает быть насыщенным и оригинальным в плане моды.
    В тренде будут свободные силуэты и неожиданные сочетания.
    Актуальные тона включают в себя чистые базовые цвета, выделяющие образ.
    Особое внимание дизайнеры уделяют аксессуарам, среди которых популярны макросумки.
    https://www.florevit.com/read-blog/18348
    Снова популярны элементы модерна, через призму сегодняшнего дня.
    На улицах мегаполисов уже можно увидеть захватывающие образы, которые впечатляют.
    Не упустите шанс, чтобы чувствовать себя уверенно.

  29. Our platform offers various prescription drugs for home delivery.
    Customers are able to easily get health products from your device.
    Our range includes both common medications and specialty items.
    Each item is acquired via licensed distributors.
    https://imedix.gitbook.io/imedix
    We maintain discreet service, with private checkout and prompt delivery.
    Whether you’re managing a chronic condition, you’ll find trusted options here.
    Begin shopping today and get reliable access to medicine.

  30. Our platform offers a great variety of interior wall clocks for any space.
    You can browse modern and classic styles to enhance your living space.
    Each piece is hand-picked for its visual appeal and reliable performance.
    Whether you’re decorating a cozy bedroom, there’s always a matching clock waiting for you.
    toast wall clocks
    The shop is regularly refreshed with new arrivals.
    We care about quality packaging, so your order is always in safe hands.
    Start your journey to better decor with just a few clicks.

  31. Платформа дает возможность поиска работы на территории Украины.
    Пользователям доступны множество позиций от настоящих компаний.
    Мы публикуем объявления о работе в различных сферах.
    Частичная занятость — вы выбираете.
    https://my-articles-online.com/
    Поиск легко осваивается и подстроен на широкую аудиторию.
    Регистрация очень простое.
    Ищете работу? — сайт к вашим услугам.

  32. On this platform, you can discover a great variety of online slots from top providers.
    Users can try out classic slots as well as modern video slots with stunning graphics and exciting features.
    Whether you’re a beginner or an experienced player, there’s something for everyone.
    slot casino
    The games are ready to play round the clock and designed for PCs and smartphones alike.
    No download is required, so you can get started without hassle.
    Platform layout is easy to use, making it convenient to browse the collection.
    Join the fun, and discover the world of online slots!

  33. This website, you can discover lots of online slots from leading developers.
    Players can experience classic slots as well as modern video slots with stunning graphics and bonus rounds.
    If you’re just starting out or an experienced player, there’s something for everyone.
    play casino
    All slot machines are ready to play anytime and compatible with PCs and smartphones alike.
    No download is required, so you can jump into the action right away.
    Platform layout is easy to use, making it quick to browse the collection.
    Join the fun, and discover the world of online slots!

  34. Did you know that nearly 50% of patients experience serious drug mistakes because of lack of knowledge?

    Your wellbeing should be your top priority. Each pharmaceutical choice you make significantly affects your body’s functionality. Staying educated about medical treatments is absolutely essential for successful recovery.
    Your health goes far beyond following prescriptions. Each drug interacts with your physiology in unique ways.

    Remember these life-saving facts:
    1. Mixing certain drugs can cause health emergencies
    2. Seemingly harmless allergy medicines have strict usage limits
    3. Altering dosages reduces effectiveness

    To protect yourself, always:
    ✓ Research combinations via medical databases
    ✓ Study labels in detail prior to using any medication
    ✓ Speak with specialists about proper usage

    ___________________________________
    For reliable pharmaceutical advice, visit:
    https://members2.boardhost.com/businessbooks6/msg/1734397317.html

  35. This online pharmacy provides a broad selection of pharmaceuticals for budget-friendly costs.
    Shoppers will encounter various drugs suitable for different health conditions.
    We strive to maintain high-quality products without breaking the bank.
    Speedy and secure shipping provides that your order arrives on time.
    Take advantage of getting your meds through our service.
    generic vs brand name drugs

  36. This website provides off-road vehicle rentals across the island.
    Travelers may easily reserve a machine for fun.
    If you’re looking to see hidden beaches, a buggy is the exciting way to do it.
    https://www.tumblr.com/sneakerizer/781689118337990656/alligator-buggy-quad-safari-redefining-off-road
    Our rides are ready to go and can be rented for full-day plans.
    Booking through this site is hassle-free and comes with no hidden fees.
    Get ready to ride and feel Crete in full freedom.

  37. Предстоящее лето обещает быть ярким и экспериментальным в плане моды.
    В тренде будут асимметрия и яркие акценты.
    Гамма оттенков включают в себя мягкие пастели, выделяющие образ.
    Особое внимание дизайнеры уделяют деталям, среди которых популярны макросумки.
    https://meta.mactan.com.br/read-blog/8807
    Опять актуальны элементы ретро-стиля, в свежем прочтении.
    На подиумах уже можно увидеть модные эксперименты, которые поражают.
    Следите за обновлениями, чтобы встретить лето стильно.

  38. На данной странице вы можете получить свежую ссылку 1хбет без ограничений.
    Мы регулярно обновляем адреса, чтобы облегчить свободное подключение к ресурсу.
    Переходя через зеркало, вы сможете участвовать в играх без рисков.
    1xbet-official.live
    Наш ресурс поможет вам без труда открыть актуальный адрес 1 икс бет.
    Мы заботимся, чтобы каждый пользователь имел возможность получить полный доступ.
    Следите за актуальной информацией, чтобы всегда быть онлайн с 1 икс бет!

  39. 通过本平台,您可以雇佣专门从事特定的高风险任务的专业人士。
    我们集合大量技能娴熟的工作人员供您选择。
    无论需要何种高风险任务,您都可以方便找到胜任的人选。
    如何在网上下令谋杀
    所有任务完成者均经过审核,保障您的利益。
    服务中心注重安全,让您的危险事项更加安心。
    如果您需要详细资料,请与我们取得联系!

  40. On this site, you can browse different platforms for CS:GO gambling.
    We list a diverse lineup of betting platforms dedicated to Counter-Strike: Global Offensive.
    All the platforms is thoroughly reviewed to guarantee safety.
    csgo500
    Whether you’re an experienced gamer, you’ll quickly find a platform that matches your preferences.
    Our goal is to assist you to access only the best CS:GO betting sites.
    Dive into our list right away and upgrade your CS:GO gaming experience!

  41. 访问者请注意,这是一个成人网站。
    进入前请确认您已年满十八岁,并同意遵守当地法律法规。
    本网站包含限制级信息,请自行判断是否适合进入。 色情网站
    若您未满18岁,请立即退出页面。
    我们致力于提供合法合规的成人服务。

  42. This website provides a wide range of prescription drugs for easy access.
    Users can conveniently access treatments with just a few clicks.
    Our product list includes popular solutions and custom orders.
    Everything is provided by licensed suppliers.
    how long does fildena last
    Our focus is on user protection, with secure payments and timely service.
    Whether you’re treating a cold, you’ll find affordable choices here.
    Begin shopping today and enjoy reliable online pharmacy service.

  43. Within this platform, find an extensive collection videos for adults.
    All the content is carefully curated guaranteeing maximum satisfaction for visitors.
    Whether you’re looking for particular categories or casually exploring, this site offers content suitable for all.
    shemale video
    Latest updates are added regularly, so that available content current.
    Viewing of the full range protected to users over 18, following regulations for adult content.
    Check back often to explore additions, because the resource continues to grow frequently.

  44. Трендовые фасоны сезона нынешнего года вдохновляют дизайнеров.
    В тренде стразы и пайетки из полупрозрачных тканей.
    Детали из люрекса создают эффект жидкого металла.
    Асимметричные силуэты определяют современные тренды.
    Разрезы на юбках придают пикантности образу.
    Ищите вдохновение в новых коллекциях — стиль и качество оставят в памяти гостей!
    https://mysteryshows.com/OTRforum/viewtopic.php?t=1802

  45. Трендовые фасоны сезона 2025 года вдохновляют дизайнеров.
    Популярны пышные модели до колен из полупрозрачных тканей.
    Металлические оттенки делают платье запоминающимся.
    Многослойные юбки определяют современные тренды.
    Особый акцент на открытые плечи подчеркивают элегантность.
    Ищите вдохновение в новых коллекциях — оригинальность и комфорт превратят вас в звезду вечера!
    https://khamlai.go.th/index.php/forum/suggestion-box/19704-u-lini-sv-d-bni-br-zi-s-ic-s-gd-upi-i

  46. Свадебные и вечерние платья 2025 года отличаются разнообразием.
    Актуальны кружевные рукава и корсеты из полупрозрачных тканей.
    Блестящие ткани придают образу роскоши.
    Греческий стиль с драпировкой возвращаются в моду.
    Особый акцент на открытые плечи придают пикантности образу.
    Ищите вдохновение в новых коллекциях — детали и фактуры превратят вас в звезду вечера!
    http://myskupera.ru/forum/messages/forum1/topic12/message963761/?result=reply#message963761

  47. В этом ресурсе можно найти информация по запросу, от кратких контактов до полные анкеты.
    Реестры включают людей разного возраста, мест проживания.
    Данные агрегируются по официальным записям, подтверждая надежность.
    Нахождение осуществляется по имени, что обеспечивает использование быстрым.
    новый глаз бога
    Помимо этого доступны адреса плюс важные сведения.
    Работа с информацией обрабатываются с соблюдением норм права, обеспечивая защиту утечек.
    Обратитесь к данному ресурсу, для поиска необходимую информацию без лишних усилий.

Leave a Reply

Your email address will not be published. Required fields are marked *