|
|
import tensorflow as tf |
|
|
from tensorflow.keras.preprocessing.image import ImageDataGenerator |
|
|
from tensorflow.keras.applications import MobileNetV2 |
|
|
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D |
|
|
import os |
|
|
from tensorflow.keras.models import Model |
|
|
base_path = os.path.expanduser("~/Downloads/chirag-project/concrete_data") |
|
|
train_dir = os.path.join(base_path, "train") |
|
|
val_dir = os.path.join(base_path, "val") |
|
|
|
|
|
|
|
|
datagen = ImageDataGenerator(rescale=1./255) |
|
|
|
|
|
train_gen = datagen.flow_from_directory( |
|
|
train_dir, |
|
|
target_size=(224, 224), |
|
|
batch_size=32, |
|
|
class_mode="binary" |
|
|
) |
|
|
|
|
|
val_gen = datagen.flow_from_directory( |
|
|
val_dir, |
|
|
target_size=(224, 224), |
|
|
batch_size=32, |
|
|
class_mode="binary" |
|
|
) |
|
|
|
|
|
|
|
|
base_model = MobileNetV2(weights="imagenet", include_top=False, input_shape=(224,224,3)) |
|
|
x = base_model.output |
|
|
x = GlobalAveragePooling2D()(x) |
|
|
preds = Dense(1, activation="sigmoid")(x) |
|
|
|
|
|
model = Model(inputs=base_model.input, outputs=preds) |
|
|
|
|
|
|
|
|
for layer in base_model.layers: |
|
|
layer.trainable = False |
|
|
|
|
|
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"]) |
|
|
|
|
|
|
|
|
model.fit(train_gen, validation_data=val_gen, epochs=5) |
|
|
|
|
|
|
|
|
model_save_path = os.path.expanduser("~/Downloads/crack_detector.h5") |
|
|
model.save(model_save_path) |
|
|
print(f"Model saved as {model_save_path}") |