Spaces:
Runtime error
Runtime error
| # AUTOGENERATED! DO NOT EDIT! File to edit: car_damage_detector.ipynb. | |
| # %% auto 0 | |
| __all__ = ['assets_path', 'models_path', 'examples_path', 'imagenet_labels', 'model', 'transform', 'catogories', 'title', | |
| 'description', 'examples', 'learn_damaged_or_not', 'learn_damage_location', 'learn_damage_severity', 'intf', | |
| 'get_imagenet_classes', 'create_model', 'car_or_not_inference', 'predict', 'main_predictor'] | |
| # %% car_damage_detector.ipynb 2 | |
| # imports | |
| # import os | |
| import timm | |
| # import json | |
| import torch | |
| import gradio as gr | |
| import pickle as pk | |
| # from PIL import Image | |
| import fastbook | |
| fastbook.setup_book() | |
| from fastbook import * | |
| from fastai.vision.widgets import * | |
| # from collections import Counter, defaultdict | |
| assets_path = 'assets/' | |
| models_path = 'assets/models/' | |
| examples_path = 'assets/examples/' | |
| # %% car_damage_detector.ipynb 3 | |
| # Imagenet Class | |
| def get_imagenet_classes(): | |
| # read idx file | |
| imagenet_file = open(assets_path+"imagenet_class_index.txt", "r").read() | |
| # seperate elements and onvert string to list | |
| imagenet_labels_raw = imagenet_file.strip().split('\n') | |
| # keep first label | |
| imagenet_labels = [item.split(',')[0] for item in imagenet_labels_raw] | |
| return imagenet_labels | |
| imagenet_labels = get_imagenet_classes() | |
| # Create Model | |
| def create_model(model_name='vgg16.tv_in1k'): | |
| # import required model | |
| model = timm.create_model(model_name, pretrained=True).eval() | |
| # transform data as required by the model | |
| transform = timm.data.create_transform( | |
| **timm.data.resolve_data_config(model.pretrained_cfg) | |
| ) | |
| return model, transform | |
| model, transform = create_model() | |
| # Car or Not : Main Inferene Code | |
| catogories = ('Is a Car', 'Not a Car') | |
| def car_or_not_inference(input_image): | |
| # print ("Validating that this is a picture of a car...") | |
| # retain the top 'n' most occuring items \\ n=36 | |
| top_n_cat_list = ['sports_car', 'minivan', 'convertible', 'beach_wagon', 'limousine', 'pickup', 'car_wheel', 'grille', 'racer', 'minibus', 'jeep', 'moving_van', 'tow_truck', 'cab', 'police_van', 'snowplow', 'amphibian', 'trailer_truck', 'recreational_vehicle', 'ambulance', 'motor_scooter', 'cassette_player', 'fire_engine', 'car_mirror', 'mobile_home', 'crash_helmet', 'mouse', 'snowmobile', 'Model_T', 'passenger_car', 'solar_dish', 'garbage_truck', 'photocopier', 'mountain_tent', 'half_track', 'speedboat'] | |
| # image = PILImage.create(input_image) | |
| # transform image as required for prediction | |
| image_tensor = transform(input_image) | |
| # predict on image | |
| output = model(image_tensor.unsqueeze(0)) | |
| # get probabilites | |
| probabilities = torch.nn.functional.softmax(output[0], dim=0) | |
| # select top 5 probs | |
| _, indices = torch.topk(probabilities, 5) | |
| for idx in indices: | |
| pred_label = imagenet_labels[idx] | |
| if pred_label in top_n_cat_list: | |
| return 1.0 #dict(zip(catogories, [1.0, 0.0])) #"Validation complete - proceed to damage evaluation" | |
| return 0.0 #dict(zip(catogories, [0.0, 1.0]))#"Are you sure this is a picture of your car? Please take another picture (try a different angle or lighting) and try again." | |
| # %% car_damage_detector.ipynb 5 | |
| title = "Car Care" | |
| description = "A vision based car damage identifier." | |
| examples = [examples_path+'lambo.jpg', examples_path+'dog.jpg', examples_path+'front_moderate.jpg'] | |
| learn_damaged_or_not = load_learner(models_path+'car_damaged_or_not.pkl') | |
| learn_damage_location = load_learner(models_path+'car_damage_side.pkl') | |
| learn_damage_severity = load_learner(models_path+'car_damage_severity.pkl') | |
| def predict(img, learn): | |
| # img = PILImage.create(img) | |
| pred, idx, probs = learn.predict(img) | |
| return pred#, float(probs[idx]) | |
| def main_predictor(img, progress=gr.Progress()): | |
| progress((0,4), desc="Starting Analysis...") | |
| input_image = PILImage.create(img) | |
| car_or_not = car_or_not_inference(input_image) | |
| progress((1,4)) | |
| if car_or_not: | |
| gr.Info("Car check completed.") | |
| damaged_or_not = predict(input_image, learn_damaged_or_not) | |
| progress((2,4)) | |
| if damaged_or_not == 'damage': | |
| gr.Info("Damage check completed.") | |
| damaged_location = predict(input_image, learn_damage_location) | |
| progress((3,4)) | |
| gr.Info("Damage Location identified.") | |
| damaged_severity = predict(input_image, learn_damage_severity) | |
| progress((4,4), desc="Analysis Complete") | |
| gr.Info("Damage Severity assessed.") | |
| # refer below sections for Location and Severity | |
| return f"""Results: \n Car Check: it's a Car \n Damage Check: Car is Damaged \n Location: {damaged_location} \n Severity: {damaged_severity}""" | |
| else: | |
| progress((4,4)) | |
| return "Are you sure your car is damaged ?. \nMake sure you click a clear picture of the damaged portion. \nPlease resubmit the picture" | |
| else: | |
| progress((4,4)) | |
| return "Are you sure this is a picture of your car? \nPlease take another picture (try a different angle or lighting) and try again." | |
| # input_image = 'assets/examples/severe.jpg' | |
| # main_predictor(input_image) | |
| # %% car_damage_detector.ipynb 6 | |
| intf = gr.Interface(fn=main_predictor,inputs=gr.Image(),outputs=gr.Textbox(),title=title,description=description,examples=examples) | |
| intf.launch(share=True) | |