Files
cours-ai-tutorials/Tensorflow/concours_foetus/common.py

105 lines
3.9 KiB
Python
Raw Normal View History

2026-03-31 13:28:59 +02:00
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