File size: 3,982 Bytes
25a71e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import tensorflow as tf
from tensorflow.keras import layers, models
from .config import Config

class ModelFactory:
    """Factory class to reconstruct model architectures for weight loading."""
    
    @staticmethod
    def build_resnet50_classifier():
        """Reconstructs ResNet50 Classifier."""
        # ImageNet ağırlıklarıyla başlat ki katman isimleri standart olsun
        base_model = tf.keras.applications.ResNet50(
            weights='imagenet', 
            include_top=False, 
            input_shape=Config.INPUT_SHAPE
        )
        x = base_model.output
        x = layers.GlobalAveragePooling2D()(x)
        x = layers.Dense(512, activation='relu')(x)
        x = layers.Dropout(0.5)(x)
        output = layers.Dense(len(Config.CLASSES), activation='softmax')(x)
        return models.Model(inputs=base_model.input, outputs=output)

    @staticmethod
    def build_cia_net():
        """Reconstructs CIA-Net Segmentation Model."""
        
        def IAM_Module(nuc, con, filters):
            concat = layers.Concatenate()([nuc, con])
            smooth = layers.Conv2D(filters, 3, padding='same')(concat)
            nuc_refine = layers.Conv2D(filters, 3, padding='same', activation='relu')(smooth)
            con_refine = layers.Conv2D(filters, 3, padding='same', activation='relu')(smooth)
            return nuc_refine, con_refine

        inputs = layers.Input(shape=(None, None, 3)) 
        
        # ImageNet ağırlıklarıyla başlat
        base = tf.keras.applications.DenseNet121(
            include_top=False, 
            weights='imagenet', 
            input_tensor=inputs
        )
        
        # Feature Extraction Layers (Standard Keras Names)
        enc1 = base.get_layer('conv1_relu').output
        enc2 = base.get_layer('conv2_block6_concat').output
        enc3 = base.get_layer('conv3_block12_concat').output
        enc4 = base.get_layer('conv4_block24_concat').output
        bottleneck = base.get_layer('relu').output

        # Decoder Level 4
        x = layers.Conv2D(256, 3, padding='same', activation='relu')(bottleneck)
        x = layers.UpSampling2D()(x)
        enc4_lat = layers.Conv2D(256, 1, padding='same')(enc4)
        
        m4 = layers.Add()([x, enc4_lat])
        nuc4, con4 = IAM_Module(m4, m4, 256)
        
        # Decoder Level 3
        nuc_up3 = layers.Conv2D(128, 1, padding='same')(layers.UpSampling2D()(nuc4))
        con_up3 = layers.Conv2D(128, 1, padding='same')(layers.UpSampling2D()(con4))
        enc3_lat = layers.Conv2D(128, 1, padding='same')(enc3)
        
        nuc_m3 = layers.Add()([nuc_up3, enc3_lat])
        con_m3 = layers.Add()([con_up3, enc3_lat])
        nuc3, con3 = IAM_Module(nuc_m3, con_m3, 128)
        
        # Decoder Level 2
        nuc_up2 = layers.Conv2D(64, 1, padding='same')(layers.UpSampling2D()(nuc3))
        con_up2 = layers.Conv2D(64, 1, padding='same')(layers.UpSampling2D()(con3))
        enc2_lat = layers.Conv2D(64, 1, padding='same')(enc2)
        
        nuc_m2 = layers.Add()([nuc_up2, enc2_lat])
        con_m2 = layers.Add()([con_up2, enc2_lat])
        nuc2, con2 = IAM_Module(nuc_m2, con_m2, 64)
        
        # Decoder Level 1
        nuc_up1 = layers.Conv2D(32, 1, padding='same')(layers.UpSampling2D()(nuc2))
        con_up1 = layers.Conv2D(32, 1, padding='same')(layers.UpSampling2D()(con2))
        enc1_lat = layers.Conv2D(32, 1, padding='same')(enc1)
        
        nuc_m1 = layers.Add()([nuc_up1, enc1_lat])
        con_m1 = layers.Add()([con_up1, enc1_lat])
        nuc1, con1 = IAM_Module(nuc_m1, con_m1, 32)
        
        # Final Output
        final_nuc = layers.UpSampling2D()(nuc1)
        final_con = layers.UpSampling2D()(con1)
        
        out_nuc = layers.Conv2D(1, 1, activation='sigmoid', name='nuclei_output')(final_nuc)
        out_con = layers.Conv2D(1, 1, activation='sigmoid', name='contour_output')(final_con)
        
        return models.Model(inputs=inputs, outputs=[out_nuc, out_con])