PROJECT/사물인식 Project

사물인식 Project | django와 yolov5 연결하기

JUNG씨 2022. 10. 24. 00:17

✔️ machine.py

import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import torch
import cv2
from django.conf import settings 


# yolov5 깃헙 저장소에서 모델을 로드
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

# 사람 수 세어주는 함수
def transform_image(image):
    img = cv2.imread(settings.BASE_DIR/image[1:])

    results = model(img)
    result = results.pandas().xyxy[0].to_numpy()
    result = [item for item in result if item[6]=='person']

    return len(result)


# 사람 인식해서 네모모양으로 찍어주는 함수
def rectangle_image(image,write_image):

    img = cv2.imread(settings.BASE_DIR/image[1:])

    results = model(img)
    result = results.pandas().xyxy[0].to_numpy()
    result = [item for item in result if item[6]=='person']

    tmp_img = cv2.imread(settings.BASE_DIR/image[1:])
    for j in range(len(result)):
        cv2.rectangle(tmp_img, (int(results.xyxy[0][j][0].item()), int(results.xyxy[0][j][1].item())), (int(results.xyxy[0][j][2].item()), int(results.xyxy[0][j][3].item())), (255,255,255))
    cv2.imwrite(settings.BASE_DIR/write_image[1:], tmp_img)
    return tmp_img

 

 

✔️ views.py

from support_data.machine import transform_image
from support_data.machine import rectangle_image



@login_required   
def upload(request):
    if request.method == 'GET':
        return render(request, 'support_data/upload.html')
    if request.method == 'POST':
        image = request.FILES.get('image','')
        # 이미지값이 없을 때 오류처리
        if not image:
            return render(request,'support_data/upload.html',{'error':'사진을 첨부해주세요!','image':image})
        write_image = request.FILES.get('image','')
        team_name = request.user
        input_num = request.POST.get('input_num','')
        # 입력값이 없을 때 오류처리
        if not input_num:
            return render(request,'support_data/upload.html',{'error':'숫자를 입력해주세요!','input_num':input_num})
        my_image = Support.objects.create(image=image,write_image=write_image, team_name=team_name,input_num=input_num)
        my_image.save()
        # 머신러닝 코드 불러오기
        my_image.people_num = transform_image(my_image.image.url)
        rectangle_image(my_image.image.url,my_image.write_image.url)
        my_image.save()
        if int(input_num) == my_image.people_num:
            return redirect(f'/result/{my_image.id}/')
        else:
            return redirect(f'/error/{my_image.id}/')