105 lines
3.9 KiB
Python
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
|
||
|
|
|