Zpět na seznam článků RSS

Textová 3D CAPTCHA

Rozpozná­vání textu je značně exponova­ná disciplí­na umělé inteligen­ce. Potřeba digitali­zace dokumentů bohužel dala zrodu OCR algorit­mům s menší chybovos­tí, než má lidský zrak. Pokud má Turingův test stále používat text, měl by lépe reflekto­vat schopnos­ti svého protivní­ka.

Neuronové sítě nemají problémy s konven­čním textem

Moderní neuronové sítě pro obrazovou analýzu vycházejí podstat­nou měrou z fyzio­logie člověka. Objekty identifi­kují nejčastě­ji postupnou detekcí a prostoro­vou agregací (naučených) tvarů částí hran.1 Pro potřeby konstruk­ce Turingova testu je potřeba pochopit, ž­e:

Pro identifi­kaci objektů v perspek­tivě jsou potřeba vyšší mozkové fun­kce

Valná část obrazové analýzy se u člověka odbude už na sítnici. Ta není jenom tupý CCD čip, má taky několik vrstev neuronů, které především detekují hrany, korigují jasový a barevný bias, odstraňu­jí nepodstat­né vjemy, jako jsou souvislé plochy a zeslabují neměnné signály, jako obroučky brýlí nebo nos mezi očima. 2

Touto evolucí už umělá inteligen­ce prošla taky. Proto je vhodné se posunout dále, k disci­plínám, které prozatím nejsou tak dobře zvládnu­ty.

Axonome­trický průmět textového reliéfu

Základní princip je asi zřejmý z ukázky. Jas každého pixelu je transfor­mován do Z souřad­nice. Vzniklá trojroz­měrná plocha je vykresle­na ve formě drátěného modelu a axonome­tricky promítnu­ta do roviny.3

Matrice je doplněna náhodným šumem, aby výsledný trojroz­měrný objekt nebyl zcela determi­nistický.

Tímto jsme neuronové síti sebrali vítr z plach­et, schopnost identifi­kovat hrany jí teď nestačí.

PHP třída pro axonome­trický průmět 3D reliéfu

Pro jednoduchost používám vestavěný (rastro­vý) font knihovny GD4. Není ale problém použít vlastní, křivkový, větší a čitelněj­ší.

<?php
namespace Cleverweb;

/**
 * Simple axonometric 3D text CAPTCHA
 * @author martin.hozik@cleverweb.cz
 */
class Text3DCAPTCHA {

   protected $s;
   protected $b;
   protected $font;

   /**
    * @param float $s scale
    * @param int $font identifier (see imageloadfont)
    * @param float $b axonometric projection angle (rad)
    */
   public function __construct($s = 5., $font = 5, $b = 7.6) {
      $this->s = $s;
      $this->font = $font;
      $this->b = $b;
   }

   /**
    * Output text as PNG CAPTCHA image
    * @param string $text
    * @param int $fg foreground color
    * @param int $bg background color
    * @param int $noise intesity (0-255)
    */
   public function draw($text, $fg = 0, $bg = 0xFFFFFF, $noise = 0x30) {
      $w = imagefontwidth($this->font) * strlen($text) + 6;
      $h = imagefontheight($this->font) + 2;
      $pad = $this->s * $h * cos($this->b);

      $p = imagecreatetruecolor($w, $h);
      imagestring($p, $this->font, 3, 1, $text, 0xFF);
      $this->noise($p, $noise);

      $i = imagecreatetruecolor($w * $this->s + $pad, $h * sin($this->b) * $this->s);
      imageantialias($i, true);
      imagefill($i, 0, 0, $bg);

      for ($x = 1; $x < $w - 1; $x++)
         for ($y = 1; $y < $h - 1; $y++) {
            list($x1, $y1) = $this->to2d($x, $y, imagecolorat($p, $x, $y) / 0xFF);
            list($x2, $y2) = $this->to2d($x-1, $y+1, imagecolorat($p, $x-1, $y+1) / 0xFF);
            imageline($i, $x1 + $pad, $y1, $x2 + $pad, $y2, $fg);
         }

      imagedestroy($p);
      imagepng($i);
      imagedestroy($i);
   }

   protected function to2d($x, $y, $z) {
      return array(
         $x * $this->s - $y * $this->s * cos($this->b),
         $y * $this->s * sin($this->b) - $z * $this->s
      );
   }

   protected function noise($r, $i) {
      if ($i === 0)
         return;

      for ($x = 0; $x < imagesx($r); $x++)
         for ($y = 0; $y < imagesy($r); $y++) {
            imagesetpixel($r, $x, $y, imagecolorat($r, $x, $y) + mt_rand(0, $i));
         }
   }
}

Jedna ze starších variant této mé třídy používala místo axonome­trie (věrněj­ší) lineární perspek­tivu. Princip je shodný, jen jsou pak projekční rovnice pětkrát delší a výpočet rozměrů projekční plochy pětkrát větší vo­ser.

Reference

  1. Convolu­tional Neural Networks (LeNet) — deeplear­ning.net
  2. Webvisi­on: The Organiza­tion of the Retina and Visual System — webvisi­on.med.u­tah.edu
  3. The Mathema­tics Behind Graphical Drawing Projecti­ons in Technical Drawing — andrewhar­vey4.wor­dpress.com
  4. PHP: imagestrin­g — php.net

Pokud není uvedeno jinak, podléhá obsah licenci CC BY-NC-ND a ukázkové zdrojové kódy CC BY.
Martin Hozík —