taekyungss / Tomato_Disease_Detector

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

๐Ÿ… TOMATO_DISEASE_DETECTOR

๐Ÿ•’Development period

23.06.20 - 23.07.03

๐Ÿ–ฅ๏ธSubject

์‹๋ฌผ ๋ณ‘์ถฉํ•ด ํƒ์ง€

YOLO, Retinanet, Faster R-CNN์„ ์ด์šฉํ•˜์—ฌ ์‹๋ฌผ ๋ณ‘์ถฉํ•ด๋ฅผ ํƒ์ง€ํ•˜๋Š” DETECTOR๋ฅผ ์ œ์ž‘ํ•˜๊ณ  ์„ธ ๋ชจ๋ธ ๊ฐ„์˜ ์„ฑ๋Šฅ๋น„๊ต์™€ one stage detector์™€ two stage detector ๊ฐ„์˜ ์„ฑ๋Šฅ ๋น„๊ต๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

DATASET

Ai-hub "์‹œ์„ค ์ž‘๋ฌผ ์งˆ๋ณ‘ ์ง„๋‹จ ์ด๋ฏธ์ง€" DataSet

Ai-hub์—์„œ ์ œ๊ณตํ•˜๋Š” dataset ์ค‘ ํ† ๋งˆํ† ์˜ data๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋งํฌ : Ai-hub "์‹œ์„ค ์ž‘๋ฌผ ์งˆ๋ณ‘ ์ง„๋‹จ ์ด๋ฏธ์ง€"

Result

์ •์ƒ

๋จผ์ €, ์ •์ƒ ์‹๋ฌผ์— ๋Œ€ํ•ด ์„ธ ๊ฐ€์ง€ ๋ชจ๋ธ๋กœ ํƒ์ง€ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. Faster R-CNN๋งŒ์ด ์ •์ƒ ์‹๋ฌผ๋กœ ํƒ์ง€ํ–ˆ๊ณ  YOLOv8๊ณผ RetinaNet์€ ํ™ฉํ™”์žŽ๋ง์ด๋ฐ”์ด๋Ÿฌ์Šค๋กœ ํƒ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋Œ€์ ์œผ๋กœ ์ •์ƒ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜๊ฐ€ ์ ์—ˆ๊ณ  ๋ง๋ ค์žˆ๋“ฏํ•œ ์žŽ ๋•Œ๋ฌธ์— ์งˆ๋ณ‘2๋กœ ํƒ์ง€ํ•ด๋ƒˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Faster R-CNN YOLOv8 RetinaNet

์งˆ๋ณ‘1(ํ† ๋งˆํ†  ์žŽ ๊ณฐํŒก์ด๋ณ‘)

๋‹ค์Œ์€ ์ฒซ ๋ฒˆ์งธ ์งˆ๋ณ‘์ธ ํ† ๋งˆํ†  ์žŽ ๊ณฐํŒก์ด๋ณ‘์ž…๋‹ˆ๋‹ค. ์žŽ ๋’ท๋ฉด์— ๋ณ‘๋ฐ˜์ด ์ƒ๊ธฐ๊ณ  ๊ฐˆ์ƒ‰ ๊ณฐํŒก์ด๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ํ™ฉ์ƒ‰์œผ๋กœ ๋ณ€ํ•˜๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ ํƒ์ง€ ๋ชจ๋ธ ๋ชจ๋‘ ์ž˜ ํƒ์ง€ํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค.

Faster R-CNN YOLOv8 RetinaNet

์งˆ๋ณ‘2(ํ™ฉํ™”์žŽ๋ง์ด๋ฐ”์ด๋Ÿฌ์Šค)

๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ ์งˆ๋ณ‘์ธ ํ™ฉํ™”์žŽ๋ง์ด๋ฐ”์ด๋Ÿฌ์Šค์ž…๋‹ˆ๋‹ค. ํ™ฉํ™”์žŽ๋ง์ด๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์–ด๋ฆฐ์žŽ์ด ์ชผ๊ทธ๋ผ๋“ค๊ณ  ๋…ธ๋ž—๊ฒŒ ๋ณ€ํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ ํƒ์ง€ ๋ชจ๋ธ ๋ชจ๋‘ ์ž˜ ํƒ์ง€ํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค.

Faster R-CNN YOLOv8 RetinaNet

Inference

YOLOv8

google colab์—์„œ ์ง„ํ–‰

 !pip install ultralytics

 import ultralytics

 ultralytics.checks()

 from ultralytics import YOLO

 model = YOLO('yolov8s.pt')

 model.train(data = '/content/drive/MyDrive/dataset_root/data.yaml', epochs = 10, batch= 16)

๊ฒฐ๊ณผ ํ™•์ธ

import cv2
from google.colab.patches import cv2_imshow

%cd '/content/drive/MyDrive/ultralytics'
original_image = cv2.imread('/content/drive/MyDrive/KakaoTalk_20230707_143733806.jpg')
model = YOLO('/content/drive/MyDrive/BEST.pt (class7 & class 3)/runs/detect/train3_แ„‰แ…ฅแ†ผแ„€แ…ฉแ†ผ class 3แ„€แ…ข/weights/best.pt')
result = model.predict(source='/content/drive/MyDrive/KakaoTalk_20230707_143733806.jpg', save=True, imgsz=640)

# ์ด๋ฏธ์ง€ ์ถœ๋ ฅ
cv2_imshow(original_image)
# ์ด๋ฏธ์ง€ ๋กœ๋“œ
image = cv2.imread('/content/drive/MyDrive/ultralytics/runs/detect/predict24/KakaoTalk_20230707_143733806.jpg')

# ์ด๋ฏธ์ง€ ์ถœ๋ ฅ
cv2_imshow(image)

Faster R-CNN ๊ตฌํ˜„

train code : FasterRCNN/src/engine

#20 epoch, 4 batch ํ•™์Šต

#class ๋ถ„๋ฅ˜
#0 : background
#1 : ์ •์ƒ
#2 : 18๋ฒˆ ์งˆ๋ณ‘ - ํ† ๋งˆํ† ์žŽ๊ณฐํŒก์ด๋ณ‘
#3 : 19๋ฒˆ ์งˆ๋ณ‘ - ํ† ๋งˆํ† ํ™ฉํ™”์žŽ๋ง์ด๋ฐ”์ด๋Ÿฌ์Šค

Faster R-CNN ๊ฒฐ๊ณผ ํ™•์ธ

inference code : FasterRCNN/src/inference

detection_threshold = 0.4

for i in range(len(test_images)):
    image_name = test_images[i].split('\\')[-1].split('.')[0]
    image = cv2.imread(test_images[i])
    orig_image = image.copy()
    image = cv2.cvtColor(orig_image, cv2.COLOR_BGR2RGB).astype(float)
    image /= 255.0
    image = np.transpose(image, (2, 0, 1)).astype(float)
    image = torch.tensor(image, dtype=torch.float).cuda()
    image = torch.unsqueeze(image, 0)
    with torch.no_grad():
        outputs = model(image)

    outputs = [{k: v.to('cpu') for k, v in t.items()} for t in outputs]
    if len(outputs[0]['boxes']) != 0:
        boxes = outputs[0]['boxes'].data.numpy()
        scores = outputs[0]['scores'].data.numpy()
        boxes = boxes[scores >= detection_threshold].astype(np.int32)
        draw_boxes = boxes.copy()
        pred_classes = [CLASSES[i] for i in outputs[0]['labels'].cpu().numpy()]

        for j, box in enumerate(draw_boxes):
            cv2.rectangle(orig_image,
                          (int(box[0]), int(box[1])),
                          (int(box[2]), int(box[3])),
                          (0, 0, 255), 2)


            cv2.putText(orig_image, str(pred_classes[j]),
                        (int(box[0]), int(box[1] - 5)),
                        cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0),
                        5, lineType=cv2.LINE_AA)


        cv2.imshow('Prediction', orig_image)
        cv2.waitKey(1)
        cv2.imwrite(f"../test_predictions/{image_name}.jpg", orig_image, )
    print(f"Image {i + 1} done...")
    print('-' * 50)
print('TEST PREDICTIONS COMPLETE')
cv2.destroyAllWindows()

RetinaNet

Inference

# load retinanet model
model = models.load_model('/content/drive/MyDrive/tomato/resnet50_csv_13_infer.h5', backbone_name='resnet50')

# load label to names mapping for visualization purposes
labels_to_names = {0:'normal',1:'disease1',2:'disease2'}
# load image
image = read_image_bgr('/content/test.JPG')

# copy to draw on
draw = image.copy()
draw = cv2.cvtColor(draw, cv2.COLOR_BGR2RGB)

# preprocess image for network
image = preprocess_image(image)
image, scale = resize_image(image)

# process image
boxes, scores, labels = model.predict_on_batch(np.expand_dims(image, axis=0))

# correct for image scale
boxes /= scale

for box, score, label in zip(boxes[0], scores[0], labels[0]):
    # scores are sorted so we can break
    if score < 0.45:
        break

    color = label_color(label)

    b = box.astype(int)
    draw_box(draw, b, color=color)

    caption = "{}".format(labels_to_names[label])
    cv2.putText(draw, caption, (b[0], b[1] - 10), cv2.FONT_HERSHEY_PLAIN, 5, (0, 0, 0), 3)
    cv2.putText(draw, caption, (b[0], b[1] - 10), cv2.FONT_HERSHEY_PLAIN, 5, (255, 255, 255), 2)

plt.figure(figsize=(15, 15))
plt.axis('off')
plt.imshow(draw)
plt.show()

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ppt ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. 23 ๋ด„ ๊ธฐ์ˆ˜ ์˜คํ”ˆ ์„ธ๋ฏธ๋‚˜ ๋ฐœํ‘œ ์ž๋ฃŒ_์ฝค๋น„๋„ค์ด์…˜.pdf

About


Languages

Language:Jupyter Notebook 99.8%Language:Python 0.2%