Как стать автором
Обновить
60
3

LegalTech, ML, ROS

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

хм. код еще работает, только url изменить, например -
url = 'https://search.wb.ru/exactmatch/ru/common/v9/search?ab_testing=false&appType=1&curr=rub&dest=-1257786&hide_dtype=13&lang=ru&page=1&query=%D0%BA%D1%80%D0%BE%D1%81%D1%81%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%B6%D0%B5%D0%BD%D1%81%D0%BA%D0%B8%D0%B5&resultset=catalog&sort=popular&spp=30& suppressSpellcheck=false'

{'brand': 'STARRIER', 'name': 'Кроссовки', 'id': 189699304, 'reviewRating': 4.7, 'feedbacks': 47149}
{'brand': 'Essenza', 'name': 'кроссовки белые дышащие', 'id': 317306139, 'reviewRating': 4.5, 'feedbacks': 292}
{'brand': 'STARRIER', 'name': 'Кроссовки женские демисезонные', 'id': 280450780, 'reviewRating': 4.8, 'feedbacks': 352}

Все, конечно, намешано в один котел. Хорошо, что вы разобрались в книге "TinyML Cookbook - Second Edition", там как раз описан проект, который вы взяли для статьи (chapter 6). Издания от "Лани" зачастую полны опечаток, а иногда и ошибок. Можно было своими словами добавить пояснений, которые выкинули из книги, тогда у читателя хотя бы картинка сложилась до конца.
Например, названия классов в книге неспроста взяты cirlce, cross, pan. Это дает некоторую логику в движениях при сборе датасета. Как и то, как этот датасет собирать.

Кроме того, вы не добавили 4й класс unknown. Который нужен для случаев, когда плата просто на столе лежит. Собрать его просто - просто запишите показания, когда плата не двигается. Иначе у вас при классификации будет все время выдавать один из классов, хотя плата, возможно, ничего не будет делать. Я тоже делал из этой книги проект на arduino Nano 33 ble с видеокамерой и у меня так было.

Важное пояснение - tensorflow должен быть с keras 2x версий, современный, с keras 3, потребует значительных усилий для правок, включая выпуск новой книги в издательстве "Лань".
xxd утилита конвертации модели на windows работает некорректно, и лучше это делать на linux. xxd -c 60 -i model.tflite > indoor_scene_recognition.h

Непонятно зачем билдить tensorflow на raspberry pi, когда есть готовые wheels. Но, видимо, Q-engineering виднее, они и с vulkan модели запускали в надежде на ускорение.

Спасибо, что упомянули про ESP32-S3, хотя не понятно, как это клеится к общей статье. Тем не менее, данный объект крайне прожорлив по питанию, и, греется как orange pi в ее молодые годы. Тем не менее мобилен, на удивление хорошо передает видеопоток.

пока не нашли точную причину онкологии, оставим эту тему открытой. когда-то к радиации тоже было лояльное отношение.

+- 0.15 мм не каждый и 3d сканнер может. понятно, что здесь другая точность.

нормальный результат выходит, если вы только не внутренности автомобиля сканируете. youtu.be/7aQboKKODfA

>3D- печать для быта и дома не очень подходит
А не подходит она по простой причине - микропластик. Посуда и предметы гигиены не потому из металлов и керамики изготавливают. Давно бы уже кружек-ложек напечатали.

Чтобы не застревало в сопле - старайтесь покупать качественный пластик. У меня с экспресса тоже постоянно с ним проблемы.

Модели с crealitycloud уже "идут из коробки" и на creality k1c, например, печатать одно удовольствие. Не нужно стол выравнивать, камера закрытая уже есть, мобильное приложение с видео, где можно печать остановить, если что-то пошло не так. Единственный минус - принтер не отключить из розетки, когда напечатал. Но это решается умными розетками, не так ли ?

Creality Cloud -zoldaten personal page www.crealitycloud.com/user/3142795339

import requests,csv
from bs4 import BeautifulSoup
#url='https://pikabu.ru'
#soup = BeautifulSoup(response.text, 'lxml')
from datetime import datetime
from multiprocessing import Pool
from threading import Thread
import pickle

start = datetime.now()

def get_html(url):
    with requests.Session() as session:
            session.headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
            session.headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:64.0) Gecko/20100101 Firefox/64.0'
            r=session.get(url)            
            if r.status_code==404:
                return ('404')
            else:
            #r = requests.get(url)        
                return r.text

def write_csv(data,filename):
    with open(filename,'a',encoding='utf8',newline='') as f:
        f.write(f"{data['story_title']}\t"
             f"{data['link']}\t"
             f"{data['story_id']}\t"
             f"{data['data_rating']}\t"
             f"{data['data_timestamp']}\t"
             f"{data['story_comments']}\t"             
             f"{data['data_author_id']}\t"
             f"{data['data_meta_rating']}\t"
             f"{data['story__views_hint']}\t"
             f"{data['user_name']}\t"
             f"{data['user_link']}\t"
             f"{data['story__community_link']}\n")
    


def get_page_data(text,filename):
    soup=BeautifulSoup(text,'lxml')
    ads = soup.find_all('article',class_='story')
    for ad in ads:
        try:
            if ad.find('h2',class_='story__title')==None:
                story_title=ad.find('h1',class_='story__title').text.strip()
            else:
                story_title=ad.find('h2',class_='story__title').text.strip()
        except:
                story_title=''
        try:
                link=ad.find('a')['href']
        except:
                link=''
        try:
                story_id=ad['data-story-id']
        except:
                story_id=''
        try:
                data_rating=ad['data-rating']
        except:
                data_rating=''
        try:
                data_timestamp=ad.find('time',class_='caption story__datetime hint')['datetime'][:10]
        except:
                data_timestamp=''
        try:
                story_comments=ad.find(class_='story__comments-link-count').text
        except:
                story_comments=''        
        try:
                data_author_id=ad['data-author-id']
        except:
                data_author_id='' 
        try:
                data_meta_rating=ad['data-meta-rating']
        except:
                data_meta_rating=''
        try:
                story__views_hint=ad.find('div',class_='story__views hint')['aria-label'].split(' ')[0]
        except:
                story__views_hint=''
        try:
                user_name=ad.find('div',class_='user__info-item').text.strip()
        except:
                user__name=''
        try:
                user_link=ad.find('div',class_='user__info-item').find('a')['href']
        except:
                user_link=''
        try:
                story__community_link=ad.find(class_='story__community-link')['href']
        except:
                story__community_link=''

        #print(story_title,link,story_id,data_rating,data_timestamp,data_vkey,data_author_id,data_meta_rating,story__views_hint,user_name,user_link)       

        data={'story_title':story_title,
                'link':link,
                'story_id':story_id,
                'data_rating':data_rating,
                'data_timestamp':data_timestamp,
                'story_comments':story_comments,                
                'data_author_id': data_author_id,
                'data_meta_rating':data_meta_rating,
                'story__views_hint':story__views_hint,
                'user_name':user_name,
                'user_link':user_link,
                'story__community_link':story__community_link
                  }
        write_csv(data,filename)

def make_all(urls,filename):
    for i in range(len(urls)):
        #print(urls[i])
        text = get_html(urls[i])
        if text=='404':           
            pass
        else:            
            get_page_data(text,filename)

def main():
    #url = 'https://pikabu.ru/?page={}'
    #url='https://pikabu.ru/best/01-01-2020_17-08-2020?page={}'
    url='https://pikabu.ru/story/_{}'
    with open('lost-articles.pickle', 'rb') as f:#571 120
        u = pickle.load(f)
        #print(len(urls))
    urls1 = [url.format(str(i)) for i in u[50001:60000]]    
    urls2 = [url.format(str(i)) for i in u[60001:70000]]
    urls3 = [url.format(str(i)) for i in u[70001:80000]]
    urls4 = [url.format(str(i)) for i in u[80001:90000]]
    urls5 = [url.format(str(i)) for i in u[90001:100000]]
    
    #with Pool(3) as p:
    #    p.map(make_all, urls)
    thread1 = Thread(target=make_all, args=(urls1,'f1.txt',))
    thread2 = Thread(target=make_all, args=(urls2,'f2.txt',))
    thread3 = Thread(target=make_all, args=(urls3,'f3.txt',))
    thread4 = Thread(target=make_all, args=(urls4,'f4.txt',))
    thread5 = Thread(target=make_all, args=(urls4,'f5.txt',))
    thread1.start()
    thread2.start()
    thread3.start()
    thread4.start()
    thread5.start()
    
    thread1.join()
    thread2.join()
    thread3.join()
    thread4.join()
    thread5.join()
        

if __name__ == '__main__':
    main()

задача из области "размять пальцы". полезно, но не практично.
аргументы:
- если книг настолько много, что их приходится сортировать, то, возможно, их не перечитать.
- многие книги дублируют друг друга, особенно в начальных главах. "Самый сок" начинается к концу или "размазан" в середине. Поэтому в 30000 первых слов можно насобирать из глав "как установить" python.
- некоторые книги не переводятся корректно в текст.
- в отношении информации все быстро сейчас устаревает, поэтому "обновление кода" в книгах старше 3-4 лет может быть нетривиальной задачей (помним про Keras v2, TF и т.д.).
- концентрируясь только на python и медицине, можно пропустить интересное в смежных языках.

Поэтому, самое простое:
- качаем "свежее" за последние 1-2 года.
- раскладываем по языкам программирования.

*есть конечно хорошие книги или справочники, которые старше 1-2 лет, но их вы и так найдете. они либо в ссылках в новых книгах либо упоминаются в них.

**вот еще еще человек сизифовым трудом занимается - www.youtube.com/@stakap/videos

есть возможность https://huggingface.co/ai-forever/ruGPT-3.5-13B в gguf перевести, чтобы простые смертные могли пользоваться ?

как это все работает на большом количестве классов (>1000) ?
*текстовое описание картинок для 1000 классов, очевидно, трудоемко. можно, конечно, использовать мультимодальные LLM для описания картинок, чтобы упростить себе работу. но они выдают иногда описание > 77 токенов или очень схожее. речь идет о предметах, допустим, на полке в магазине. текстовое описание получается очень похожим, а на 1000 классах так вообще, все в одно большое пятно сливается.

После внедрения Metric Learning и своей платформы разметки мы пришли к следующему пайплайну.

  1. Проводим аналитику и собираем новые товары или те, которые плохо распознаются.

  2. Выделяем из новых фото группы товаров.

  3. Если нужно, дообучаем модель.

  4. Векторизуем все группы товаров и добавляем в базу. Аналоги векторизуются отдельно, но им проставляется метка основного товара.

  5. Когда приходит фото на распознавание, мы извлекаем из него вектор признаков и сравниваем с теми, которые есть в базе, и выбираем товар с наиболее похожим вектором.

  6. И проверяем насколько большое расстояние у этого товара и отправленного изображения. Если оно больше определенного порога, мы понимаем, что такого товара у нас нет в базе. И так мы перестали путать людей с углем.

Т.е. вы классификатору "показываете" картинки целиком ? Или то, что "вырежет" детектор ?
Если первое, то рискну предположить, что у вас расстояния между векторами будут неточными, т.к. на картинке кроме основного предмета есть еще и посторонние.

Кроме того, в зависимости какая у вас сеть на классификаторе время обучения будет разным.
Если вы resnet обучаете, то при большом количестве классов, это, видимо, несколько дней. Если one-shot сети, то за пару часов можно переобучить всю сеть целиком и не заморачиваться с векторами.

p.s. где обещанная статья про ценники?

Потеряли в коде train_loader, test_loader. Хотя, возможно, так задумано.
Отсюда, наверно, материал - https://github.com/cezannec/capsule_net_pytorch/blob/master/Capsule_Network.ipynb
Но там по mnist у автора скромнее результаты.
Возможно, капсульные сети стали лучше спустя время.

Если правильно понимаю, в статье решается вопрос поиска иностранных слов с их "привязкой" к русским аналогам. И это должно помочь в изучении иностранного языка.
Вопросы по технической реализации:
- сначала нужен литературный перевод, т.к. agrotranslate слабовато в этом вопросе?
- как вы "победили" расстановку правильных ударений и интонацию? У CoquiTTS сложно с этим.
- насколько длинные предложения получается преобразовывать ? Опять же у CoquiTTS при длинных предложениях появляются какие-то провалы в речи либо охи-вздохи.

"когда галактика выглядит как массивная и крякает как массивная,  " ?

да, камера, на удивление, оказалась хороша. и изголовье удачно сделано. научиться бы еще ее динамиком управлять, чтобы она озвучивала, допустим, распознанное с одноплатника, куда идет видеопоток с нее... а так вполне себе переносная web камера, со стабилизацией, 4к и маленьким пультом. реклама, пошла реклама.

  1. Т.е. для управления одним компьютером нужен другой рядом постоянно включенный ?

  2. В коде для esp32, который позаимствован от arduino (2011 г), судя по коду на github, распиновка приведена с учетом модели esp32 ?

  3. Есть полная схема, в которой учтены транзисторы и конденсаторы (?) на ногах esp32 ?

1
23 ...

Информация

В рейтинге
1 235-й
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность