From 8f0e8fd7fe2e3ea90d1376d9e921de7d55ad0c9e Mon Sep 17 00:00:00 2001 From: Denys Seredenko Date: Sat, 19 Oct 2024 17:31:56 +0200 Subject: [PATCH] added corners,edges,counters to FV --- edges-corners-counters.py | 50 ----------------------------------- requirements.txt | 3 ++- src/create_feature_vectors.py | 26 ++++++++++++------ src/featue_extraction.py | 20 ++++++++++++++ src/feature.py | 1 + src/feature_vector.py | 13 ++++----- 6 files changed, 48 insertions(+), 65 deletions(-) delete mode 100644 edges-corners-counters.py diff --git a/edges-corners-counters.py b/edges-corners-counters.py deleted file mode 100644 index 1cbb265..0000000 --- a/edges-corners-counters.py +++ /dev/null @@ -1,50 +0,0 @@ -import cv2 -import numpy as np -from os import walk -import csv - -def detect_corners(gray_image, max_corners=100, quality_level=0.14, min_distance=1): - corners = cv2.goodFeaturesToTrack(cv2.blur(gray_image, (5,5)), maxCorners=max_corners, qualityLevel=quality_level, minDistance=min_distance) - if corners is not None: - corners = np.int0(corners) - return len(corners), corners - else: - return 0, [] - -def detect_edges(gray_image): - edges = cv2.Canny(cv2.blur(gray_image, (5,5)), threshold1=100, threshold2=200) - edge_count = np.count_nonzero(edges) - return edge_count, edges - - - -def detect_contours(edge_image): - contours, _ = cv2.findContours(edge_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) - contour_count = len(contours) - return contour_count, contours - - -def feature_vector(image_path): - resultVector = {} - img = cv2.imread(image_path) - image_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - - corners_count, _ = detect_corners(image_gray) - edges_count, edges = detect_edges(image_gray) - contours_count, _ = detect_contours(edges) - - resultVector["corners"] = corners_count % 100 - resultVector["edges"] = edges_count / 1000 - resultVector["contours"] = contours_count * 0.1 - - return resultVector - - -filenames = next(walk("images"), (None, None, []))[2] # [] if no file - -with open('dict.csv', 'w') as csv_file: - writer = csv.DictWriter(csv_file, fieldnames=['corners', 'edges', 'contours']) - writer.writeheader() - for filename in filenames: - result = feature_vector(f'images/{filename}') - writer.writerow(result) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 1db7aea..e8cac58 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -opencv-python \ No newline at end of file +opencv-python +np \ No newline at end of file diff --git a/src/create_feature_vectors.py b/src/create_feature_vectors.py index e608154..dbbf325 100644 --- a/src/create_feature_vectors.py +++ b/src/create_feature_vectors.py @@ -1,13 +1,14 @@ import os +import csv import cv2 as cv -from featue_extraction import get_color_percentage, get_raster_color_percentage +from featue_extraction import get_color_percentage, get_raster_color_percentage, get_edges, get_corners, get_contours from feature_vector import FeatureVector from concept import Concept from feature import Feature -img_path = "D:/uni/master/machine_learning/StreetsignRecognition/data/processed" -vector_path = "D:/uni/master/machine_learning/StreetsignRecognition/data/vectors" +img_path = "/Users/denysseredenko/StreetsignRecognition/data" +vector_path = "/Users/denysseredenko/StreetsignRecognition/vector" def get_concept(path) -> Concept: if "fahrtrichtung_links" in path: @@ -36,26 +37,35 @@ if __name__ == "__main__": for fname in fnames: image_path = os.path.join(dirpath, fname) + print(image_path) try: - # extract features + # prepare image image = cv.imread(image_path) + gray_image = cv.imread(image_path, cv.IMREAD_GRAYSCALE) + #extract features color_percentage_overall = get_color_percentage(image) color_percentage_rasters = get_raster_color_percentage(image, 4, 4) - # add more + edges_amount, edged_image = get_edges(gray_image) + edges_amount = round(edges_amount / 1000) + corners_amount = get_corners(gray_image) + contours_amount = get_contours(edged_image) except Exception: print("Failed for ", image_path) continue - + concept: Concept = get_concept(image_path) if concept == Concept.UNKNOWN: print("no concept found for ", image_path) continue vec: FeatureVector = FeatureVector(concept) + vec.add_feature(Feature.CORNERS, corners_amount) + vec.add_feature(Feature.EDGES, edges_amount) + vec.add_feature(Feature.COUNTOURS, contours_amount) vec.add_feature(Feature.OVERALL_COLOR_PERCENTAGE, color_percentage_overall) vec.add_feature(Feature.RASTER_COLOR_PERCENTAGE, color_percentage_rasters) - # add more + print(vec.get_vector()) - vec_path = os.path.join(save_path, fname) + vec_path = os.path.join(save_path, fname.split('.')[0]) vec.save(vec_path) \ No newline at end of file diff --git a/src/featue_extraction.py b/src/featue_extraction.py index 733bb4d..364eef3 100644 --- a/src/featue_extraction.py +++ b/src/featue_extraction.py @@ -67,3 +67,23 @@ def get_raster_color_percentage(image: cv.Mat, rows: int, cols: int) -> list[lis ret.append(new) return ret +def get_edges(gray_image: cv.Mat): + edges = cv.Canny(cv.blur(gray_image, (5,5)), threshold1=100, threshold2=200) + edge_count = np.count_nonzero(edges) + return edge_count, edges + +def get_corners(gray_image: cv.Mat): + max_corners = 100 + quality_level = 0.14 + min_distance = 1 + corners = cv.goodFeaturesToTrack(cv.blur(gray_image, (5,5)), maxCorners=max_corners, qualityLevel=quality_level, minDistance=min_distance) + if corners is not None: + corners = np.int0(corners) + return len(corners) + else: + return 0 + +def get_contours(edged_gray_image: cv.Mat): + contours, _ = cv.findContours(edged_gray_image, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) + contour_count = len(contours) + return contour_count diff --git a/src/feature.py b/src/feature.py index 27a34bf..42dab39 100644 --- a/src/feature.py +++ b/src/feature.py @@ -5,3 +5,4 @@ class Feature(Enum): RASTER_COLOR_PERCENTAGE = auto() CORNERS = auto() EDGES = auto() + COUNTOURS = auto() diff --git a/src/feature_vector.py b/src/feature_vector.py index 5ab9527..ae30279 100644 --- a/src/feature_vector.py +++ b/src/feature_vector.py @@ -26,7 +26,6 @@ class FeatureVector: feature_data: dict for val in feature_data.values(): ret.append(val) - print(ret) return ret elif feature == Feature.RASTER_COLOR_PERCENTAGE: @@ -36,15 +35,17 @@ class FeatureVector: for data in feature_data1d: for val in data.values(): ret.append(val) - print(ret) return ret elif feature == Feature.CORNERS: - #feature_data: int #? - return [-1] + ret.append(feature_data) + return ret elif feature == Feature.EDGES: - #feature_data: int #? - return [-1] + ret.append(feature_data) + return ret + elif feature == Feature.COUNTOURS: + ret.append(feature_data) + return ret def add_feature(self, key: Feature, value: Any) -> None: