Пример #1
0
class MyPaintApp(App):

    def build(self):
        main_box = BoxLayout()

        painter_size = '500dp'
        draw_parent = BoxLayout(orientation='vertical',
            size_hint_x = None,
            width = painter_size
        )
        labels_box = BoxLayout(orientation='vertical')
        main_box.add_widget(draw_parent)
        main_box.add_widget(labels_box)

        self.painter = MyPaintWidget(self.update_res,
            size_hint_y = None,
            height = painter_size
        )
        clearbtn = Button(text='Clear')
        clearbtn.bind(on_release=self.clear_canvas)

        draw_parent.add_widget(self.painter)
        draw_parent.add_widget(clearbtn)

        # addbtn = Button(text='add')
        # addbtn.bind(on_release=self.add_ev)
        # labels_box.add_widget(addbtn)
        w_nums = []
        for i in range(10):
            n_w = NumRes(i)
            w_nums.append(NumRes(i))
            labels_box.add_widget(n_w)

        self.w_nums = w_nums
        self.labels_box = labels_box


        self.machine = ML((28*28, 16, 16, 10, ))
        self.machine.load_weight('weights_m.out')

        return main_box

    def clear_canvas(self, obj):
        self.painter.canvas.clear()


    def update_res(self):
        self.painter.export_to_png('test.png')
        image = Image.open('test.png')
        im = np.asarray(image)[..., 3] / 255
        f = True
        while f:
            f = False
            if min(im.shape) > 28 and np.sum(im[:, 0]) == 0 and np.sum(im[0, :]) == 0:
                # remove first row
                im = im[1:, :]
                # remove first col
                im = im[:, 1:]
                f = True
            if min(im.shape) > 28 and np.sum(im[:, -1]) == 0 and np.sum(im[-1, :]) == 0:
                # remove last row
                im = im[:-1, :]
                # remove last col
                im = im[:, :-1]
                f = True
            if min(im.shape) > 28 and np.sum(im[:, -1]) == 0 and np.sum(im[0, :]) == 0:
                # remove first row
                im = im[1:, :]
                # remove last col
                im = im[:, :-1]
                f = True
            if min(im.shape) > 28 and np.sum(im[:, 0]) == 0 and np.sum(im[-1, :]) == 0:
                # remove last row
                im = im[:-1, :]
                # remove first col
                im = im[:, 1:]
                f = True
        image = Image.fromarray(np.uint8(im*255)).resize((20, 20, ))
        im = np.asarray(image) / 255

        for i in range(4):
            im = np.insert(im, 0, np.zeros((20)), axis =1)
        for i in range(4):
            im = np.append(im, np.zeros((20, 1)), axis =1)
        for i in range(4):
            im = np.insert(im, 0, np.zeros((28)), axis =0)
        for i in range(4):
            im = np.append(im, np.zeros((1, 28,)), axis =0)

        image = Image.fromarray(np.uint8(im*255))
        image.save('test.png')


        res = self.machine(im.squeeze().reshape(28*28))[-1]
        res_dict = {
            k: res[k] for k in range(len(res))
        }
        res_dict = {
            k: int(round(v * 100)) for k, v in res_dict.items()
        }
        res_tup = tuple(sorted(res_dict.items(), key=lambda item: item[1]))
        # print(res_dict)
        # print(res)
        self.labels_box.clear_widgets()
        for n, v in reversed(res_tup):
            self.w_nums[n].set(v)
            self.labels_box.add_widget(self.w_nums[n])
Пример #2
0
for i in range(20):
    plt.imshow(test_data[i][0].reshape((
        28,
        28,
    )))

#%%
from ml import ML

b_machine = ML((
    28 * 28,
    16,
    16,
    10,
))
b_machine.load_weight('weights.out')
# b_machine.save_weight('weights.out')

#%%

train_len = 5000
test_len = 10000 if train_len > 10000 else train_len
machine = b_machine.copy()
machine.load_weight('weights_m.out')
machine.train(train_data[:train_len], 80)
# machine.save_weight('weights_m.out')

print()

avg_pos = 0
b_avg_pos = 0