معاينة مختبر آمنة
Semantic Segmentation TF
هذي معاينة منقّحة للقراءة فقط؛ ما فيه أي شيء يشتغل داخل الصفحة.
قراءة فقط
معاينة الدفتر
Semantic Segmentation TF
> **ملاحظة بيئة التشغيل المدمجة:** هالمعاينة تستخدم عيّنة صغيرة وثابتة وآمنة من ناحية الحقوق عشان تكون النتايج قابلة للتكرار. النتايج بالحجم الكامل تحتاج مجموعة البيانات أو النموذج الموثّق بالدرس داخل بيئة خارجية معتمدة.
# التجزئة الدلالية
**التجزئة (Segmentation)** من المهام الأساسية في الرؤية الحاسوبية. لازم نحدد فئة **كل** بكسل في الصورة، والخلفية محسوبة ضمن الفئات. **التجزئة الدلالية (Semantic Segmentation)** تحدد فئة البكسل فقط، بينما **تجزئة المثيلات (Instance Segmentation)** تفصل أفراد الفئة إلى مثيلات مستقلة.
مثلًا، في تجزئة المثيلات تكون السيارات العشر **أجسامًا مختلفة**، أما في التجزئة الدلالية فـ **كل** السيارات تمثل فئة وحدة.
> **وصف الشكل:** حُذف الأصل لأن حقوق إعادة استخدامه غير موثّقة.
> الصورة من [هالتدوينة](https://www.tensorflow.org/tutorials/images/segmentation)
تقريبًا كل البُنى لها التصميم العام نفسه. الجزء الأول **مشفّر (Encoder)** يستخرج السمات من صورة الإدخال، والجزء الثاني **فاكّ ترميز (Decoder)** يحوّل هالسمات إلى صورة لها الارتفاع والعرض نفسيهما، وعدد قنوات قد يساوي عدد الفئات.
> **وصف الشكل:** حُذف الأصل لأن حقوق إعادة استخدامه غير موثّقة.
> الصورة من [هالبحث](https://arxiv.org/pdf/2001.05566.pdf)
import tensorflow as tf
import tensorflow.keras.layers as keras
import tensorflow.keras.optimizers as optimizers
import tensorflow.keras.losses as losses
import matplotlib.pyplot as plt
import numpy as np
tf.random.set_seed(42)
np.random.seed(42)train_size = 0.8
lr = 3e-4
weight_decay = 8e-9
batch_size = 64
epochs = 2## مجموعة تقسيم اصطناعية
نبني أشكالًا وأقنعة بكسلية مؤلَّفة لهالنسخة عشان يكون مثال التقسيم قابلًا للتشغيل بدون تنزيل بيانات طبية أو قبول شروط ترخيص خارجية.
# No package installation or external archive is required.def make_segmentation_dataset(samples=160, size=64, seed=2026):
rng = np.random.default_rng(seed)
y, x = np.mgrid[0:size, 0:size]
images, masks = [], []
for _ in range(samples):
cx, cy = rng.integers(size // 4, 3 * size // 4, size=2)
radius = int(rng.integers(size // 8, size // 4))
mask = ((x - cx) ** 2 + (y - cy) ** 2 <= radius ** 2).astype("float32")
image = rng.normal(0.12, 0.035, (size, size, 3)).astype("float32")
color = rng.uniform(0.55, 0.95, 3).astype("float32")
image[mask.astype(bool)] = color
images.append(np.clip(image, 0, 1))
masks.append(mask[..., None])
images = np.asarray(images, dtype="float32")
masks = np.asarray(masks, dtype="float32")
split = int(len(images) * train_size)
return (images[:split], masks[:split]), (images[split:], masks[split:])(X_train, y_train), (X_test, y_test) = make_segmentation_dataset()def plotn(n, data):
images, masks = data[0], data[1]
fig, ax = plt.subplots(1, n)
fig1, ax1 = plt.subplots(1, n)
for i, (img, mask) in enumerate(zip(images, masks)):
if i == n:
break
ax[i].imshow(img)
ax1[i].imshow(mask[:, :, 0])
plt.show()**خلونا نعرض بعض الصور مع الأقنعة المقابلة لها.**
plotn(5, (X_train, y_train))## SegNet
بنية مشفّر–فاكّ ترميز بسيطة تستخدم شبكة عصبية التفافية (Convolutional Neural Network, CNN): عمليات التفاف وتجميع في المشفّر، وعمليات التفاف ورفع للدقة (Upsampling) في فاكّ الترميز.
> **وصف الشكل:** حُذف الأصل لأن حقوق إعادة استخدامه غير موثّقة.
* Badrinarayanan, V., Kendall, A., & Cipolla, R. (2015). [SegNet: A deep convolutional
encoder-decoder architecture for image segmentation](https://arxiv.org/pdf/1511.00561.pdf)
class SegNet(tf.keras.Model):
def __init__(self):
super().__init__()
self.enc_conv0 = keras.Conv2D(16, kernel_size=3, padding='same')
self.bn0 = keras.BatchNormalization()
self.relu0 = keras.Activation('relu')
self.pool0 = keras.MaxPool2D()
self.enc_conv1 = keras.Conv2D(32, kernel_size=3, padding='same')
self.relu1 = keras.Activation('relu')
self.bn1 = keras.BatchNormalization()
self.pool1 = keras.MaxPool2D()
self.enc_conv2 = keras.Conv2D(64, kernel_size=3, padding='same')
self.relu2 = keras.Activation('relu')
self.bn2 = keras.BatchNormalization()
self.pool2 = keras.MaxPool2D()
self.enc_conv3 = keras.Conv2D(128, kernel_size=3, padding='same')
self.relu3 = keras.Activation('relu')
self.bn3 = keras.BatchNormalization()
self.pool3 = keras.MaxPool2D()
self.bottleneck_conv = keras.Conv2D(256, kernel_size=(3, 3), padding='same')
self.upsample0 = keras.UpSampling2D(interpolation='bilinear')
self.dec_conv0 = keras.Conv2D(128, kernel_size=3, padding='same')
self.dec_relu0 = keras.Activation('relu')
self.dec_bn0 = keras.BatchNormalization()
self.upsample1 = keras.UpSampling2D(interpolation='bilinear')
self.dec_conv1 = keras.Conv2D(64, kernel_size=3, padding='same')
self.dec_relu1 = keras.Activation('relu')
self.dec_bn1 = keras.BatchNormalization()
self.upsample2 = keras.UpSampling2D(interpolation='bilinear')
self.dec_conv2 = keras.Conv2D(32, kernel_size=3, padding='same')
self.dec_relu2 = keras.Activation('relu')
self.dec_bn2 = keras.BatchNormalization()
self.upsample3 = keras.UpSampling2D(interpolation='bilinear')
self.dec_conv3 = keras.Conv2D(1, kernel_size=1)
def call(self, input):
e0 = self.pool0(self.relu0(self.bn0(self.enc_conv0(input))))
e1 = self.pool1(self.relu1(self.bn1(self.enc_conv1(e0))))
e2 = self.pool2(self.relu2(self.bn2(self.enc_conv2(e1))))
e3 = self.pool3(self.relu3(self.bn3(self.enc_conv3(e2))))
b = self.bottleneck_conv(e3)
d0 = self.dec_relu0(self.dec_bn0(self.upsample0(self.dec_conv0(b))))
d1 = self.dec_relu1(self.dec_bn1(self.upsample1(self.dec_conv1(d0))))
d2 = self.dec_relu2(self.dec_bn2(self.upsample2(self.dec_conv2(d1))))
d3 = self.dec_conv3(self.upsample3(d2))
return d3model = SegNet()
optimizer = optimizers.AdamW(learning_rate=lr, weight_decay=weight_decay)
loss_fn = losses.BinaryCrossentropy(from_logits=True)
model.compile(loss=loss_fn, optimizer=optimizer)def train(datasets, model, epochs, batch_size):
train_dataset, test_dataset = datasets[0], datasets[1]
model.fit(train_dataset[0], train_dataset[1],
epochs=epochs,
batch_size=batch_size,
shuffle=True,
validation_data=(test_dataset[0], test_dataset[1]))train(((X_train, y_train), (X_test, y_test)), model, epochs, batch_size)predictions = []
image_mask = []
plots = 5
for i, (img, mask) in enumerate(zip(X_test, y_test)):
if i == plots:
break
img = tf.expand_dims(img, 0)
pred = np.array(model.predict(img))
predictions.append(pred[0, :, :, 0] > 0.0)
image_mask.append(mask)
plotn(plots, (predictions, image_mask))## U-Net
هذي بنية بسيطة جدًا تستخدم **وصلات التخطي (Skip Connections)**. تساعد الوصلة عند كل مستوى التفاف الشبكة تحتفظ بمعلومات السمات الموجودة في إدخال هالمستوى.
عادةً تستخدم U-Net مشفّرًا جاهزًا لاستخراج السمات، مثل resnet50.
> **وصف الشكل:** حُذف الأصل لأن حقوق إعادة استخدامه غير موثّقة.
* Ronneberger, Olaf, Philipp Fischer, and Thomas Brox. [U-Net: Convolutional networks for biomedical image segmentation.](https://arxiv.org/pdf/1505.04597.pdf)
class UNet(tf.keras.Model):
def __init__(self):
super().__init__()
self.enc_conv0 = keras.Conv2D(16, kernel_size=3, padding='same')
self.bn0 = keras.BatchNormalization()
self.relu0 = keras.Activation('relu')
self.pool0 = keras.MaxPool2D()
self.enc_conv1 = keras.Conv2D(32, kernel_size=3, padding='same')
self.relu1 = keras.Activation('relu')
self.bn1 = keras.BatchNormalization()
self.pool1 = keras.MaxPool2D()
self.enc_conv2 = keras.Conv2D(64, kernel_size=3, padding='same')
self.relu2 = keras.Activation('relu')
self.bn2 = keras.BatchNormalization()
self.pool2 = keras.MaxPool2D()
self.enc_conv3 = keras.Conv2D(128, kernel_size=3, padding='same')
self.relu3 = keras.Activation('relu')
self.bn3 = keras.BatchNormalization()
self.pool3 = keras.MaxPool2D()
self.bottleneck_conv = keras.Conv2D(256, kernel_size=(3, 3), padding='same')
self.upsample0 = keras.UpSampling2D(interpolation='bilinear')
self.dec_conv0 = keras.Conv2D(128, kernel_size=3, padding='same', input_shape=[None, 384, None, None])
self.dec_relu0 = keras.Activation('relu')
self.dec_bn0 = keras.BatchNormalization()
self.upsample1 = keras.UpSampling2D(interpolation='bilinear')
self.dec_conv1 = keras.Conv2D(64, kernel_size=3, padding='same', input_shape=[None, 192, None, None])
self.dec_relu1 = keras.Activation('relu')
self.dec_bn1 = keras.BatchNormalization()
self.upsample2 = keras.UpSampling2D(interpolation='bilinear')
self.dec_conv2 = keras.Conv2D(32, kernel_size=3, padding='same', input_shape=[None, 96, None, None])
self.dec_relu2 = keras.Activation('relu')
self.dec_bn2 = keras.BatchNormalization()
self.upsample3 = keras.UpSampling2D(interpolation='bilinear')
self.dec_conv3 = keras.Conv2D(1, kernel_size=1, input_shape=[None, 48, None, None])
self.cat0 = keras.Concatenate(axis=3)
self.cat1 = keras.Concatenate(axis=3)
self.cat2 = keras.Concatenate(axis=3)
self.cat3 = keras.Concatenate(axis=3)
def call(self, input):
e0 = self.pool0(self.relu0(self.bn0(self.enc_conv0(input))))
e1 = self.pool1(self.relu1(self.bn1(self.enc_conv1(e0))))
e2 = self.pool2(self.relu2(self.bn2(self.enc_conv2(e1))))
e3 = self.pool3(self.relu3(self.bn3(self.enc_conv3(e2))))
cat0 = self.relu0(self.bn0(self.enc_conv0(input)))
cat1 = self.relu1(self.bn1(self.enc_conv1(e0)))
cat2 = self.relu2(self.bn2(self.enc_conv2(e1)))
cat3 = self.relu3(self.bn3(self.enc_conv3(e2)))
b = self.bottleneck_conv(e3)
cat_tens0 = self.cat0([self.upsample0(b), cat3])
d0 = self.dec_relu0(self.dec_bn0(self.dec_conv0(cat_tens0)))
cat_tens1 = self.cat1([self.upsample1(d0), cat2])
d1 = self.dec_relu1(self.dec_bn1(self.dec_conv1(cat_tens1)))
cat_tens2 = self.cat2([self.upsample2(d1), cat1])
d2 = self.dec_relu2(self.dec_bn2(self.dec_conv2(cat_tens2)))
cat_tens3 = self.cat3([self.upsample3(d2), cat0])
d3 = self.dec_conv3(cat_tens3)
return d3model = UNet()
optimizer = optimizers.AdamW(learning_rate=lr, weight_decay=weight_decay)
loss_fn = losses.BinaryCrossentropy(from_logits=True)
model.compile(loss=loss_fn, optimizer=optimizer)train(((X_train, y_train), (X_test, y_test)), model, epochs, batch_size)predictions = []
image_mask = []
plots = 5
for i, (img, mask) in enumerate(zip(X_test, y_test)):
if i == plots:
break
img = tf.expand_dims(img, 0)
pred = np.array(model.predict(img))
predictions.append(pred[0, :, :, 0] > 0.0)
image_mask.append(mask)
plotn(plots, (predictions, image_mask))حذفنا المخرجات وعدّادات التشغيل والودجات والمحتوى النشط وقت الاستيراد. شغّل الدفاتر بس في بيئة خارجية تثق فيها.
سجّل تطبيقك
التسجيل اختياري، يفيدك تتذكر وش طبّقت، ولا يمنع إكمال الدورة.