import random
import math
import sys
from PIL import Image, ImageDraw
import numpy as np
xLim = 28
yLim = 28
radius = 4
generatePoint = lambda: (random.random()*(xLim - 2*radius) + radius, random.random()*(yLim - 2*radius) + radius)
distance = lambda p1, p2: math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)
def genCircles(num):
tries = 0
circles = []
while num > 0:
# In pathalogical cases, this can get stuck. Limit the number
# of tries, and retry.
tries += 1
if tries > 100:
return genCircles(num + len(circles))
center = generatePoint()
if any(map(lambda circle: distance(center, circle) < 2*radius, circles)):
continue
num -= 1
circles.append(center)
return circles
def drawCircles(centerPoints):
im = Image.new("L", (xLim, yLim))
draw = ImageDraw.Draw(im)
for point in centerPoints:
topLeft = (point[0] - radius, point[1] - radius)
bottomRight = (point[0] + radius, point[1] + radius)
draw.ellipse([topLeft, bottomRight], fill=255)
return im
trainSize = 60000
testSize = 10000
trainImages = np.empty((trainSize, 28, 28), dtype=np.uint8)
trainLabels = np.empty((trainSize,), dtype=np.uint8)
testImages = np.empty((testSize, 28, 28), dtype=np.uint8)
testLabels = np.empty((testSize,), dtype=np.uint8)
for i in range(trainSize):
num = random.randrange(1, 7)
circles = genCircles(num)
circles = drawCircles(circles)
circles = np.array(circles)
trainImages[i] = circles
trainLabels[i] = num
for i in range(testSize):
num = random.randrange(1, 7)
circles = genCircles(num)
circles = drawCircles(circles)
circles = np.array(circles)
testImages[i] = circles
testLabels[i] = num
np.save("dataset/trainData.npy", trainImages)
np.save("dataset/trainLabels.npy", trainLabels)
np.save("dataset/testData.npy", testImages)
np.save("dataset/testLabels.npy", testLabels)