Road Crack Analyzer PT
๋๋ก ์ ์ฌ์์(Orthophoto)์์ ๊ท ์ด ๋ฐ ํฌํธํ์ ์๋ ํ์ง/๋ถ์ํ๊ธฐ ์ํ ๋ชจ๋ธ ๊ฐ์ค์น ๋ชจ์์
๋๋ค.
๊ฐ์ค์น ํ์ผ ๊ตฌ์กฐ
MhRnd/road-crack-analyzer-pt/
โโโ yolo_best_2.pt # YOLOv8s ๊ท ์ด ํ์ง (22MB)
โโโ conv_best.pth # ConvNeXt-Tiny ๋ถ๋ฅ๊ธฐ (319MB)
โโโ segformer-b2-finetuned_orthophoto_gaussian_crack_0920_512/ # Segformer-B2 ๊ท ์ด (105MB)
โ โโโ config.json
โ โโโ model.safetensors
โโโ segformer-b0-finetuned-pothole_0830_1024/ # Segformer-B0 ํฌํธํ (15MB)
โ โโโ config.json
โ โโโ model.safetensors
โโโ segformer-b0-finetuned-ade-512-512/ # Segformer Feature Extractor
โโโ preprocessor_config.json
๋ชจ๋ธ ๊ตฌ์ฑ
1. YOLO v8 - ๊ท ์ด ์์ญ ํ์ง
| ํญ๋ชฉ |
๋ด์ฉ |
| ํ์ผ๋ช
|
yolo_best_2.pt |
| ์ํคํ
์ฒ |
YOLOv8s |
| ์ฉ๋ |
ํจ์น ๋ด ๊ท ์ด ์์ญ ์ฌ์ ํํฐ๋ง (Object Detection) |
| ์
๋ ฅ |
RGB ์ด๋ฏธ์ง (imgsz=1920) |
| ํ์ต ๋ฐ์ดํฐ |
๋๋ก ์ ์ฌ์์ ๊ท ์ด ๋ฐ์ด๋ฉ ๋ฐ์ค |
2. Crack Segmentor - ๊ท ์ด ์ธ๊ทธ๋ฉํ
์ด์
| ํญ๋ชฉ |
๋ด์ฉ |
| ๋๋ ํ ๋ฆฌ |
segformer-b2-finetuned_orthophoto_gaussian_crack_0920_512/ |
| ์ํคํ
์ฒ |
SegformerForSemanticSegmentation (B2) |
| Feature Extractor |
segformer-b0-finetuned-ade-512-512/ |
| ์
๋ ฅ |
RGB ํจ์น ์ด๋ฏธ์ง |
| ์ถ๋ ฅ |
์ธ๊ทธ๋ฉํ
์ด์
๋ง์คํฌ (background=0, crack>0) |
| ํ์ต ๋ฐ์ดํฐ |
๋๋ก ์ ์ฌ์์ ๊ท ์ด ๋ง์คํฌ (Gaussian augmentation ์ ์ฉ) |
from transformers import SegformerForSemanticSegmentation, SegformerImageProcessor
model = SegformerForSemanticSegmentation.from_pretrained(
"MhRnd/road-crack-analyzer-pt",
subfolder="segformer-b2-finetuned_orthophoto_gaussian_crack_0920_512"
)
extractor = SegformerImageProcessor.from_pretrained(
"MhRnd/road-crack-analyzer-pt",
subfolder="segformer-b0-finetuned-ade-512-512"
)
inputs = extractor(images=patch, return_tensors="pt")
outputs = model(**inputs)
pred = nn.functional.interpolate(
outputs.logits, size=(512, 512), mode="bilinear", align_corners=False
).argmax(dim=1)[0].numpy()
3. Pothole Segmentor - ํฌํธํ ์ธ๊ทธ๋ฉํ
์ด์
| ํญ๋ชฉ |
๋ด์ฉ |
| ๋๋ ํ ๋ฆฌ |
segformer-b0-finetuned-pothole_0830_1024/ |
| ์ํคํ
์ฒ |
SegformerForSemanticSegmentation (B0) |
| ์
๋ ฅ |
RGB ํจ์น ์ด๋ฏธ์ง (512x512 resize) |
| ์ถ๋ ฅ |
์ธ๊ทธ๋ฉํ
์ด์
๋ง์คํฌ (background=0, pothole=255) |
| min_bbox_size |
50px |
model = SegformerForSemanticSegmentation.from_pretrained(
"MhRnd/road-crack-analyzer-pt",
subfolder="segformer-b0-finetuned-pothole_0830_1024"
)
4. ConvNeXt Classifier - ๊ท ์ด ์ ํ ๋ถ๋ฅ
| ํญ๋ชฉ |
๋ด์ฉ |
| ํ์ผ๋ช
|
conv_best.pth |
| ์ํคํ
์ฒ |
ConvNeXt-Tiny |
| ์ฉ๋ |
๊ท ์ด ์ ํ ๋ถ๋ฅ (LC / TC / AC) |
| ์
๋ ฅ |
๊ท ์ด crop ์ด๋ฏธ์ง (256x256 resize, ImageNet ์ ๊ทํ) |
| ์ถ๋ ฅ |
3-class logits |
| ํด๋์ค |
0: LC (์ข
๋ฐฉํฅ ๊ท ์ด), 1: TC (ํก๋ฐฉํฅ ๊ท ์ด), 2: AC (๊ฑฐ๋ถ๋ฑ ๊ท ์ด) |
| ์ฒดํฌํฌ์ธํธ ํค |
checkpoint["model"] |
from huggingface_hub import hf_hub_download
path = hf_hub_download("MhRnd/road-crack-analyzer-pt", "conv_best.pth")
cls_model = convnext_tiny(num_classes=3)
checkpoint = torch.load(path, map_location=device, weights_only=False)
cls_model.load_state_dict(checkpoint["model"])
cls_model.eval()
transforms = T.Compose([
T.Resize(256, interpolation=T.InterpolationMode.BICUBIC),
T.ToTensor(),
T.Normalize(IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD),
])
img = Image.fromarray(crack_crop).convert("RGB")
pred = torch.argmax(cls_model(transforms(img).unsqueeze(0)))
ํ์ดํ๋ผ์ธ
์
๋ ฅ ์ด๋ฏธ์ง
|
ํจ์น ๋จ์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ (size=1024, stride=682)
|-- [Crack Segmentor] Segformer-B2 ๊ท ์ด ์ธ๊ทธ๋ฉํ
์ด์
| +-- logits -> upsample 512x512 -> argmax -> resize
| +-- Contour ์ถ์ถ (area > 100) -> Polygon + Buffer (40px)
+-- [Pothole Segmentor] Segformer-B0 ํฌํธํ ์ธ๊ทธ๋ฉํ
์ด์
+-- resize 512x512 -> logits -> upsample -> argmax
+-- Contour ์ถ์ถ (bbox > 50px)
|
Crack Polygon ๋ณํฉ (unary_union)
|
[ConvNeXt Classifier] ๊ท ์ด ์ ํ ๋ถ๋ฅ (LC/TC/AC)
|
ํญ/๊ธธ์ด/๋ฉด์ ์ธก์
|
๊ฒฐ๊ณผ ์ถ๋ ฅ
๊ท ์ด ์ ํ ์ ์
| ์ฝ๋ |
์ด๋ฆ |
์ค๋ช
|
์์ (BGR) |
| LC |
Longitudinal Crack |
์ข
๋ฐฉํฅ ๊ท ์ด (๋๋ก ์งํ ๋ฐฉํฅ) |
(255, 0, 0) |
| TC |
Transverse Crack |
ํก๋ฐฉํฅ ๊ท ์ด (๋๋ก ์ง๊ฐ ๋ฐฉํฅ) |
(0, 0, 255) |
| AC |
Alligator Crack |
๊ฑฐ๋ถ๋ฑ ๊ท ์ด (๋ง์ ๊ท ์ด) |
(0, 255, 0) |
| POT |
Pothole |
ํฌํธํ |
(255, 0, 255) |
๋ถ์ ํ๋ผ๋ฏธํฐ
| ํ๋ผ๋ฏธํฐ |
๊ฐ |
์ค๋ช
|
size |
1024 |
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ํจ์น ํฌ๊ธฐ |
over |
682 |
ํจ์น stride (size / 1.5) |
buffer_size |
40 |
๊ท ์ด polygon buffer ํฌ๊ธฐ |
min_crack_area |
100 |
์ต์ ๊ท ์ด contour ๋ฉด์ |
min_pothole_bbox |
50 |
์ต์ ํฌํธํ ๋ฐ์ด๋ฉ ๋ฐ์ค ํฌ๊ธฐ |
๊ด๋ จ ๋ ํฌ์งํ ๋ฆฌ