from jyro.simulator import *
from conx import *
from IPython.display import display
import random
import numpy as np
Using Theano backend. conx, version 3.5.9
def make_world(physics):
physics.addBox(0, 0, 5, 5, fill="gray", wallcolor="gray")
physics.addBox(0, 0, 0.5, 0.5, fill="blue", wallcolor="blue")
physics.addBox(0, 5, 0.5, 4.5 , fill="red", wallcolor="red")
physics.addBox(4.5, 4.5, 5, 5, fill="green", wallcolor="green")
physics.addBox(4.5, 0, 5, 0.5, fill="purple", wallcolor="purple")
physics.addBox(2, 1.75, 2.5, 3.25, fill="orange", wallcolor="orange")
physics.addLight(3, 2.5, 1)
def make_robot():
robot = Pioneer("Pioneer", 3, 1, 0)
robot.addDevice(Camera())
robot.addDevice(Pioneer16Sonars())
robot.addDevice(PioneerFrontLightSensors(3))
return robot
robot = make_robot()
robot.mystep = 0
robot.priority = random.choice(["left", "right"])
sim = Simulator(robot, make_world)
def get_quadrant(x, y, max_x=5, max_y=5):
if x <= max_x/2 and y <= max_y/2:
return 1
elif x <= max_x/2 and y >= max_y/2:
return 2
elif x >= max_x/2 and y >= max_y/2:
return 3
else:
return 4
SAMPLES = 500
def controller(robot):
if robot.mystep % 200 == 0:
robot.priority = "left" if robot.priority == "right" else "right"
image = robot["camera"].getData()
x, y, h = robot.getPose()
quad = get_quadrant(x, y)
ls = list(robot.targets)
counts = [ls.count(n) for n in [1,2,3,4]]
if quad > len(counts) or counts[quad-1] < SAMPLES:
robot.images.append(image)
robot.targets.append(quad)
sonar = robot["sonar"].getData()
left = min(sonar[0:4])
right = min(sonar[4:8])
clearance = 0.5
noise = random.gauss(0, 0.2)
if robot.priority == "left":
if left < clearance or right < clearance:
robot.move(0, -0.5+noise)
else:
robot.move(0.5+noise, 0)
else:
if left < clearance or right < clearance:
robot.move(0, 0.5+noise)
else:
robot.move(0.5+noise, 0)
robot.mystep += 1
robot.brain = controller
robot.images = []
robot.targets = []
i = 0
while True:
if i % 100 == 0:
print(i, end=" ")
#display(robot["camera"].getImage())
sim.step(run_brain=True)
ls = list(robot.targets)
x = [ls.count(n) for n in [1,2,3,4]]
if min(x) == SAMPLES:
break
i += 1
## Now trim all of them to same length
with open("vision_images.npy", "wb") as fp:
np.save(fp, robot.images)
with open("vision_targets.npy", "wb") as fp:
np.save(fp, robot.targets)
print("done collecting data")
0 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000 3100 3200 3300 3400 3500 3600 3700 3800 3900 4000 4100 done collecting data
!ls -l *.npy
-rw-r--r-- 1 dblank dblank 57600128 Jan 27 12:31 vision_images.npy -rw-r--r-- 1 dblank dblank 16128 Jan 27 12:31 vision_targets.npy
vision_images = np.load("vision_images.npy")
print(vision_images.shape)
vision_targets = np.load("vision_targets.npy")
print(vision_targets.shape)
(2000, 40, 60, 3) (2000,)
ls = list(vision_targets)
x = [ls.count(n) for n in [1,2,3,4]]
print(x)
print(sum(x))
[500, 500, 500, 500] 2000
from conx import *
def vision_network(actf):
net = Network("Vision Controller")
net.add(ImageLayer("img_input", (40,60), 3))
net.add(Conv2DLayer("conv1", 10, (5, 5),
activation=actf))
net.add(Conv2DLayer("conv2", 10, (5, 5),
activation=actf))
net.add(MaxPool2DLayer("pool1",
pool_size=(2,2)))
net.add(FlattenLayer("flatten"))
net.add(Layer("hidden", 20,
activation=actf))
net.add(Layer("output", 4,
activation="softmax"))
net.connect()
net.compile(loss="categorical_crossentropy",
optimizer="adam")
return net
net = vision_network("relu")
net["conv1"].feature = 7
display(net)
net.propagate(vision_images[0])
[0.2408667504787445, 0.19407963752746582, 0.17542071640491486, 0.3896328806877136]
net.propagate(vision_images[19], visualize=True)
[0.24244247376918793, 0.20360258221626282, 0.18065685033798218, 0.37329810857772827]
net.propagate_to_features("conv1", vision_images[10])
net.propagate_to_features("conv1", vision_images[20], html=False, visualize=True)
img = array2image(vision_images[0], scale=3.0)
img
net.propagate(vision_images[10])
[0.2359803318977356, 0.20740050077438354, 0.1849192976951599, 0.37169986963272095]
net.snapshot(vision_images[0])
net.propagate_to_features("conv2", vision_images[0], scale=3.0)
ds = net.dataset
ds.clear()
%%time
dataset = []
for i in range(len(vision_images)):
dataset.append([vision_images[i], onehot(vision_targets[i] - 1, 4)])
ds.load(dataset)
CPU times: user 121 ms, sys: 24 ms, total: 145 ms Wall time: 145 ms
ds.shuffle()
ds.split(.1)
ds.summary()
Dataset Split:
Input Summary:
Target Summary:
#net.delete()
#net.train(5, report_rate=1, plot=True)
#net.save()
if net.saved():
net.load()
net.plot_results()
else:
net.train(5, report_rate=1, plot=True)
net.save()
======================================================================== | Training | Training | Validate | Validate Epochs | Error | Accuracy | Error | Accuracy ------ | --------- | --------- | --------- | --------- # 5 | 0.36111 | 0.50944 | 0.31159 | 0.60000
net.dashboard()
Failed to display Jupyter Widget of type Dashboard
.
If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean that the widgets JavaScript is still loading. If this message persists, it likely means that the widgets JavaScript library is either not installed or not enabled. See the Jupyter Widgets Documentation for setup instructions.
If you're reading this message in another frontend (for example, a static rendering on GitHub or NBViewer), it may mean that your frontend doesn't currently support widgets.
robot["camera"].getImage().resize((240, 160))
image = net.propagate_to_image("conv2", vision_images[0], scale=2.0)
image
net.propagate_to_features("conv2", vision_images[0], scale=3.0)
net.propagate(vision_images[10])
[2.0572382686268043e-10, 2.5946392270270735e-05, 0.02174180932343006, 0.9782322645187378]
net.propagate(array2image(robot["camera"].getData()))
[0.14169691503047943, 0.39364564418792725, 0.3407711088657379, 0.123886339366436]
from conx.widgets import CameraWidget
cam = CameraWidget()
cam
Failed to display Jupyter Widget of type CameraWidget
.
If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean that the widgets JavaScript is still loading. If this message persists, it likely means that the widgets JavaScript library is either not installed or not enabled. See the Jupyter Widgets Documentation for setup instructions.
If you're reading this message in another frontend (for example, a static rendering on GitHub or NBViewer), it may mean that your frontend doesn't currently support widgets.
image = cam.get_image().resize((60, 40))
net.propagate(image)
[0.2507583200931549, 0.2764703929424286, 0.1926824152469635, 0.280088871717453]
net.propagate(robot["camera"].getData())
[0.14169691503047943, 0.39364564418792725, 0.3407711088657379, 0.123886339366436]
net.test()
======================================================== Testing validation dataset with tolerance 0.1... Total count: 1800 correct: 1191 incorrect: 609 Total percentage correct: 0.6616666666666666
def network_brain(robot):
if robot.mystep % 200 == 0:
robot.priority = "left" if robot.priority == "right" else "right"
inputs = robot["camera"].getData()
outputs = net.propagate(inputs)
print(net.pf(outputs))
sonar = robot["sonar"].getData()
left = min(sonar[0:4])
right = min(sonar[4:8])
clearance = 0.5
noise = random.gauss(0, 0.2)
if robot.priority == "left":
if left < clearance or right < clearance:
robot.move(0, -0.5+noise)
else:
robot.move(0.5+noise, 0)
else:
if left < clearance or right < clearance:
robot.move(0, 0.5+noise)
else:
robot.move(0.5+noise, 0)
robot.mystep += 1
net.visualize = False
robot = make_robot()
robot.brain = network_brain
robot.mystep = 0
robot.priority = random.choice(["left", "right"])
vsim = VSimulator(robot, make_world)
Failed to display Jupyter Widget of type VBox
.
If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean that the widgets JavaScript is still loading. If this message persists, it likely means that the widgets JavaScript library is either not installed or not enabled. See the Jupyter Widgets Documentation for setup instructions.
If you're reading this message in another frontend (for example, a static rendering on GitHub or NBViewer), it may mean that your frontend doesn't currently support widgets.