Esempio n. 1
0
File: Art.php Progetto: 4otaku/api
 protected function track_similar()
 {
     if (!function_exists('puzzle_fill_cvec_from_file') || !function_exists('puzzle_vector_normalized_distance') || !function_exists('puzzle_compress_cvec') || !function_exists('puzzle_uncompress_cvec')) {
         return;
     }
     $unparsed = $this->db->limit(100)->get_vector('art', array('id', 'md5', 'ext'), 'vector = ""');
     foreach ($unparsed as $id => $image) {
         $file = IMAGES . SL . 'art' . SL . $image['md5'] . '.' . $image['ext'];
         $vector = puzzle_fill_cvec_from_file($file);
         $vector = base64_encode(puzzle_compress_cvec($vector));
         $this->db->update('art', array('similar_tested' => 0, 'vector' => $vector), $id);
     }
     $all = $this->db->get_vector('art', array('id', 'vector'), 'vector != ""');
     $arts = $this->db->limit(100)->get_vector('art', array('id', 'vector'), 'vector != "" and similar_tested = 0');
     foreach ($all as $id => $vector) {
         $all[$id] = puzzle_uncompress_cvec(base64_decode($vector));
     }
     foreach ($arts as $id => $vector) {
         $vector = puzzle_uncompress_cvec(base64_decode($vector));
         foreach ($all as $compare_id => $compare_vector) {
             if ($id != $compare_id && puzzle_vector_normalized_distance($vector, $compare_vector) < 0.3) {
                 $id_first = min($id, $compare_id);
                 $id_second = max($id, $compare_id);
                 $this->db->insert('art_similar', array('id_first' => $id_first, 'id_second' => $id_second));
             }
         }
         $this->db->update('art', array('similar_tested' => 1), $id);
     }
 }
Esempio n. 2
0
function find_similar_pictures($md5, $cvec, $threshold = PUZZLE_CVEC_SIMILARITY_THRESHOLD)
{
    $compressed_cvec = puzzle_compress_cvec($cvec);
    $words = split_into_words($cvec);
    $dbh = new PDO(DB_DSN);
    $dbh->beginTransaction();
    $sql = 'SELECT DISTINCT(signature_id) AS signature_id FROM words ' . 'WHERE pos_and_word IN (';
    $coma = FALSE;
    foreach ($words as $u => $word) {
        if ($coma === TRUE) {
            $sql .= ',';
        }
        $sql .= $dbh->quote(chr($u) . puzzle_compress_cvec($word));
        $coma = TRUE;
    }
    $sql .= ')';
    $res_words = $dbh->query($sql);
    $scores = array();
    $st = $dbh->prepare('SELECT compressed_signature, picture_id ' . 'FROM signatures WHERE id = :id');
    while (($signature_id = $res_words->fetchColumn()) !== FALSE) {
        $st->execute(array(':id' => $signature_id));
        $row = $st->fetch();
        $found_compressed_signature = $row['compressed_signature'];
        $picture_id = $row['picture_id'];
        $found_cvec = puzzle_uncompress_cvec($found_compressed_signature);
        $distance = puzzle_vector_normalized_distance($cvec, $found_cvec);
        if ($distance < $threshold && $distance > 0.0) {
            $scores[$picture_id] = $distance;
        }
    }
    $sql = 'SELECT url FROM sentpictures WHERE picture_id IN (';
    $coma = FALSE;
    foreach ($scores as $picture_id => $score) {
        if ($coma === TRUE) {
            $sql .= ',';
        }
        $sql .= $dbh->quote($picture_id);
        $coma = TRUE;
    }
    $sql .= ')';
    $urls = array();
    if (!empty($scores)) {
        $res_urls = $dbh->query($sql);
        while (($url = $res_urls->fetchColumn()) !== FALSE) {
            array_push($urls, $url);
        }
    }
    $dbh->commit();
    return $urls;
}
Esempio n. 3
0
 public function insert()
 {
     if (!Check::is_hash($this->get('md5')) || !Check::is_hash($this->get('thumb')) || !$this->get('extension') || Database::get_count('art', 'md5 = ?', $this->get('md5'))) {
         return $this;
     }
     if ($this->get('resized') == 1) {
         $this->calculate_resize();
     }
     $this->set('pretty_date', Transform_Text::rudate());
     $this->set('sortdate', ceil(microtime(true) * 1000));
     if (!$this->get('area')) {
         $this->set('area', def::area(1));
     }
     $this->correct_tags();
     parent::insert();
     if (function_exists('puzzle_fill_cvec_from_file') && function_exists('puzzle_compress_cvec')) {
         $imagelink = IMAGES . SL . 'booru' . SL . 'thumbs' . SL . 'large_' . $this->get('thumb') . '.jpg';
         $vector = puzzle_fill_cvec_from_file($imagelink);
         $vector = base64_encode(puzzle_compress_cvec($vector));
         Database::insert('art_similar', array('id' => $this->get_id(), 'vector' => $vector));
     }
     return $this;
 }
Esempio n. 4
0
 /**
  * Get face signature from an existing face image.
  *
  * @param integer $image_id Image ID face belongs to
  * @param integer $face_id Face ID to check
  *
  * @throws Ansel_Exception
  */
 function saveSignature($image_id, $face_id)
 {
     // can we get it?
     if (empty($GLOBALS['conf']['faces']['search']) || Horde_Util::loadExtension('libpuzzle') === false) {
         return;
     }
     // Ensure we have an on-disk file to read the signature from.
     $path = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Vfs')->create('images')->readFile(Ansel_Faces::getVFSPath($image_id) . '/faces', $face_id . Ansel_Faces::getExtension());
     $signature = puzzle_fill_cvec_from_file($path);
     if (empty($signature)) {
         return;
     }
     // save compressed signature
     $sql = 'UPDATE ansel_faces SET face_signature = ? WHERE face_id = ?';
     $params = array(new Horde_Db_Value_Binary(puzzle_compress_cvec($signature)), $face_id);
     try {
         $GLOBALS['ansel_db']->update($sql, $params);
     } catch (Horde_Db_Exception $e) {
         throw new Ansel_Exception($result);
     }
     // create index
     $word_len = $GLOBALS['conf']['faces']['search'];
     $str_len = strlen($signature);
     $GLOBALS['ansel_db']->delete('DELETE FROM ansel_faces_index WHERE face_id = ' . $face_id);
     $q = 'INSERT INTO ansel_faces_index (face_id, index_position, index_part) VALUES (?, ?, ?)';
     $c = $str_len - $word_len;
     for ($i = 0; $i <= $c; $i++) {
         $data = array($face_id, $i, new Horde_Db_Value_Binary(substr($signature, $i, $word_len)));
         try {
             $GLOBALS['ansel_db']->insert($q, $data);
         } catch (Horde_Db_Exception $e) {
             throw new Ansel_Exception($e);
         }
     }
 }
Esempio n. 5
0
 protected function get_upload_data($key)
 {
     $md5 = substr($key, 0, 32);
     $id = substr($key, 32);
     if (!isset(self::$upload_cache[$id])) {
         self::$upload_cache[$id] = $this->db->get_full_row('art_upload', $id);
     }
     $data = self::$upload_cache[$id];
     if (empty($data) || $data['md5'] != $md5) {
         throw new ErrorApi('Неверный ключ загрузки', ErrorApi::INCORRECT_INPUT);
     }
     $exist = $this->db->get_field('art', 'id', 'md5 = ?', $md5);
     if ($exist) {
         throw new ErrorApi($exist, ErrorUpload::ALREADY_EXISTS);
     }
     unset($data['id'], $data['date'], $data['name']);
     if (function_exists('puzzle_fill_cvec_from_file') && function_exists('puzzle_compress_cvec')) {
         $imagelink = $this->get_images_path() . 'art' . SL . $md5 . '_largethumb.jpg';
         $vector = puzzle_fill_cvec_from_file($imagelink);
         $vector = base64_encode(puzzle_compress_cvec($vector));
         $data['vector'] = $vector;
     }
     return $data;
 }