cardstream
Tentang

Intinya: bertanya satu kali per kartu, bukan satu kali per frame

Pengenalan kartu sudah bekerja dengan baik. Arahkan model yang bagus ke sebuah kartu koleksi, dan nama, set, serta nomornya kembali dalam kira-kira setengah detik. Menjalankannya pada video-lah yang membuat semuanya berantakan. Bukan soal teknis, melainkan soal jumlah.

Video sebagian besar adalah pengulangan. Kartu yang diangkat selama empat detik pada lima belas frame per detik berarti enam puluh gambar dari satu kartu, dan bertanya ke endpoint identifikasi enam puluh kali memberimu jawaban yang sama enam puluh kali. Setiap pipeline streaming yang naif melakukan persis itu, dan itulah sebabnya analisis siaran dianggap hanya sanggup dijalankan platform bermodal besar.

cardstream ada untuk membuang pengulangan itu. Ia adalah state machine kecil di antara videomu dan panggilan pengenalan, yang dibangun hampir seluruhnya dari sinyal yang dihitungnya sendiri: apakah adegannya sudah diam, apakah ini kartu yang sama dengan sesaat lalu, apakah memang ada kartu di frame. Panggilan keluar ketika kartu yang benar-benar baru sudah diam, dan selain itu tidak. Sisanya berjalan di perangkat yang sudah kamu miliki.

Hitungannya

Satu panggilan per kartu, bukan per frame

Satu jam live pada lima belas frame per detik, yaitu batas atas laju yang dipakai untuk memverifikasi proyek ini, dan kira-kira seratus kartu berbeda yang ditaruh di depan lensa. Dua cara menganalisis video yang persis sama:

Frame demi frame 54.000

panggilan identifikasi: satu per frame, dan sebagian besar mengulang pertanyaan yang sudah dijawab sesaat sebelumnya.

Dengan cardstream ~100

panggilan identifikasi: satu per kartu berbeda, berapa pun frame rate-mu, selama apa pun kamu mengangkat tiap kartu.

Sekitar 540× lebih sedikit panggilan, dan selisih itu bukan permainan angka: itulah seluruh rancangannya. Pegang kartu diam, dan hitungannya tidak bergerak. Jalankan kamera lebih cepat, dan hitungannya tidak bergerak. Jumlah panggilan mengikuti kartu yang kamu tunjukkan, bukan lamanya kamu siaran.

Pengelolaan

Siapa yang menjaganya tetap berjalan

Dibuat oleh orang-orang yang menggarap pengenalan

cardstream berasal dari tim di balik pengenalan barang koleksi Ximilar. Endpoint identifikasi yang dipanggilnya adalah endpoint yang kami jalankan di produksi, jadi klien dan layanannya dirawat oleh orang yang sama.

Pekerjaannya terbuka

Paket lengkapnya ada di GitHub: state machine-nya, kedua bentuk deployment, dan antarmuka browsernya. Tidak ada bagian logika keputusan yang disembunyikan di balik layanan yang tidak bisa kamu periksa.

Diuji tanpa jaringan

Seluruh rangkaian pengujian berjalan offline, dengan objek tiruan menggantikan file model dan panggilan HTTP. Fork reponya di laptop tanpa kunci API, dan kamu tetap bisa tahu apakah ada yang kamu rusak.

Prinsip

Hal yang tidak boleh dilupakan kodenya

  1. Satu panggilan per kartu, bukan per frame

    Setiap keputusan desain berawal dari sini. Kalau sebuah sinyal bisa dihitung secara lokal, ia berjalan sebelum satu-satunya panggilan yang keluar dari komputer.

  2. Satu salinan logika keputusan

    Kapan harus memanggil ditentukan di tepat satu modul. Tidak tersebar di driver, transport, dan UI tempat tiga orang bisa mengubahnya dengan tiga cara. Satu file, yang bisa dibaca habis sekali duduk.

  3. Driver tetap tipis

    Penjadwalan, logging, dan I/O adalah urusan driver; apa yang terhitung sebagai kartu baru adalah urusan mesin. Mengganti cara frame datang tidak pernah diam-diam mengubah kapan sebuah panggilan keluar.

  4. Tidak ada yang memblokir loop frame

    Decode, deteksi, HTTP, dan disk semuanya berjalan di luar loop. Identifikasi yang lambat membuang satu frame, dan tidak pernah mengubah siaranmu menjadi lag yang terus menumpuk.

  5. Tanpa lock-in penyedia, termasuk kami

    Panggilan identifikasi adalah satu langkah yang bisa ditukar di balik antarmuka kecil. Setiap gerbang, pembatas, dan cache tetap bekerja kalau kamu mengarahkannya ke tempat lain sama sekali.

  6. Di-host sendiri sebagai bawaan

    Perangkatmu, kuncimu, videomu. Dalam mode sisi klien, satu potongan gambar per kartu berbeda adalah satu-satunya hal yang keluar dari komputer, kecuali kamu memilih menyimpan live-mu ke akun Ximilar-mu sendiri.

Catatan lapangan

Hal-hal yang diajarkan kartu kepada kami

Sebagian dari ini cukup berlawanan dengan intuisi, sehingga kami menuliskannya di tempat orang berikutnya akan menemukannya: di repo, di samping kode yang dibatasinya.

Petunjuk yang membantu bisa mengorbankan akurasi

Memberi tahu endpoint dari game mana sebuah kartu berasal mematikan pengklasifikasi sistem tulisan miliknya, yang lalu kembali ke latin. Akibatnya, kartu berbahasa Jepang diam-diam dicocokkan dengan cetakan bahasa Inggrisnya. Ini hasil pengukuran, bukan tebakan, dan karena itulah menyetel game tanpa sistem tulisan diperlakukan sebagai kesalahan.

Potongan gambar yang sedikit longgar lebih mudah cocok

Potongan yang rapat di sekeliling kartu tampak benar, tetapi hasilnya lebih buruk. Potongan gambar yang dikirim sengaja diberi margin, karena sedikit konteks lebih berguna daripada tepi yang bersih.

Pulih lebih baik daripada berpura-pura

Ketika sebuah panggilan menggantung melewati timeout-nya, pipeline melepaskan diri dan melanjutkan, alih-alih menunggu hasil yang mungkin tidak pernah datang. Keterbatasan itu dituliskan di repo, bukan ditutup-tutupi.

Kode sumber dan kontribusi

Baca, jalankan, kirim patch

Repositorinya publik: satu paket Python yang bisa diinstal, dengan extras yang independen dan antarmuka browser. Bobot pencari kartu dan embedding adalah milik kami, dilatih dan diterbitkan di bawah Apache-2.0 bersama tiap rilis. Issue dan pull request kami sambut, terutama laporan dari live sungguhan, yang memunculkan hal-hal yang tidak akan ditemukan perangkat uji mana pun.

Pengenalannya sendiri adalah endpoint Ximilar dan akan selalu begitu, karena di situlah basis data kartunya berada. Semua yang ada di sekelilingnya bebas kamu ubah.

Open source. Di-host sendiri. Siaranmu, perangkatmu.

Tanpa platform di tengah, tanpa lisensi per pengguna: hubungkan API Ximilar atau sistem identifikasimu sendiri, dan cardstream memanggilnya satu kali per kartu berbeda, bukan satu kali per frame. Entah kamu melakukan break di Whatnot, mengadakan live ala Fanatics Live, atau menyiarkan jualan live dengan caramu sendiri, jalankan cardstream malam ini di perangkat yang sudah kamu punya.