Scan Tire AI — План развития
Автоматическая проверка шин с помощью Computer Vision и Deep Learning. Цель: международный B2B рынок (ОАЭ, Турция, Казахстан). Срок: 18 месяцев до $3000+ MRR.
[ЛИЧНОЕ] Заметки для себя
Этот документ — только для меня. Не показывать никому до запуска. Цель: к лету 2026 иметь работающий MVP и первых платных клиентов. Фокус: сначала деньги, потом красивости. OCR — потом, если будет время.
Обзор проекта
АКТИВЕНТехнологический стек
{ "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-2: MVP (Только износ)
ИДЁТКОД: Экспорт ResNet18 -> ONNX
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
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] }); }
Месяц 3-4: Сбор данных и улучшение модели
ОЖИДАЕТМесяц 5-6: Бета-тестирование
ОЖИДАЕТТекущий интерфейс: "Зрение Терминатора"
ГОТОВОЦветовая логика оценки износа
| Класс износа | Глубина | Цвет | Визуальный индикатор |
|---|---|---|---|
| Новая | ≥ 7.0 мм | #22c55e | Зеленый оверлей |
| Хорошая | 5.0-6.9 мм | #84cc16 | Лаймовый оверлей |
| Средняя | 3.0-4.9 мм | #eab308 | Желтый оверлей |
| Изношенная | 1.6-2.9 мм | #f97316 | Оранжевый оверлей |
| Критическая | < 1.6 мм | #ef4444 | Красный оверлей |
Месяц 7-9: Масштабирование и рост
ОЖИДАЕТМесяц 10-12: Монетизация
ОЖИДАЕТ| Период | Пользователи | Точность | 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 |
Месяц 13-18: OCR боковина (Этап 2)
БУДУЩЕЕПримеры кода
Sharp.js препроцессинг (БЕЗ OpenCV)
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; }
Фронтенд: Компонент загрузки файла
'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> ); }
Юридическое и дисклеймеры
ВАЖНОЕ ПРАВОВОЕ УВЕДОМЛЕНИЕ - ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ Scan Tire AI предоставляет AI-оценки ТОЛЬКО В ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЯХ. Это НЕ замена: - Профессиональному осмотру шин сертифицированным механиком - Измерениям сертифицированным глубиномером - Визуальному осмотру при правильном освещении Используя этот сервис, вы подтверждаете: [+] Результаты - это AI-оценки (текущая точность: ~60-75%) [+] Вы НЕСЁТЕ ПОЛНУЮ ОТВЕТСТВЕННОСТЬ за решения о безопасности шин [+] Мы НЕ несём ответственности за аварии, травмы или ущерб [+] Всегда проверяйте у сертифицированного специалиста перед поездкой Это БЕТА-версия. Точность улучшается. НЕ ПОЛАГАЙТЕСЬ на неё для критически важных решений безопасности. [ Я понимаю и принимаю ] [ Отмена ]
Маркетинг - Полный план
Целевые рынки (приоритет)
| Рынок | Язык | Каналы | Почему |
|---|---|---|---|
| ОАЭ | 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 рассылка - холодное письмо
Тема: Бесплатный AI проверщик шин для [Название] (бета тест)
Привет [Имя],
Нашёл ваш шиномонтаж на Google Maps - выглядите профессионально!
Быстрый вопрос: Бывают ли у вас споры с клиентами о состоянии шин?
("Вы сказали хорошие, а они изношены!")
Я создал AI инструмент, который оценивает износ шин по фото за 10 секунд.
Никакого специального оборудования - просто камера смартфона.
Хотите протестировать БЕСПЛАТНО 2 недели?
Демо: https://scantire.com/beta
Просто сфотографируйте 3-5 шин, скажите - совпали ли оценки с реальностью.
Ваш фидбек поможет улучшить AI.
С уважением,
Слава Кузькин
Scan Tire AI
scantireai@gmail.com
LinkedIn - Build in Public (шаблоны постов)
Видео стратегия
Типы видео контента
1. Product Demo (2-3 мин)
Загружаю фото -> получаю результат. Показываем весь процесс от начала до конца. Без монтажа, один дубль.
2. Build in Public (5-10 мин)
Показываю работу над проектом: обучение модели, исправление багов, развёртывание. Raw, без фильтров.
3. Case Study (3-5 мин)
Реальный клиент тестирует -> сравнение с профессиональной оценкой -> результат. Социальное доказательство.
4. How-To / Обучающее (5-8 мин)
"Как определить износ шин самому" - обучающий контент с моим инструментом как примером.
План видео на 3 месяца
YouTube SEO
ОПТИМИЗАЦИЯ ВИДЕО ДЛЯ 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
Стратегии развития
Полный набор стратегий для масштабирования продукта от 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, интеграции |
| Юридические проблемы | Низкая | Критичное | Дисклеймеры, страховка |