Files
2026-03-31 13:28:59 +02:00

105 lines
3.9 KiB
Python

import tensorflow as tf
from tensorflow.keras import layers, models
import csv
import random
import cv2
import numpy as np
import math
import csv
import random
import config
def rotateImage(image, angle):
image_center=tuple(np.array(image.shape[1::-1])/2)
rot_mat=cv2.getRotationMatrix2D(image_center, angle, 1.0)
result=cv2.warpAffine(image, rot_mat, image.shape[1::-1], flags=cv2.INTER_LINEAR)
return result
def complete_dataset(image, image_ellipse, tab_images, tab_labels):
contours, hierarchy=cv2.findContours(image_ellipse[:, :, 0], cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
if len(contours) is not 2:
return 1
else:
if len(contours[0])<6 or len(contours[1])<6:
return 1
(x1, y1), (ma1, MA1), a1=cv2.fitEllipse(contours[0])
(x2, y2), (ma2, MA2), a2=cv2.fitEllipse(contours[1])
x=(x1+x2)/2
y=(y1+y2)/2
ma=(ma1+ma2)/2
MA=(MA1+MA2)/2
a=(a1+a2)/2
tab_images.append(image[:, :, 0])
tab_labels.append([x/config.norm, y/config.norm, MA/config.norm, ma/config.norm, a/180])
return 0
def prepare_data(fichier):
with open(fichier, newline='') as csvfile:
lignes=csv.reader(csvfile, delimiter=',')
next(lignes)
tab_images=[]
tab_labels=[]
nbr=0
for ligne in lignes:
image_orig=cv2.imread(config.dir_images+ligne[0])
if image_orig is None:
print("Fichier absent", config.dir_images+ligne[0])
continue
f_ellipse=ligne[0].split('.')[0]+"_Annotation.png"
image_ellipse_orig=cv2.imread(config.dir_images+f_ellipse)
if image_ellipse_orig is None:
print("Fichier absent", config.dir_images+f_ellipse)
continue
for angle in range(0, 360, 30):
if np.random.randint(2)==0:
h, w, c=image_orig.shape
H=int(h*1.4)
W=int(w*1.4)
h_shift=np.random.randint(H-h)
w_shift=np.random.randint(W-w)
i=np.zeros(shape=(H, W, c), dtype=np.uint8)
i[h_shift:h_shift+h, w_shift:w_shift+w, :]=image_orig
image_orig2=i
i=np.zeros(shape=(H, W, c), dtype=np.uint8)
i[h_shift:h_shift+h, w_shift:w_shift+w, :]=image_ellipse_orig
image_ellipse_orig2=i
else:
image_orig2=image_orig
image_ellipse_orig2=image_ellipse_orig
image=cv2.resize(image_orig2, (config.largeur, config.hauteur), interpolation=cv2.INTER_AREA)
image_ellipse=cv2.resize(image_ellipse_orig2, (config.largeur, config.hauteur), interpolation=cv2.INTER_AREA)
img_r=rotateImage(image, angle)
#if np.random.randint(3)==0:
# kernel_blur=np.random.randint(2)*2+1
# img_r=cv2.GaussianBlur(img_r, (kernel_blur, kernel_blur), 0)
bruit=np.random.randn(config.hauteur, config.largeur, 3)*random.randint(1, 50)
img_r=np.clip(img_r+bruit, 0, 255).astype(np.uint8)
img_ellipse=rotateImage(image_ellipse, angle)
nbr+=complete_dataset(img_r, img_ellipse, tab_images, tab_labels)
img_f=cv2.flip(img_r, 0)
img_ellipse_f=cv2.flip(img_ellipse, 0)
nbr+=complete_dataset(img_f, img_ellipse_f, tab_images, tab_labels)
img_f=cv2.flip(img_r, 1)
img_ellipse_f=cv2.flip(img_ellipse, 1)
nbr+=complete_dataset(img_f, img_ellipse_f, tab_images, tab_labels)
img_f=cv2.flip(img_r, -1)
img_ellipse_f=cv2.flip(img_ellipse, -1)
nbr+=complete_dataset(img_f, img_ellipse_f, tab_images, tab_labels)
print("Image(s) rejetée(s):", nbr)
print("Nombre d'images:", len(tab_images))
return tab_images, tab_labels