File size: 2,793 Bytes
87627fc
 
d1d7e79
87627fc
 
 
 
 
 
 
 
 
 
 
d1d7e79
87627fc
 
d1d7e79
87627fc
 
 
 
 
d1d7e79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87627fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d1d7e79
 
 
87627fc
d1d7e79
87627fc
d1d7e79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from zern_generator import Zernike
from PIL import Image
from fraunhofer_test import Fraunhofer, FraunhoferGPU
import cupy as cp
import matplotlib.pyplot as plt
import itertools
from time import time
from pprint import pprint
import os
from multiprocessing import Pool, cpu_count
import numpy as np

zernike = Zernike()
zernike.set_image_params(npix=2 ** 8)
fraunhofer = FraunhoferGPU(zernike)


def generate_image(z, group_depth):
    arr = fraunhofer.generate_diff(1, 0, *z)
    a = cp.min(arr[2])
    b = cp.max(arr[2])
    img_arr = ((arr[2] - a) / (b - a) * 255).astype(cp.uint8)
    img = Image.fromarray(np.stack([img_arr] * 3, axis=-1), mode='RGB')
    
    coeffs = '_'.join([f'{x:.2f}' for x in z[group_depth:]])
    group = "/".join([str(x) for x in z[:group_depth]])
    path = f'./screens_tst/{group}'
    if not os.path.exists(path):
        try:
            os.makedirs(path)
        except:
            print("Directory already exists. Skipping.")
    filename = f'{path}/{coeffs}_.png'
    img.save(filename)
    
    


def generate_dataset(range, step, kf_cnt):
    zs = get_zernike_coeffs(range, step, kf_cnt)
    num_workers = 24
    if num_workers is None:
        num_workers = cpu_count()

    with Pool(num_workers) as pool:
        results = []
        for result in pool.imap_unordered(generate_image, zs):
            results.append(result)
        for result in results:
            result.get()


def generate_dataset_gpu(zs):
    c = 0
    window_size = 50
    times = []
    start_time = time()
    total_images = len(zs)
    num_workers = 24
    if num_workers is None:
        num_workers = cpu_count()

    for z in zs:

        generate_image(z)
        
def get_zernike_coeffs(range, step, kf_cnt):
    points = tuple(np.linspace(*range, int((range[1] - range[0]) / step + 1)))
    points_as_tuples = tuple(float(x) for x in points)
    return np.array(list(set(itertools.product(points_as_tuples, repeat=kf_cnt))))

if __name__ == '__main__':
    # rng = (-5, 5)
    # step = 0.5
    # points = tuple(np.linspace(*rng, int((rng[1] - rng[0]) / step + 1)))
    # points_as_tuples = tuple(float(x) for x in points)

    zernikes = get_zernike_coeffs((-5,5), 0.25, 2)
    
    print("Total images: ", len(zernikes))
    total_gen_time, total_save_time = 0, 0
    start = time()
    for i, z in enumerate(zernikes):
        generate_image(z, 1)
        if i % 100 == 0:
            print(f"{i}/{len(zernikes)}")
    print("Average generation time: ", (time()-start)/len(zernikes))
    
    # generate_dataset(zernikes)
    # last = 1
    # for i in range(1,6):
        
    #     p = get_zernike_coeffs([-5,5], 0.25, i)
    #     print(f"Количество коэфф-ов: {i} -> Количество комбинаций: {len(p)}")
    #     last = len(p)