Scan Tire AI

[ЛИЧНОЕ] Заметки для себя

Этот документ — только для меня. Не показывать никому до запуска. Цель: к лету 2026 иметь работающий MVP и первых платных клиентов. Фокус: сначала деньги, потом красивости. OCR — потом, если будет время.

60%
Точность
0
Бета-юзеров
$0
MRR
М1
Текущий этап
O

Обзор проекта

АКТИВЕН
ТЕКУЩИЙ ИНТЕРФЕЙС: "ЗРЕНИЕ ТЕРМИНАТОРА"
Веб-интерфейс уже демонстрирует рабочий процесс AI-инспекции в стиле "Терминатор / Matrix Vision". Пользователь загружает фото шины и видит экран анализа с тактическими AR-элементами, неоново-зелеными акцентами и визуальной обратной связью в реальном времени.
ФОКУС: ТОЛЬКО КЛАССИФИКАЦИЯ ИЗНОСА
OCR (распознавание размера шины) перенесён на Этап 3. MVP даёт быструю ценность: "Насколько изношены мои шины?" Одна модель (ResNet18), один API эндпоинт, один понятный результат.
Домен и хостинг
scantire.com зарегистрирован, GitHub Pages, HTTPS
инфраструктура
Лендинг
Тёмный дизайн, AR-макет, форма ожидания
дизайн
Инструмент разметки (PyQt6)
C++ препроцессинг + Python ML, GUI для Active Learning
ml-инструменты
Обучение классификатора износа
ResNet18, 60% точности -> цель 85%+
ml
Экспорт в ONNX + интеграция в Next.js
Экспорт ResNet18 -> ONNX, инференс через onnxruntime-node
бэкенд
Реализация интерфейса "Зрение Терминатора"
Темный интерфейс с неоново-зелеными акцентами, AR-маркерами и анимированной scanline
ui
S

Технологический стек

ВНИМАНИЕ: НЕ ИСПОЛЬЗУЕМ OpenCV В ПРОДАКШЕНЕ
Препроцессинг использует Sharp.js (родной для Node.js). С++ ядро ТОЛЬКО для инструмента разметки. Продакшен: Sharp.js -> ONNX Runtime.
package.json (зависимости Next.js)
{ "dependencies": { "next": "^15.0.0", "onnxruntime-node": "^1.21.0", "sharp": "^0.34.0", "react": "^19.0.0", "typescript": "^5.0.0" } }
Компонент Технология Назначение
Фронтенд Next.js 15 (App Router) Загрузка файлов, отображение результатов
Бэкенд API Next.js API Routes POST /api/analyze
ML Инференс ONNX Runtime Node.js Серверный инференс
Обработка изображений Sharp.js Resize, normalize (БЕЗ OpenCV)
ML Обучение PyTorch + ResNet18 Fine-tuning ImageNet весов
Инструмент разметки PyQt6 + C++ Engine Сбор датасета (ТОЛЬКО ЛОКАЛЬНО)
1

Месяц 1-2: MVP (Только износ)

ИДЁТ
ЦЕЛЬ: scantire.com/beta РАБОТАЕТ
Пользователь загружает фото протектора -> получает класс износа (Новая/Хорошая/Средняя/Изношенная/Критическая) + примерную глубину. Цель: 10 человек попробуют, 7+ получат верный результат.
Экспорт ResNet18 классификатора износа -> ONNX
torch.onnx.export() с opset_version=17, форма входа [1,3,224,224]
ml
Создать Next.js API эндпоинт
POST /api/analyze — принимает FormData изображение, возвращает JSON
бэкенд
Sharp.js препроцессинг
resize(224,224), toColorspace('rgb'), raw(), normalize 0-1
бэкенд
Собрать /beta страницу (фронтенд)
Drag & drop загрузка, спиннер загрузки, отображение результата с уверенностью
фронтенд
Задеплоить в продакшен
Vercel или свой VPS. ONNX модель в /public/models/
devops
Добавить Terms of Service + Privacy Policy
/terms и /privacy страницы с дисклеймерами
юридическое
Добавить Yandex.Metrika + Google Analytics
Отслеживание просмотров, отправок форм, использования беты
аналитика

КОД: Экспорт ResNet18 -> ONNX

python (export_wear_onnx.py)
import torch
import torch.nn as nn
from torchvision import models

# Загрузка обученной модели
model = models.resnet18(weights=None)
model.fc = nn.Linear(model.fc.in_features, 5)  # 5 классов износа
model.load_state_dict(torch.load('weights/model_wear_best.pth'))
model.eval()

# Экспорт в ONNX
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
    model,
    dummy_input,
    'weights/wear_resnet18.onnx',
    opset_version=17,
    input_names=['input'],
    output_names=['output'],
    dynamic_axes={'input': {0: 'batch'}}
)
print("Exported to wear_resnet18.onnx")

КОД: Next.js API Route

typescript (app/api/analyze/route.ts)
import * as ort from 'onnxruntime-node';
import sharp from 'sharp';
import { NextResponse } from 'next/server';

const CLASSES = ['New', 'Good', 'Medium', 'Worn', 'Critical'];
const DEPTH_EST = ['7+ mm', '5-7 mm', '3-5 mm', '1.6-3 mm', 'less 1.6 mm'];

let session: ort.InferenceSession | null = null;

async function getSession() {
    if (!session) {
        session = await ort.InferenceSession.create(
            './public/models/wear_resnet18.onnx'
        );
    }
    return session;
}

export async function POST(request: Request) {
    const formData = await request.formData();
    const imageFile = formData.get('image') as File;

    // 1. Препроцессинг (Sharp.js - БЕЗ OpenCV!)
    const buffer = Buffer.from(await imageFile.arrayBuffer());
    const { data, info } = await sharp(buffer)
        .resize(224, 224)
        .removeAlpha()
        .raw()
        .toBuffer({ resolveWithObject: true });

    // 2. Нормализация RGB 0-255 -> 0-1, reshape CHW
    const float32 = new Float32Array(3 * 224 * 224);
    for (let c = 0; c < 3; c++) {
        for (let i = 0; i < 224 * 224; i++) {
            float32[c * 224 * 224 + i] = data[i * 3 + c] / 255.0;
        }
    }

    // 3. Инференс
    const sess = await getSession();
    const tensor = new ort.Tensor('float32', float32, [1, 3, 224, 224]);
    const results = await sess.run({ input: tensor });

    // 4. Обработка результатов
    const probs = results.output.data as Float32Array;
    const classId = probs.indexOf(Math.max(...probs));

    return NextResponse.json({
        wear: CLASSES[classId],
        confidence: Math.round(probs[classId] * 100),
        depth_estimate: DEPTH_EST[classId]
    });
}
2

Месяц 3-4: Сбор данных и улучшение модели

ОЖИДАЕТ
ЦЕЛЬ: Точность износа 60% -> 75%
Разметить 500+ фото протектора с помощью PyQt6. Переобучить ResNet18. Добавить TWI калибровку (опционально). Генерировать PDF отчёты с водяным знаком.
Разметить 500+ фото протектора
С помощью инструмента разметки, все 5 классов износа сбалансированы
данные
Переобучить ResNet18
50 эпох, батч 16, early stopping
ml
Реализовать генерацию PDF отчётов
PDFKit или Puppeteer, водяной знак "scantire.com"
бэкенд
Добавить логику порога уверенности
Если уверенность < 60%, показать "Не уверен, попробуйте другое фото"
бэкенд
3

Месяц 5-6: Бета-тестирование

ОЖИДАЕТ
ЦЕЛЬ: 100 реальных пользователей
Постить на Drive2.ru, Reddit. Отправить 20 холодных писем в шиномонтажи ОАЭ. Собирать обратную связь. Итерировать быстро.
Написать посты на Reddit (r/SideProject, r/cars)
"Показываю: Scan Tire AI - оцени износ шин за 10 секунд"
маркетинг
Пост на Drive2.ru
"Попробовал AI для оценки износа шин - результаты"
маркетинг
Отправить 20 холодных писем в шиномонтажи ОАЭ
Google Maps -> найти мастерские -> email с сайта
аутрич
Добавить форму обратной связи
"Был ли результат точным?" большой палец вверх/вниз
ux
U

Текущий интерфейс: "Зрение Терминатора"

ГОТОВО
ВИЗУАЛЬНЫЙ СТИЛЬ ИНТЕРФЕЙСА
Интерфейс выполнен в стиле "Терминатор / Matrix Vision" - это не обычный лендинг, а рабочая inspection-панель с тактическим HUD-дизайном.
Главная страница в tech-style
Темная cyber/matrix эстетика с неоново-зелеными акцентами и ощущением AI-scanner
ui
Многофункциональная зона загрузки
Поддержка drag & drop, выбора файла из галереи и загрузки фото с камеры
frontend
AR-режим сканирования
При анализе интерфейс переключается в AR-режим с угловыми маркерами и анимированной неоновой scanline
анимация
Визуальный результат анализа
Исходное фото, выделенная область протектора, depth overlay с цветовой индикацией износа
ui
Блок статистики
Класс износа, уверенность, средняя/мин/макс глубина протектора, время обработки
frontend
Панель ручной коррекции
UI для ручного выбора класса износа реализован, но серверное сохранение запланировано на следующий этап
frontend

Цветовая логика оценки износа

Класс износа Глубина Цвет Визуальный индикатор
Новая ≥ 7.0 мм #22c55e Зеленый оверлей
Хорошая 5.0-6.9 мм #84cc16 Лаймовый оверлей
Средняя 3.0-4.9 мм #eab308 Желтый оверлей
Изношенная 1.6-2.9 мм #f97316 Оранжевый оверлей
Критическая < 1.6 мм #ef4444 Красный оверлей
4

Месяц 7-9: Масштабирование и рост

ОЖИДАЕТ
Улучшить точность до 85%+
1000+ размеченных сэмплов, аугментация данных
Запуск на Product Hunt
Вторничный запуск, подготовить скриншоты, описание
Оптимизация мобильной PWA
Доступ к камере, офлайн режим (будущее)
5

Месяц 10-12: Монетизация

ОЖИДАЕТ
ЦЕЛЬ: $500 MRR
Запуск Freemium: Бесплатно (10/месяц) + Про ($19/месяц). Первые B2B пилоты с менеджерами автопарков.
Период Пользователи Точность MRR
М1-2 10 60% $0
М3-4 50 75% $0
М5-6 100 75% $0
М7-9 500 85% $0
М10-12 1000 85% $500
6

Месяц 13-18: OCR боковина (Этап 2)

БУДУЩЕЕ
ТОЛЬКО когда износ стабилен (85%+, 1000+ пользователей)
Добавить распознавание размера шины: 205/55R16. Требует YOLOX детектор + OCR MLP + JS Slicer. Сложный пайплайн - отложено на Этап 2.
Собрать 1000+ фото боковины (метки YOLOX)
4 класса: tire_width, tire_profile, tire_diameter, load_index
Обучить YOLOX детектор
Fine-tune с COCO весов, 50 эпох
Экспорт YOLOX + OCR в ONNX
Две модели для каскадного инференса
Реализовать JS Slicer (Canvas API)
Вертикальная проекция -> сегментация символов (БЕЗ OpenCV)
</>

Примеры кода

Sharp.js препроцессинг (БЕЗ OpenCV)

typescript
import sharp from 'sharp';

async function preprocessImage(buffer: Buffer): Promise<Float32Array> {
    // Resize до 224x224, конверт в RGB raw буфер
    const { data } = await sharp(buffer)
        .resize(224, 224, { fit: 'cover' })
        .removeAlpha()
        .raw()
        .toBuffer({ resolveWithObject: true });

    // Конверт HWC -> CHW, нормализация 0-255 -> 0-1
    const float32 = new Float32Array(3 * 224 * 224);
    for (let c = 0; c < 3; c++) {
        for (let h = 0; h < 224; h++) {
            for (let w = 0; w < 224; w++) {
                const srcIdx = (h * 224 + w) * 3 + c;
                const dstIdx = c * 224 * 224 + h * 224 + w;
                float32[dstIdx] = data[srcIdx] / 255.0;
            }
        }
    }
    return float32;
}

Фронтенд: Компонент загрузки файла

tsx (components/FileUpload.tsx)
'use client';
import { useState } from 'react';

export default function FileUpload() {
    const [result, setResult] = useState<null | WearResult>(null);
    const [loading, setLoading] = useState(false);

    async function handleUpload(file: File) {
        setLoading(true);
        const formData = new FormData();
        formData.append('image', file);
        const res = await fetch('/api/analyze', {
            method: 'POST',
            body: formData
        });
        const data = await res.json();
        setResult(data);
        setLoading(false);
    }

    return (
        <div>
            <input type="file" accept="image/*" 
                onChange={(e) => e.target.files?.[0] && handleUpload(e.target.files[0])} />
            {loading && <p>Анализируем...</p>}
            {result && (
                <div>
                    <h2>Износ: {result.wear}</h2>
                    <p>Уверенность: {result.confidence}%</p>
                    <p>Примерная глубина: {result.depth_estimate}</p>
                </div>
            )}
        </div>
    );
}
M

Маркетинг - Полный план

Целевые рынки (приоритет)

Рынок Язык Каналы Почему
ОАЭ English LinkedIn, Google Maps cold email Высокая покупательная способность, техно-ориентированы
Турция English/Turkish Sahibinden.com, Arabam.com Огромный рынок б/у авто
Казахстан Russian Kolesa.kz, Drive2.ru Русский язык, нет санкций

Каналы привлечения

SEO / Контент

  • Блог на русском: "как определить износ шин"
  • Блог на английском: "how to check tire tread depth"
  • Видео на YouTube (технический контент)
  • Статьи на Drive2.ru

Холодный аутрич

  • 20 шиномонтажей ОАЭ (Google Maps)
  • 10 автосервисов Турция (Sahibinden)
  • 10 дилеров Казахстан (Kolesa.kz)
  • B2B email рассылка (fleet managers)

Социальные сети

  • LinkedIn: Build in Public посты
  • Reddit: r/SideProject, r/cars, r/MechanicAdvice
  • VK/Telegram: русские авто-сообщества
  • Twitter/X: #buildinpublic

Партнёрства

  • Шиномонтажи (бесплатный пилот)
  • Автошколы (перед экзаменами)
  • Страховые компании (проверка перед выплатой)
  • Автодилеры (предпродажная подготовка)

Email рассылка - холодное письмо

text
Тема: Бесплатный AI проверщик шин для [Название] (бета тест)

Привет [Имя],

Нашёл ваш шиномонтаж на Google Maps - выглядите профессионально!

Быстрый вопрос: Бывают ли у вас споры с клиентами о состоянии шин?
("Вы сказали хорошие, а они изношены!")

Я создал AI инструмент, который оценивает износ шин по фото за 10 секунд.
Никакого специального оборудования - просто камера смартфона.

Хотите протестировать БЕСПЛАТНО 2 недели?
Демо: https://scantire.com/beta

Просто сфотографируйте 3-5 шин, скажите - совпали ли оценки с реальностью.
Ваш фидбек поможет улучшить AI.

С уважением,
Слава Кузькин
Scan Tire AI
scantireai@gmail.com

LinkedIn - Build in Public (шаблоны постов)

День 1: Вводный пост
"Мне 48, работаю в шиномонтаже. Делаю AI для автоматической проверки шин. Следите за процессом."
День 5: Обновление прогресса
"Зарегистрировал домен. Задеплоил лендинг. Первые 3 email собраны. [скриншот]"
День 10: Технический разбор
"Обучил ResNet18 на 500 фото шин. Точность: 60% -> 72%. Вот что я узнал..."
День 20: Первые пользователи
"Первые 10 человек протестировали! 7 из 10 получили правильный результат. Вот их отзывы."
V

Видео стратегия

Зачем видео?
Видео - главный канал для B2B и инфлюенсерского маркетинга. Показываем процесс, результаты, отзывы. Продаём через доверие.

Типы видео контента

1. Product Demo (2-3 мин)

Загружаю фото -> получаю результат. Показываем весь процесс от начала до конца. Без монтажа, один дубль.

Платформа: YouTube, LinkedIn Частота: 1 раз в месяц

2. Build in Public (5-10 мин)

Показываю работу над проектом: обучение модели, исправление багов, развёртывание. Raw, без фильтров.

Платформа: YouTube Частота: еженедельно

3. Case Study (3-5 мин)

Реальный клиент тестирует -> сравнение с профессиональной оценкой -> результат. Социальное доказательство.

Платформа: YouTube, Drive2.ru Частота: по запросу

4. How-To / Обучающее (5-8 мин)

"Как определить износ шин самому" - обучающий контент с моим инструментом как примером.

Платформа: YouTube Частота: 2 раза в месяц

План видео на 3 месяца

Видео 1: "Мне 48, я делаю AI для проверки шин" (запуск)
Вводное видео. Кто я, почему делаю, что хочу достичь. Личная история.
видео маркетинг
Видео 2: "Первый прототип работает!" (М2)
Демо работающего MVP. Загружаю своё фото, показываю результат.
видео
Видео 3: "Тестирую на реальных клиентах" (М5)
Съёмка в шиномонтаже. Сравнение AI vs профессионал. Честный результат.
видео
Видео 4: "Как я улучшил точность с 60% до 85%" (М8)
Техническое видео. Какие данные собрал, как обучал, что сработало.
видео ml
Видео 5: "Первый платный клиент!" (М10)
Праздную первые деньги. История B2B продажи. Скриншоты переписки.
видео

YouTube SEO

text
ОПТИМИЗАЦИЯ ВИДЕО ДЛЯ SEO:

Название (Title):
- Формат: "Scan Tire AI - [что делает] [время результата]"
- Пример: "Scan Tire AI - проверь износ шин за 10 секунд"
- Длина: до 60 символов

Описание (Description):
- 1-2 предложение о видео
- Таймкоды (00:00 Введение, 00:30 Демо...)
- Ссылки: сайт, соцсети
- Ключевые слова в первых 2 строках

Теги (Tags):
- scan tire, tire wear, tire inspection, AI, computer vision
- automotive, car maintenance, tire depth
- русские: проверка шин, износ шин, глубина протектора

Миниатюра (Thumbnail):
- Моё лицо + текст
- Контрастные цвета
- Большие буквы
- Формат: 1280x720
S

Стратегии развития

Полный набор стратегий для масштабирования продукта от MVP до устойчивого бизнеса.

1. Стратегия продукта

Фаза MVP (М1-6)

Фокус на одной функции - классификация износа. Минимальный viable продукт.

  • ResNet18, 5 классов износа
  • Одна страница загрузки
  • Простой результат
  • Обратная связь от бета-тестеров

Фаза Роста (М7-12)

Добавляем фичи на основе фидбека. Готовим монетизацию.

  • PDF отчёты
  • API для интеграций
  • Freemium модель
  • B2B пилоты

Фаза Масштаба (М13-18)

Полный продукт с OCR. Выход на международные рынки.

  • YOLOX + OCR
  • Мобильное приложение
  • Автоматизация
  • Партнёрства

Долгосрочное видение

Платформа для автоматизации любой проверки.

  • Расширение на другие типы проверок
  • B2B SaaS модель
  • Выход на рынки ЕС и США
  • Потенциальный exit

2. Go-to-Market стратегия

Целевая аудитория

Primary: Шиномонтажи, автосервисы, дилеры

Secondary: Владельцы авто (перед покупкой б/у)

Tertiary: Страховые компании, автопарки

Позиционирование

"AI-помощник для профессионалов и осмотрительных автовладельцев"

  • Не замена профессионалу
  • Первичная проверка / скрининг
  • Экономия времени
  • Объективность

3. Ценовая стратегия

Тариф Цена Лимиты Фичи
Free $0 10 проверок/месяц Базовый результат
Pro $19/мес 100 проверок/месяц PDF отчёты, приоритет
Business $99/мес Unlimited API, команда, интеграции
Enterprise $499/мес Custom Белый лейбл, SLA, поддержка

4. Метрики успеха

Метрика М1-2 М5-6 М10-12 М18
MAU 10 100 1000 5000
Точность 60% 75% 85% 90%
Конверсия Pro - - 5% 10%
MRR $0 $0 $500 $3000
B2B клиенты 0 0 5 20

5. Стратегия удержания

Email Nurturing

  • Приветственное письмо
  • Советы по использованию
  • Уведомления об улучшениях
  • Праздничные предложения

Обратная связь

  • Feedback форма после каждого результата
  • Monthly survey
  • Включение в roadmap
  • Ранний доступ к фичам

6. Риски и Mitigation

Риск Вероятность Влияние Mitigation
Низкая точность Высокая Высокое Больше данных, active learning
Нет пользователей Средняя Высокое SEO, контент, аутрич
Конкуренты Низкая Среднее Фокус на B2B, интеграции
Юридические проблемы Низкая Критичное Дисклеймеры, страховка