Как стать автором
Обновить
3
0
Сергей @Syzd

Пользователь

Отправить сообщение

Немного оффтоп: на просторах твича существует AI стример Neuro-sama. Буквально несколько дней назад, её создатель Vedal провёл стрим с обновлённой, улучшенной версией. Получилось очень интересно, советую всем посмотреть стрим целиком (стрим на английском языке) или нарезки из него на ютубе, потому что Neuro-sama это одна из лучших попыток создания виртуальной личности, которую я видел.

На 3310 / 3330 кнопки выведены на пятаки. У меня получилось подпаяться и использовать родную клавиатуру. Кстати, к экрану так тоже можно подключиться. Главная проблема - уместить все допы в отсек аккумулятора.

Тогда можно восстановить 3D модели с помощью, например, COLMAP. На Хабре было несколько статей по фотограмметрии. Вот, например, перевод статьи с обзором подходов и практическими советами.

ломается раз в год сейчас

Вы раз в год ставите мажорные обновления Python? Они ж, вроде, даже не выходят так часто, а минорные ничего не ломают?


что делать на Ubuntu на которой была только 3.10?

На Ubuntu нельзя держать параллельно несколько версий Python? Я на Windows когда-то держал Python 2.x и несколько версий Python 3.x, и всё со всем без проблем работало.


А теперь сделайте stadalone приложение Python c Qt. Это адский ад на всех платформах.

Покопался в пыльных архивах, нашёл собственное поделие 2008 года на Python + Wx, запакованное в standalone-приложение через py2exe, 19 мегабайт, запустил exe, работает. Ещё покопался, нашёл переделанную версию под Qt, датируемую 2013 годом, 37 мегабайт, запустил exe, работает. Никакого адского ада, никаких костылей, чтобы уложиться, скрипт для py2exe из восьми строчек, практически без изменений скопированный из их туториала. Писалось изначально для Windows XP, щас заработало в Windows 10, без правок где-либо и установок чего-либо.

requirements.txt устарел уже лет на десять. И появившийся вслед за ним setup.py тоже. Современный подход - pyproject.toml.

Решал подобную задачу (см. www.wolframcloud.com/objects/945e3912-eff1-45a2-affc-1f0e3c81518e) только на вольфрамовской математике. В математике очень сильно подкупает большое количество реализованных функций встроенных в ядро. Их там более пяти тысяч.
Вот и здесь код код получился довольно коротким. Но реализован расчет не только в отдельной точке, а смоделированы множественные пересчеты портфелей на всей длинне данных начиная с 2000 года.
Только в моделировании участвовало 50 акций. Удивительно, но расчет шел в пределах минуты на персоналке в окне браузера. Кстати задача оптимизации здесь получилась линейной. Может потому и вычисления быстрые.
Автору за труды отлично. Сам постоянно слушаю лекции по анализу данных и машинному обучению. А там сплошной питон. Но тамошние методы все реализованы в математике.

face_recognition опирается на dlib. С качественными фото эта библиотека ещё более менее справляется, но если брать реальные фото, где лицо может быть смазано, частично перекрыто чем-то или быть изображено под углом, будьте готовы, что библиотека его просто не найдёт. Плюс будет много ложных срабатываний на каких-то предметах интерьера.


Я бы посоветовал для поиска лиц использовать MT-CNN, которая работает очень быстро даже на CPU, точная и к тому же выдаёт координаты 5-ти лицевых меток (глаза, нос, края рта).


Когда лица найдены, находим эмбеддинги с помощью той же InsightFace (тоже получше сетки из dlib). Сравнить, принадлежат ли фото одному человеку, можно с помощью скалярного произведения эмбеддингов.


Эти библиотеки легко нагугливаются, для них есть предобученные веса и кода нужно всего с десяток строк (не считая захват кадра, конечно).


Впрочем, если делать проект для развлечения без каких-то особых требований, то и face_recognition будет вполне достаточно.

Тут уже упомянули эту книжку и даже ссылку дали, но качество по ссылке низкое. Поэтому вот эта же книжка из моей коллекции, с нормальным качеством:
https://disk.yandex.ru/d/ahWJ-Zgc1j6izA
Валерий Вильгельмович Майер
Простые опыты с ультразвуком
Серия «Библиотечка физико-математической школы»
М. 1978 г., 160 стр. с илл.
Издательство «Наука»
Главная редакция физико-математической литературы

В детстве даже делал простейшие излучатели по этой книжке, из ферритовой магнитной антенны :-)

Добавьте ещё В.В. Майер "Простые опыты с ультразвуком" https://ikfia.ysn.ru/wp-content/uploads/2018/01/Majer1978ru.pdf

Совершенно потрясающая книга ! В детстве была моей настольной :))

А вот ещё пример применения ультразвуковых технологий :))

Прикольная программа.

Можно еще посоветовать дополнить функционал фотоаппарата беспроводным управлением.
Например Ардуинщиков есть готовая библиотечка (Arduino_Camera_Control) позволяющая общаться с камерой удалено. Например, с Android-коммуникатора по блютуз.
Пример как это работает:
theiopage.blogspot.com/2011/08/yanis-android-wireless-eos-controller.html

вот тут https://youtu.be/61H1lajDyv4 человек делает обзор ~20 похожих проектов:

Не слышать о срезах в Python (см. КДПВ) мог только мертвый.

А match может здорово навредить, если забыть о том что в бизнесе от 5 до 20% хостов трудятся под Win7 (и Python 3.8, где match нет)/ Эстетики match-case добавляет совсем немного.

Все-таки лучше делать разметку UI именно с помощью KV Language. Структура элементов гораздо четче прослеживается, проще вносить изменения да и код самого UI не мешается под ногами в коде. Например, вот так было бы несколько лучше:


<ManagerScreens@ScreenManager>:

    MenuScreen:
        id: men
    SortedListFood:
        id: list_food
    AddFood:
        id: add_food

<MenuScreen@Screen>:
    name: "menu"

    BoxLayout:
        orientation: 'vertical'
        Button:
            text: "Дневник питания"
            on_press: app.screen_manager.current = 'list_food'
        Button:
            text: "Добавить блюдо в дневник питания"
            on_press: app.screen_manager.current = 'add_food'

<AddFood>:
    name: "add_food"
    _app: app

    BoxLayout:
        orientation: 'vertical'

        Button:
            text: '< Назад в главное меню'
            on_press: app.screen_manager.current = 'menu'
            size_hint_y: None
            height: dp(40)
        TextInput:
            id: field_food
            multiline: False
            height: dp(40)
            size_hint_y: None
            hint_text: "Название блюда"
        Button:
            text: "Добавить блюдо"
            size_hint_y: None
            height: dp(40)
            on_press:
                if field_food.text != '': root.button_clicked(field_food.text); \
                field_food.text = ''
        Label:
            id: result_label

<SortedListFood>:
    name: "list_food"

    BoxLayout:
        orientation: 'vertical'

        Button:
            text: '< Назад в главное меню'
            on_press: app.screen_manager.current = 'menu'
            size_hint_y: None
            height: dp(40)

        RecycleView:
            id: rv
            key_viewclass: 'viewclass'
            key_size: 'height'
            RecycleBoxLayout:
                default_size: None, dp(40)
                default_size_hint: 1, None
                size_hint_y: None
                height: self.minimum_height
                orientation: 'vertical'

Теперь код Python содержит только логику приложения:


import os
import ast
import time

from datetime import datetime

from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import Screen
from kivy.config import ConfigParser
from kivy.lang import Builder
from kivy.factory import Factory

Builder.load_file('ui.kv')

class SortedListFood(Screen):
    def on_enter(self):
        data_foods = self.get_data_foods()
        self.set_list_foods(data_foods)

    def get_data_foods(self):
        return ast.literal_eval(
            App.get_running_app().config.get('General', 'user_data'))

    def set_list_foods(self, data_foods):
        for f, d in sorted(data_foods.items(), key=lambda x: x[1]):
            fd = f.decode('u8') + ' ' + (datetime.fromtimestamp(d).strftime(
                '%Y-%m-%d'))
            data = {'viewclass': 'Button', 'text': fd}
            if data not in self.ids.rv.data:
                self.ids.rv.data.append({'viewclass': 'Button', 'text': fd})

class AddFood(Screen):
    _app = ObjectProperty()

    def set_user_data(self, input_food):
        self._app.user_data = \
            ast.literal_eval(self._app.config.get('General', 'user_data'))
        self._app.user_data[input_food.encode('u8')] = int(time.time())

    def save_user_data(self):
        self._app.config.set('General', 'user_data', self._app.user_data)
        self._app.config.write()

    def set_new_food(self, name_food):
        self.ids.result_label.text = \
            "Последнее добавленное блюдо:  " + name_food

    def button_clicked(self, input_food):
        self.set_user_data(input_food)
        self.save_user_data()
        self.set_new_food(input_food)

class FoodOptionsApp(App):
    def __init__(self, **kvargs):
        super(FoodOptionsApp, self).__init__(**kvargs)

        self.config = ConfigParser()
        self.screen_manager = Factory.ManagerScreens()
        self.user_data = {}

    def build_config(self, config):
        config.adddefaultsection('General')
        config.setdefault('General', 'user_data', '{}')

    def set_value_from_config(self):
        self.config.read(os.path.join(self.directory, '%(appname)s.ini'))
        self.user_data = ast.literal_eval(self.config.get(
            'General', 'user_data'))

    def get_application_config(self):
        return super(FoodOptionsApp, self).get_application_config(
            '{}/%(appname)s.ini'.format(self.directory))

    def build(self):
        return self.screen_manager

if __name__ == '__main__':
    FoodOptionsApp().run()
Немного переработал :) Пытался сделать покороче, вышло и побыстрее чуток (15 сек против 21)
#!/usr/bin/env python
#-*- coding:utf-8 -*-

from __future__ import division
from itertools import product

sum_num = 100
count =  0

digits = '123456789'
signs = '', '+', '-', '*', '/'
atoms = [map(lambda x: d + x, signs) for d in digits[:8]]

for indexes in product(range(5), repeat=8):
    expr = "".join( [ atoms[i][indexes[i]] for i in range(8) ] )
    expr += '9'
    if eval(expr) == sum_num:
        print('{0} = {1}'.format(expr, sum_num))
        count += 1
 
print 'So, {0} expressions for {1}'.format(count, sum_num)</code>
Re: посмотрите в книги по математике и физике;
посмотрите в учебнике по математике за 1-2 класс :)

Есть стандартная школьная запись деления с помощью символа "÷", и выражение a·b÷c·d выполняется в порядке ((a·b)÷c)·d

Книжная запись — ab/cd — это однострочный вариант записи дроби, когда в числителе a·b, а в знаменателе c·d. И порядок выполнения операций тут характерный для дроби (a·b)÷(c·d)

Что касается программирования, то тут все достаточно просто: символом "*" в языках программирования обозначается математическая операция "·"(умножение), а символом "/" математическая операция "÷"(деление), но никак не запись дроби.
Ответы без скобок — это то же, что ответы с другим порядком скобок. Ушедшие решения легко найти. Они обязательно содержат /\/\d+\*/ (другими словами, знак деления, за которым цифры и знак умножения)

Вот они, ушедшие 4 ответа из списка автора:
73: 1*23+4+56/7*8+9 = 100
99: 1/2*34-5+6-7+89 = 100
100: 1/2*3/4*56+7+8*9 = 100
101: 1/2/3*456+7+8+9 = 100
Зто означало, например, ((1/2)/3)*456+7+8+9 = 100. По моим правилам в моём списке это записывалось в виде 1/2/(3*456)+7+8+9 = 24.000365 и из списка выбывало.

А вот пришедшие (другой порядок следования из моего списка)
24: «sum=1*23*4-56/(7*8)+9» 100
51: «sum=12/(3*4)+5*6+78-9» 100

Итого, получаем 99 решений.

Кто-то трое понизили мне карму за высказывание, что решение задачи ошибочно. Ещё раз, неверящие и особенно, минусующие:
1) посмотрите в книги по математике и физике;
2) убедитесь, что знак умножения в строчной записи вида a2/mr3 имеет приоритет умножения перед делением.
И это соблюдается до сих пор. Равный приоритет умножения и деления — следствие правил языков программирования и к правилам человеческой записи выражений отношения не имеет. В Фортране ещё часты были ошибки от забывания этого правила в 60-70 годах, да и сейчас не исключены.
… Какой-то сбой.
Код:
//поиск решений задачи: из 123456789 получить target = 100

if(!window.console){ //для IE и отключенного Firebug
	console = {log: function(X){
			if(arguments.length <=1)
				alert(X);
		},
		time: function(){
			dat=(new Date()).getTime();
		},
		tmeEnd: function(){
			alert((new Date()).getTime() - dat);
		}
	}
}
console.time('a'); //данные
s0 = '123456789';
x0 = [0,0,0,0,0,0,0,0, 4];
a = ['+','-','/','*',''];
var target = 100;

plus1 = function(x, i){ //5-ричный счётчик
	if(i==null) i=0;
	if(++x[i] >= 5){
		x[i] =0;
		if(++i >=8) return i;
		return plus1(x, i);
	}else return i;
}
window.sum =0; //поиск решений
var n=1, nn=0, leftPar, rightPar, wasLeftPar, wasDivide;
do{
	s='sum=';
	wasLeftPar = wasDivide =false;
	
	for(var i =0; i <=8; i++){
		if(x0[i]==3 && wasDivide){ //исправление приоритета деления
			wasLeftPar = true;
			var j = s.lastIndexOf('/') +1;
			s = s.substr(0, j) +'('+ s.substr(j) + s0.charAt(i) + a[x0[i]];
		}else if(wasLeftPar && x0[i] <3){
			wasLeftPar = false;
			s += s0.charAt(i) + ')' + a[x0[i]];
		}else
			s += s0.charAt(i) + a[x0[i]];
		if(x0[i]==2)
			wasDivide = true;
		else if(x0[i] !=4)
			wasDivide = false;
	}
	if(wasLeftPar) s+= ')';

	eval(s);
	
	if(sum > 99.999 && sum < 100.001)
		console.log(++nn, n, s, sum);
	if(plus1(x0) ==8) break;
}while(++n <1000000);
console.log(n);
console.timeEnd('a');

Скобок получилось немного, что-то ушло, что-то добавилось.
Распечатка: paste.org/pastebin/view/29878
Если надо посчитать без скобок, в цикле for(var i =0; i <=8; i++){} оставляют только s += s0.charAt(i) + a[x0[i]]; и убирают if(wasLeftPar) s+= ')';
Вы может задумывали 2 плоскости, но в своем примере привели 3 плоскости.
вот попробуйте следующий пример:
class TestClass:
name = 'cls_name'
def __init__(self, s):
self.name = s

@classmethod
def get_cls_name(cls):
return cls.name

obj = TestClass('self_name')
print(obj.name)
print(TestClass.name)
print(obj.get_cls_name())

А потом заново переосмыслите области видимости классов в python. Можно называть их свойствами, можно переменными, суть от этого не изменится, то что в области класса и то что в области экземпляра класса — это разные вещи и не пересекаются никак.

Решение Задачи #3

result = [k for k in list1 if k in list2]

1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Самара, Самарская обл., Россия
Дата рождения
Зарегистрирован
Активность