reidddd commited on
Commit
7b813cc
·
1 Parent(s): dd8d82b

update dockerfile

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. 01d1a50b9ae858ac9bce7ade16fa74512f94fd +0 -0
  2. 0ba5f24071de74933fb3dcbafc1f8c1c1cbd12 +0 -0
  3. 1240b98ed69c04a3e9d59db645ef8e97edc12d +0 -0
  4. 142db7d0bba5750cbf9d2f56e9bcad443ea6b5 +0 -0
  5. 1b251536fa09d28d36b8f7476f6453a7667628 +3 -0
  6. 2d38bf3c6a186c78eae26361deb7aae51b1a8c +0 -0
  7. 338539cc975ea9ce37941545cc031d4e94fcd0 +0 -0
  8. 344aac8c09253b3b630fb776ae94478aa0275b +2 -0
  9. 40841ac768b5e51df9d30213a589ffe6439f7d +5 -0
  10. 65ab4c4bd40cae9973417b5b8d4c0c1edd7fc7 +0 -0
  11. 6ee8951c7546c7bc5876304b0f287036ad5361 +2 -0
  12. 7e1f7b4564f1249151b684110e5ae429969e82 +0 -0
  13. 7fb3351b345190fa253cc10972815b04e223a5 +0 -0
  14. 82015897d315ee0c1caf9a7c6afc88e9c8b7e7 +0 -0
  15. 99da7d986114fd50a3067f9845aca74cb976bc +0 -0
  16. 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  17. Base-RCNN-FPN.yaml +18 -0
  18. COMMIT_EDITMSG +1 -0
  19. Dockerfile +60 -0
  20. HEAD +1 -0
  21. Procfile +1 -0
  22. app.py +109 -0
  23. applypatch-msg.sample +15 -0
  24. b04af489e5e04b3bff84cdaee0263a27dbfc27 +0 -0
  25. b4ed774368af89d654c9f01850d769e6cf9f52 +0 -0
  26. b64513a3a8c89484e90c1ce7d6107205dfa2bb +0 -0
  27. bdf7525023a228fbbd08bd7d70506adad8615a +0 -0
  28. c4a86461311423cae31efe9bdc20de13e6472f +1 -0
  29. carDamageDetectionFinal +1 -0
  30. commit-msg.sample +24 -0
  31. config +11 -0
  32. config.yaml +9 -0
  33. deploy.Dockerfile +32 -0
  34. description +1 -0
  35. docker-compose.yaml +26 -0
  36. e0060b2b78b26e4cef9631a04e84db4eb2c567 +0 -0
  37. e251e270498f1aed0bd37ea8b7cd1df50317e5 +0 -0
  38. e98358175e37113dc547068ceb67a9cd7e9865 +1 -0
  39. exclude +6 -0
  40. f9e8490251dbc56e631a22442c501537ca0113 +0 -0
  41. fsmonitor-watchman.sample +174 -0
  42. index +0 -0
  43. index.html +91 -0
  44. install_detectron2.sh +0 -0
  45. kaggle.json +1 -0
  46. kaggle.json:Zone.Identifier +3 -0
  47. main +1 -0
  48. master +1 -0
  49. packed-refs +3 -0
  50. post-update.sample +8 -0
01d1a50b9ae858ac9bce7ade16fa74512f94fd ADDED
Binary file (35 Bytes). View file
 
0ba5f24071de74933fb3dcbafc1f8c1c1cbd12 ADDED
Binary file (55 Bytes). View file
 
1240b98ed69c04a3e9d59db645ef8e97edc12d ADDED
Binary file (1.28 kB). View file
 
142db7d0bba5750cbf9d2f56e9bcad443ea6b5 ADDED
Binary file (1.52 kB). View file
 
1b251536fa09d28d36b8f7476f6453a7667628 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ x��K
2
+ 1D]��$��� � zL��@h�o`n`��A�*�5��\d�@���:ow46���G���e�&%�(��R��g�,�m�^`g��<^-�q+���0y \���t~
3
+ ��V�a�|��Q?�.9
2d38bf3c6a186c78eae26361deb7aae51b1a8c ADDED
Binary file (1.2 kB). View file
 
338539cc975ea9ce37941545cc031d4e94fcd0 ADDED
Binary file (72 Bytes). View file
 
344aac8c09253b3b630fb776ae94478aa0275b ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ x��1�0 E�9E�H�B �%�SB�$�JOO�|� /����bvU�6����K�CT�k�R����0��J��Mm��d]H(��@����W�Q
2
+ �[��#��+�
40841ac768b5e51df9d30213a589ffe6439f7d ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ x5M�
2
+ �0����W-m��W�
3
+ ~��u[��W�ncoq
4
+ !��$]��l���1�PB����>^�Q�
5
+ ';���왠w�ْ������1��gD<�=a.ɵ��� ��s�4���GGv9ǭLu>3D�
65ab4c4bd40cae9973417b5b8d4c0c1edd7fc7 ADDED
Binary file (348 Bytes). View file
 
6ee8951c7546c7bc5876304b0f287036ad5361 ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ x5��
2
+ �0E]�W �ՐD7ٺU� �4M�i&��ҿ7X�a`����=�(?�}��J]�`B�㦔d�Ix:�iUJ�o7.��Q����"�"���
7e1f7b4564f1249151b684110e5ae429969e82 ADDED
Binary file (515 Bytes). View file
 
7fb3351b345190fa253cc10972815b04e223a5 ADDED
Binary file (163 Bytes). View file
 
82015897d315ee0c1caf9a7c6afc88e9c8b7e7 ADDED
Binary file (29 Bytes). View file
 
99da7d986114fd50a3067f9845aca74cb976bc ADDED
Binary file (79 Bytes). View file
 
9de29bb2d1d6434b8b29ae775ad8c2e48c5391 ADDED
Binary file (15 Bytes). View file
 
Base-RCNN-FPN.yaml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MODEL:
2
+ META_ARCHITECTURE: "GeneralizedRCNN"
3
+ RPN:
4
+ PRE_NMS_TOPK_TEST: 6000
5
+ POST_NMS_TOPK_TEST: 1000
6
+ ROI_HEADS:
7
+ NAME: "Res5ROIHeads"
8
+ DATASETS:
9
+ TRAIN: ("coco_2017_train",)
10
+ TEST: ("coco_2017_val",)
11
+ SOLVER:
12
+ IMS_PER_BATCH: 16
13
+ BASE_LR: 0.02
14
+ STEPS: (60000, 80000)
15
+ MAX_ITER: 90000
16
+ INPUT:
17
+ MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800)
18
+ VERSION: 2
COMMIT_EDITMSG ADDED
@@ -0,0 +1 @@
 
 
1
+ update dockerfile
Dockerfile ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM nvidia/cuda:11.1.1-cudnn8-devel-ubuntu18.04
2
+ # use an older system (18.04) to avoid opencv incompatibility (issue#3524)
3
+
4
+ ENV DEBIAN_FRONTEND noninteractive
5
+ RUN apt-get update && apt-get install -y \
6
+ python3-opencv ca-certificates python3-dev git wget sudo ninja-build
7
+ RUN ln -sv /usr/bin/python3 /usr/bin/python
8
+
9
+ # create a non-root user
10
+ ARG USER_ID=1000
11
+ RUN useradd -m --no-log-init --system --uid ${USER_ID} appuser -g sudo
12
+ RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
13
+ USER appuser
14
+ WORKDIR /home/appuser
15
+
16
+ ENV PATH="/home/appuser/.local/bin:${PATH}"
17
+ RUN wget https://bootstrap.pypa.io/pip/3.6/get-pip.py && \
18
+ python3 get-pip.py --user && \
19
+ rm get-pip.py
20
+
21
+ # install dependencies
22
+ # See https://pytorch.org/ for other options if you use a different version of CUDA
23
+ RUN pip install --user tensorboard cmake onnx # cmake from apt-get is too old
24
+ RUN pip install --user torch==1.10 torchvision==0.11.1 -f https://download.pytorch.org/whl/cu111/torch_stable.html
25
+
26
+ RUN pip install --user 'git+https://github.com/facebookresearch/fvcore'
27
+ # install detectron2
28
+ RUN git clone https://github.com/facebookresearch/detectron2 detectron2_repo
29
+ # set FORCE_CUDA because during `docker build` cuda is not accessible
30
+ ENV FORCE_CUDA="1"
31
+ # This will by default build detectron2 for all common cuda architectures and take a lot more time,
32
+ # because inside `docker build`, there is no way to tell which architecture will be used.
33
+ ARG TORCH_CUDA_ARCH_LIST="Kepler;Kepler+Tesla;Maxwell;Maxwell+Tegra;Pascal;Volta;Turing"
34
+ ENV TORCH_CUDA_ARCH_LIST="${TORCH_CUDA_ARCH_LIST}"
35
+
36
+ RUN pip install --user -e detectron2_repo
37
+
38
+ # Set a fixed model cache directory.
39
+ ENV FVCORE_CACHE="/tmp"
40
+ WORKDIR /home/appuser/detectron2_repo
41
+
42
+ # run detectron2 under user "appuser":
43
+ # wget http://images.cocodataset.org/val2017/000000439715.jpg -O input.jpg
44
+ # python3 demo/demo.py \
45
+ #--config-file configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \
46
+ #--input input.jpg --output outputs/ \
47
+ #--opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl
48
+ FROM python:3.9
49
+
50
+ RUN useradd -m -u 1000 user
51
+ USER user
52
+ ENV PATH="/home/user/.local/bin:$PATH"
53
+
54
+ WORKDIR /app
55
+
56
+ COPY --chown=user ./requirements.txt requirements.txt
57
+ RUN pip install --no-cache-dir --upgrade -r requirements.txt
58
+
59
+ COPY --chown=user . /app
60
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
HEAD ADDED
@@ -0,0 +1 @@
 
 
1
+ ref: refs/remotes/origin/main
Procfile ADDED
@@ -0,0 +1 @@
 
 
1
+ web: gunicorn app:app
app.py ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify, render_template
2
+ from detectron2main.config import get_cfg
3
+ from detectron2main.engine import DefaultPredictor
4
+ from detectron2main.data import MetadataCatalog
5
+ from detectron2main.utils.visualizer import Visualizer, ColorMode
6
+ import numpy as np
7
+ from PIL import Image
8
+ import io
9
+ import os
10
+ import requests
11
+ import gdown
12
+
13
+ # Initialize Flask app
14
+ app = Flask(__name__)
15
+ cfg = None
16
+ # Google Drive file URL
17
+ GDRIVE_MODEL_URL = "https://drive.google.com/uc?id=18aEDo-kWOBhg8mAhnbpFkuM6bmmrBH4E" # Replace 'your-file-id' with the actual file ID from Google Drive
18
+ LOCAL_MODEL_PATH = "model_final.pth"
19
+ def download_file_from_google_drive(id, destination):
20
+ gdown.download(GDRIVE_MODEL_URL, LOCAL_MODEL_PATH, quiet=False)
21
+
22
+
23
+ file_id = '18aEDo-kWOBhg8mAhnbpFkuM6bmmrBH4E'
24
+ destination = 'model_final.pth'
25
+ download_file_from_google_drive(file_id, destination)
26
+
27
+ # Download model from Google Drive if not already present locally
28
+ def download_model():
29
+ if not os.path.exists(LOCAL_MODEL_PATH):
30
+ response = requests.get(GDRIVE_MODEL_URL, stream=True)
31
+ if response.status_code == 200:
32
+ with open(LOCAL_MODEL_PATH, 'wb') as f:
33
+ f.write(response.content)
34
+ else:
35
+ raise Exception(f"Failed to download model from Google Drive: {response.status_code}")
36
+
37
+ # Configuration and model setup
38
+ def setup_model(model_path):
39
+ global cfg
40
+ cfg = get_cfg()
41
+ cfg.merge_from_file("config.yaml") # Update with the config file path
42
+ cfg.MODEL.WEIGHTS = model_path
43
+ cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
44
+ cfg.MODEL.DEVICE = "cpu" # Use "cuda" for GPU
45
+ return DefaultPredictor(cfg)
46
+
47
+ # Ensure model is available
48
+ predictor = setup_model(LOCAL_MODEL_PATH)
49
+
50
+ # Define expected parts and costs
51
+ expected_parts = ['headlamp', 'rear_bumper', 'door', 'hood', 'front_bumper']
52
+ cost_dict = {
53
+ 'headlamp': 300,
54
+ 'rear_bumper': 250,
55
+ 'door': 200,
56
+ 'hood': 220,
57
+ 'front_bumper': 250,
58
+ 'other': 150
59
+ }
60
+
61
+ @app.route('/')
62
+ def home():
63
+ return render_template('index.html')
64
+
65
+ @app.route('/upload', methods=['POST'])
66
+ def upload():
67
+ if 'file' not in request.files:
68
+ return jsonify({"error": "No file uploaded"}), 400
69
+
70
+ file = request.files['file']
71
+ if file.filename == '':
72
+ return jsonify({"error": "No file selected"}), 400
73
+
74
+ # Load image
75
+ image = Image.open(file).convert("RGB")
76
+ image_np = np.array(image)
77
+
78
+ # Run model prediction
79
+ outputs = predictor(image_np)
80
+ instances = outputs["instances"].to("cpu")
81
+ class_names = MetadataCatalog.get(cfg.DATASETS.TEST[0]).thing_classes
82
+
83
+ # Initialize total cost
84
+ total_cost = 0
85
+ damage_details = []
86
+
87
+ for j in range(len(instances)):
88
+ class_id = instances.pred_classes[j].item()
89
+ damaged_part = class_names[class_id] if class_id < len(class_names) else 'unknown'
90
+ if damaged_part not in expected_parts:
91
+ damaged_part = 'other'
92
+
93
+ repair_cost = cost_dict.get(damaged_part, cost_dict['other'])
94
+ total_cost += repair_cost
95
+
96
+ damage_details.append({
97
+ 'part': damaged_part,
98
+ 'cost_usd': repair_cost
99
+ })
100
+
101
+ response = {
102
+ "damages": damage_details,
103
+ "total_cost": total_cost
104
+ }
105
+
106
+ return jsonify(response)
107
+
108
+ if __name__ == '__main__':
109
+ app.run(debug=True)
applypatch-msg.sample ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to check the commit log message taken by
4
+ # applypatch from an e-mail message.
5
+ #
6
+ # The hook should exit with non-zero status after issuing an
7
+ # appropriate message if it wants to stop the commit. The hook is
8
+ # allowed to edit the commit message file.
9
+ #
10
+ # To enable this hook, rename this file to "applypatch-msg".
11
+
12
+ . git-sh-setup
13
+ commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
14
+ test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
15
+ :
b04af489e5e04b3bff84cdaee0263a27dbfc27 ADDED
Binary file (268 Bytes). View file
 
b4ed774368af89d654c9f01850d769e6cf9f52 ADDED
Binary file (614 Bytes). View file
 
b64513a3a8c89484e90c1ce7d6107205dfa2bb ADDED
Binary file (817 Bytes). View file
 
bdf7525023a228fbbd08bd7d70506adad8615a ADDED
Binary file (515 Bytes). View file
 
c4a86461311423cae31efe9bdc20de13e6472f ADDED
@@ -0,0 +1 @@
 
 
1
+ x=��M�0�a�S�4`"� ��+*�g�� q<�=�L�@��@V+q��������O/!r��ȗԮiKW8��*a�w�����Eb��k�-�'J��{y��Z'�F}Z#O&+�Z+��s*TTP�il�t#�@V����X�5-�Tn��P�����aX����9 ņ��g������C�����P
carDamageDetectionFinal ADDED
@@ -0,0 +1 @@
 
 
1
+ Subproject commit c07fb3351b345190fa253cc10972815b04e223a5
commit-msg.sample ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to check the commit log message.
4
+ # Called by "git commit" with one argument, the name of the file
5
+ # that has the commit message. The hook should exit with non-zero
6
+ # status after issuing an appropriate message if it wants to stop the
7
+ # commit. The hook is allowed to edit the commit message file.
8
+ #
9
+ # To enable this hook, rename this file to "commit-msg".
10
+
11
+ # Uncomment the below to add a Signed-off-by line to the message.
12
+ # Doing this in a hook is a bad idea in general, but the prepare-commit-msg
13
+ # hook is more suited to it.
14
+ #
15
+ # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
16
+ # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
17
+
18
+ # This example catches duplicate Signed-off-by lines.
19
+
20
+ test "" = "$(grep '^Signed-off-by: ' "$1" |
21
+ sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
22
+ echo >&2 Duplicate Signed-off-by lines.
23
+ exit 1
24
+ }
config ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [core]
2
+ repositoryformatversion = 0
3
+ filemode = true
4
+ bare = false
5
+ logallrefupdates = true
6
+ [remote "origin"]
7
+ url = https://huggingface.co/spaces/reidddd/carDamageDetection
8
+ fetch = +refs/heads/*:refs/remotes/origin/*
9
+ [branch "main"]
10
+ remote = origin
11
+ merge = refs/heads/main
config.yaml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ _BASE_: "Base-RCNN-FPN.yaml"
2
+ MODEL:
3
+ WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl"
4
+ MASK_ON: True
5
+ RESNETS:
6
+ DEPTH: 50
7
+ SOLVER:
8
+ STEPS: (210000, 250000)
9
+ MAX_ITER: 270000
deploy.Dockerfile ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) Facebook, Inc. and its affiliates.
2
+ # This file defines a container that compiles the C++ examples of detectron2.
3
+ # See docker/README.md for usage.
4
+
5
+ # Depends on the image produced by "./Dockerfile"
6
+ FROM detectron2:v0
7
+
8
+ USER appuser
9
+ ENV HOME=/home/appuser
10
+ WORKDIR $HOME
11
+
12
+ # Let torchvision find libtorch
13
+ ENV CMAKE_PREFIX_PATH=$HOME/.local/lib/python3.6/site-packages/torch/
14
+
15
+ RUN sudo apt-get update && sudo apt-get install libopencv-dev --yes
16
+
17
+ # install libtorchvision
18
+ RUN git clone --branch v0.11.1 https://github.com/pytorch/vision/
19
+ RUN mkdir vision/build && cd vision/build && \
20
+ cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/.local -DCMAKE_BUILD_TYPE=Release -DWITH_CUDA=on -DTORCH_CUDA_ARCH_LIST=$TORCH_CUDA_ARCH_LIST && \
21
+ make -j && make install
22
+
23
+ # make our installation take effect
24
+ ENV CPATH=$HOME/.local/include \
25
+ LIBRARY_PATH=$HOME/.local/lib \
26
+ LD_LIBRARY_PATH=$HOME/.local/lib
27
+
28
+
29
+ # build C++ examples of detectron2
30
+ RUN cd detectron2_repo/tools/deploy && mkdir build && cd build && \
31
+ cmake -DTORCH_CUDA_ARCH_LIST=$TORCH_CUDA_ARCH_LIST .. && make
32
+ # binaries will be available under tools/deploy/build
description ADDED
@@ -0,0 +1 @@
 
 
1
+ Unnamed repository; edit this file 'description' to name the repository.
docker-compose.yaml ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: "2.3"
2
+ services:
3
+ detectron2:
4
+ build:
5
+ context: .
6
+ dockerfile: Dockerfile
7
+ args:
8
+ USER_ID: ${USER_ID:-1000}
9
+ deploy:
10
+ resources:
11
+ reservations:
12
+ devices:
13
+ - capabilities:
14
+ - gpu
15
+ shm_size: "8gb"
16
+ ulimits:
17
+ memlock: -1
18
+ stack: 67108864
19
+ volumes:
20
+ - /tmp/.X11-unix:/tmp/.X11-unix:ro
21
+ environment:
22
+ - DISPLAY=$DISPLAY
23
+ - NVIDIA_VISIBLE_DEVICES=all
24
+ # Uncomment with proper source to access webcam from docker
25
+ # devices:
26
+ # - /dev/video0:/dev/video0
e0060b2b78b26e4cef9631a04e84db4eb2c567 ADDED
Binary file (1.14 kB). View file
 
e251e270498f1aed0bd37ea8b7cd1df50317e5 ADDED
Binary file (29 Bytes). View file
 
e98358175e37113dc547068ceb67a9cd7e9865 ADDED
@@ -0,0 +1 @@
 
 
1
+ x���0E]�/�4�1!��@��4m��H�� օo�m��~j!��U�&7�T�����8Jܯz۪� ����� nf����i ����+�4����cT�Wq�x̉|��4�*᧦&��Q&3� 6(c2LE� �-^�g̖� Lͧu��F�n��kS��p�t?�<4@
exclude ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ # git ls-files --others --exclude-from=.git/info/exclude
2
+ # Lines that start with '#' are comments.
3
+ # For a project mostly in C, the following would be a good set of
4
+ # exclude patterns (uncomment them if you want to use them):
5
+ # *.[oa]
6
+ # *~
f9e8490251dbc56e631a22442c501537ca0113 ADDED
Binary file (92 Bytes). View file
 
fsmonitor-watchman.sample ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/perl
2
+
3
+ use strict;
4
+ use warnings;
5
+ use IPC::Open2;
6
+
7
+ # An example hook script to integrate Watchman
8
+ # (https://facebook.github.io/watchman/) with git to speed up detecting
9
+ # new and modified files.
10
+ #
11
+ # The hook is passed a version (currently 2) and last update token
12
+ # formatted as a string and outputs to stdout a new update token and
13
+ # all files that have been modified since the update token. Paths must
14
+ # be relative to the root of the working tree and separated by a single NUL.
15
+ #
16
+ # To enable this hook, rename this file to "query-watchman" and set
17
+ # 'git config core.fsmonitor .git/hooks/query-watchman'
18
+ #
19
+ my ($version, $last_update_token) = @ARGV;
20
+
21
+ # Uncomment for debugging
22
+ # print STDERR "$0 $version $last_update_token\n";
23
+
24
+ # Check the hook interface version
25
+ if ($version ne 2) {
26
+ die "Unsupported query-fsmonitor hook version '$version'.\n" .
27
+ "Falling back to scanning...\n";
28
+ }
29
+
30
+ my $git_work_tree = get_working_dir();
31
+
32
+ my $retry = 1;
33
+
34
+ my $json_pkg;
35
+ eval {
36
+ require JSON::XS;
37
+ $json_pkg = "JSON::XS";
38
+ 1;
39
+ } or do {
40
+ require JSON::PP;
41
+ $json_pkg = "JSON::PP";
42
+ };
43
+
44
+ launch_watchman();
45
+
46
+ sub launch_watchman {
47
+ my $o = watchman_query();
48
+ if (is_work_tree_watched($o)) {
49
+ output_result($o->{clock}, @{$o->{files}});
50
+ }
51
+ }
52
+
53
+ sub output_result {
54
+ my ($clockid, @files) = @_;
55
+
56
+ # Uncomment for debugging watchman output
57
+ # open (my $fh, ">", ".git/watchman-output.out");
58
+ # binmode $fh, ":utf8";
59
+ # print $fh "$clockid\n@files\n";
60
+ # close $fh;
61
+
62
+ binmode STDOUT, ":utf8";
63
+ print $clockid;
64
+ print "\0";
65
+ local $, = "\0";
66
+ print @files;
67
+ }
68
+
69
+ sub watchman_clock {
70
+ my $response = qx/watchman clock "$git_work_tree"/;
71
+ die "Failed to get clock id on '$git_work_tree'.\n" .
72
+ "Falling back to scanning...\n" if $? != 0;
73
+
74
+ return $json_pkg->new->utf8->decode($response);
75
+ }
76
+
77
+ sub watchman_query {
78
+ my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
79
+ or die "open2() failed: $!\n" .
80
+ "Falling back to scanning...\n";
81
+
82
+ # In the query expression below we're asking for names of files that
83
+ # changed since $last_update_token but not from the .git folder.
84
+ #
85
+ # To accomplish this, we're using the "since" generator to use the
86
+ # recency index to select candidate nodes and "fields" to limit the
87
+ # output to file names only. Then we're using the "expression" term to
88
+ # further constrain the results.
89
+ my $last_update_line = "";
90
+ if (substr($last_update_token, 0, 1) eq "c") {
91
+ $last_update_token = "\"$last_update_token\"";
92
+ $last_update_line = qq[\n"since": $last_update_token,];
93
+ }
94
+ my $query = <<" END";
95
+ ["query", "$git_work_tree", {$last_update_line
96
+ "fields": ["name"],
97
+ "expression": ["not", ["dirname", ".git"]]
98
+ }]
99
+ END
100
+
101
+ # Uncomment for debugging the watchman query
102
+ # open (my $fh, ">", ".git/watchman-query.json");
103
+ # print $fh $query;
104
+ # close $fh;
105
+
106
+ print CHLD_IN $query;
107
+ close CHLD_IN;
108
+ my $response = do {local $/; <CHLD_OUT>};
109
+
110
+ # Uncomment for debugging the watch response
111
+ # open ($fh, ">", ".git/watchman-response.json");
112
+ # print $fh $response;
113
+ # close $fh;
114
+
115
+ die "Watchman: command returned no output.\n" .
116
+ "Falling back to scanning...\n" if $response eq "";
117
+ die "Watchman: command returned invalid output: $response\n" .
118
+ "Falling back to scanning...\n" unless $response =~ /^\{/;
119
+
120
+ return $json_pkg->new->utf8->decode($response);
121
+ }
122
+
123
+ sub is_work_tree_watched {
124
+ my ($output) = @_;
125
+ my $error = $output->{error};
126
+ if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
127
+ $retry--;
128
+ my $response = qx/watchman watch "$git_work_tree"/;
129
+ die "Failed to make watchman watch '$git_work_tree'.\n" .
130
+ "Falling back to scanning...\n" if $? != 0;
131
+ $output = $json_pkg->new->utf8->decode($response);
132
+ $error = $output->{error};
133
+ die "Watchman: $error.\n" .
134
+ "Falling back to scanning...\n" if $error;
135
+
136
+ # Uncomment for debugging watchman output
137
+ # open (my $fh, ">", ".git/watchman-output.out");
138
+ # close $fh;
139
+
140
+ # Watchman will always return all files on the first query so
141
+ # return the fast "everything is dirty" flag to git and do the
142
+ # Watchman query just to get it over with now so we won't pay
143
+ # the cost in git to look up each individual file.
144
+ my $o = watchman_clock();
145
+ $error = $output->{error};
146
+
147
+ die "Watchman: $error.\n" .
148
+ "Falling back to scanning...\n" if $error;
149
+
150
+ output_result($o->{clock}, ("/"));
151
+ $last_update_token = $o->{clock};
152
+
153
+ eval { launch_watchman() };
154
+ return 0;
155
+ }
156
+
157
+ die "Watchman: $error.\n" .
158
+ "Falling back to scanning...\n" if $error;
159
+
160
+ return 1;
161
+ }
162
+
163
+ sub get_working_dir {
164
+ my $working_dir;
165
+ if ($^O =~ 'msys' || $^O =~ 'cygwin') {
166
+ $working_dir = Win32::GetCwd();
167
+ $working_dir =~ tr/\\/\//;
168
+ } else {
169
+ require Cwd;
170
+ $working_dir = Cwd::cwd();
171
+ }
172
+
173
+ return $working_dir;
174
+ }
index ADDED
Binary file (217 Bytes). View file
 
index.html ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Upload File</title>
7
+ <style>
8
+ body {
9
+ font-family: Arial, sans-serif;
10
+ text-align: center;
11
+ margin-top: 50px;
12
+ }
13
+ #preview {
14
+ margin-top: 20px;
15
+ max-width: 500px;
16
+ max-height: 500px;
17
+ display: none;
18
+ }
19
+ </style>
20
+ </head>
21
+ <body>
22
+ <h1>Vehicle Damage Detection</h1>
23
+ <form id="uploadForm" enctype="multipart/form-data">
24
+ <label for="file">Upload an image:</label>
25
+ <input type="file" id="file" name="file" accept="image/*" required>
26
+ <br><br>
27
+ <img id="preview" alt="Image Preview">
28
+ <br><br>
29
+ <button type="submit">Upload and Analyze</button>
30
+ </form>
31
+ <p id="response"></p>
32
+
33
+ <script>
34
+ const fileInput = document.getElementById('file');
35
+ const preview = document.getElementById('preview');
36
+ const uploadForm = document.getElementById('uploadForm');
37
+ const responseElement = document.getElementById('response');
38
+
39
+ // Preview the selected image
40
+ fileInput.addEventListener('change', function () {
41
+ const file = fileInput.files[0];
42
+ if (file) {
43
+ const reader = new FileReader();
44
+ reader.onload = function (e) {
45
+ preview.src = e.target.result;
46
+ preview.style.display = 'block';
47
+ };
48
+ reader.readAsDataURL(file);
49
+ } else {
50
+ preview.style.display = 'none';
51
+ }
52
+ });
53
+
54
+ // Handle form submission
55
+ uploadForm.addEventListener('submit', async function (event) {
56
+ event.preventDefault();
57
+
58
+ const formData = new FormData();
59
+ formData.append('file', fileInput.files[0]);
60
+
61
+ responseElement.textContent = 'Uploading and analyzing...';
62
+
63
+ try {
64
+ const response = await fetch('/upload', {
65
+ method: 'POST',
66
+ body: formData
67
+ });
68
+
69
+ if (response.ok) {
70
+ const result = await response.json();
71
+ responseElement.innerHTML = `
72
+ <strong>Analysis Result:</strong><br>
73
+ Total Cost: $${result.total_cost}<br>
74
+ <ul>
75
+ ${result.damages.map(damage => `
76
+ <li>
77
+ Part: ${damage.part}, Area: ${damage.area_pixels} pixels, Cost: $${damage.cost_usd}
78
+ </li>
79
+ `).join('')}
80
+ </ul>
81
+ `;
82
+ } else {
83
+ responseElement.textContent = 'Error: Unable to analyze the image.';
84
+ }
85
+ } catch (error) {
86
+ responseElement.textContent = 'Error: ' + error.message;
87
+ }
88
+ });
89
+ </script>
90
+ </body>
91
+ </html>
install_detectron2.sh ADDED
File without changes
kaggle.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"username":"reiddson","key":"c0103af93ef7241309fc2308824981e0"}
kaggle.json:Zone.Identifier ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ [ZoneTransfer]
2
+ ZoneId=3
3
+ HostUrl=https://www.kaggle.com/
main ADDED
@@ -0,0 +1 @@
 
 
1
+ e0b64513a3a8c89484e90c1ce7d6107205dfa2bb
master ADDED
@@ -0,0 +1 @@
 
 
1
+ c07fb3351b345190fa253cc10972815b04e223a5
packed-refs ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # pack-refs with: peeled fully-peeled sorted
2
+ e0b64513a3a8c89484e90c1ce7d6107205dfa2bb refs/remotes/origin/main
3
+ c07fb3351b345190fa253cc10972815b04e223a5 refs/remotes/origin/master
post-update.sample ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to prepare a packed repository for use over
4
+ # dumb transports.
5
+ #
6
+ # To enable this hook, rename this file to "post-update".
7
+
8
+ exec git update-server-info