avori / src /process.py
Alimustoofaa's picture
first commit
0e549ca
import cv2
import numpy as np
from .apps.detection import Detection
from .apps.classification import Classification
from .configs.models import *
from .utils.colors import recognize_color
from typing import List
from typing import Optional
from pydantic import BaseModel
detection_config = DETECTION_CONFIG['avocado']
classification_config = CLASSIFICATION_CONFIG['avocado']
detection = Detection(ROOT_PATH, detection_config)
classification = Classification(ROOT_PATH, classification_config)
def get_avg_color(image):
img_temp = image.copy()
img_temp[:,:,0], img_temp[:,:,1], img_temp[:,:,2] = np.average(image, axis=(0,1))
img_temp = cv2.resize(img_temp, (25,25))
return img_temp
def get_texture_image(image):
h, w = image.shape[:2]
# Calculate centroid
cx, cy= int(w/2), int(h/2)
# radius crop
radius_cx , radius_cy = int(0.5*cx), int(0.5*cy)
x_min, y_min, x_max, y_max = cx-radius_cx, cy-radius_cy, cx+radius_cx, cy+radius_cy
return image[y_min:y_max, x_min:x_max]
def image_classification(image):
results = list()
image_resize = cv2.resize(
image.copy(),
(classification_config['image_size'],
classification_config['image_size']),
interpolation = cv2.INTER_AREA)
results_class = classification(image_resize)
for i in results_class:
results.append([i[0], int(i[1]*100)])
print(f'Classification : {i[0]} | confidecne : {int(i[1]* 100)} %')
return results
class Detection(BaseModel):
label : str
conf : float
bbox : list
class ResultFruit(BaseModel):
detection : Optional[Detection] = {}
classification_texture: Optional[list] = []
classification_color: Optional[str] = ''
def main_process(image):
# results_fruit = {
# 'detection': None,
# 'classification_texture': list(),
# 'classification_color': None
# }
image_resize = cv2.resize(
image.copy(),
(detection_config['image_size'],
detection_config['image_size']),
interpolation = cv2.INTER_AREA)
cv2.imwrite('image.jpg', image)
# Detection
results = detection(image_resize, size=detection_config['image_size'])
result_detection = detection.extract_results(
results, 0.0,
get_one=True,
boxes_ori=True,
resized_size=detection_config['image_size'])
print(result_detection)
# results['detection'] = result_detection
try:
confidence_c = result_detection['avocado'][0]['confidence']
x_min_a, y_min_a, x_max_a, y_max_a = result_detection['avocado'][0]['bbox']
img_avocade = image[y_min_a:y_max_a, x_min_a:x_max_a]
# get texture image
img_texture = get_texture_image(img_avocade)
# classification
result_classification = image_classification(img_texture)
# Color classification
avg_color = get_avg_color(img_texture)
b,g,r = avg_color[1,1]
b,g,r =int(b),int(g),int(r)
result_color = recognize_color(b,g,r)
result_fruit = ResultFruit(
detection= {'label': 'avocado', 'conf': int(confidence_c*100), 'bbox': [x_min_a, y_min_a, x_max_a, y_max_a]},
classification_texture = result_classification,
classification_color = result_color
)
except KeyError:
result_fruit = ResultFruit()
# print(result_fruit.json())
# print(type(result_fruit.json()))
return result_fruit