smart / app.py
Shakir60's picture
Update app.py
4f207d0 verified
raw
history blame
2.72 kB
import streamlit as st
from transformers import ViTForImageClassification, ViTImageProcessor
from PIL import Image
import torch
# Custom labels for structural damage
DAMAGE_TYPES = {
'spalling': {
'remedies': ['Remove loose concrete', 'Clean exposed reinforcement', 'Apply repair mortar'],
'risk_level': 'High'
},
'reinforcement_corrosion': {
'remedies': ['Remove rust', 'Apply corrosion inhibitor', 'Repair concrete cover'],
'risk_level': 'Critical'
},
'structural_crack': {
'remedies': ['Monitor crack width', 'Epoxy injection', 'Structural reinforcement'],
'risk_level': 'Critical'
},
'dampness': {
'remedies': ['Identify water source', 'Fix waterproofing', 'Improve drainage'],
'risk_level': 'Medium'
}
}
@st.cache_resource
def load_model():
model = ViTForImageClassification.from_pretrained(
"nateraw/vit-base-patch16-224-finetuned-structural-damage",
num_labels=len(DAMAGE_TYPES),
id2label={i: label for i, label in enumerate(DAMAGE_TYPES.keys())},
label2id={label: i for i, label in enumerate(DAMAGE_TYPES.keys())}
)
processor = ViTImageProcessor.from_pretrained("google/vit-base-patch16-224")
return model, processor
def analyze_damage(image, model, processor):
inputs = processor(images=image, return_tensors="pt")
outputs = model(**inputs)
probs = torch.nn.functional.softmax(outputs.logits, dim=-1)
return probs[0]
def main():
st.title("Structural Damage Assessment")
model, processor = load_model()
uploaded_file = st.file_uploader("Upload structural image", type=['jpg', 'jpeg', 'png'])
if uploaded_file:
image = Image.open(uploaded_file)
st.image(image, caption="Analyzed Structure")
with st.spinner("Analyzing structural damage..."):
predictions = analyze_damage(image, model, processor)
for idx, (damage_type, conf) in enumerate(zip(DAMAGE_TYPES.keys(), predictions)):
confidence = float(conf) * 100
if confidence > 10: # Show only significant predictions
st.subheader(f"{damage_type.replace('_', ' ').title()}")
st.progress(confidence / 100)
st.write(f"Confidence: {confidence:.1f}%")
st.write(f"Risk Level: {DAMAGE_TYPES[damage_type]['risk_level']}")
st.write("Recommended Actions:")
for remedy in DAMAGE_TYPES[damage_type]['remedies']:
st.write(f"• {remedy}")
st.divider()
if __name__ == "__main__":
main()