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); } }
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; }
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; }
/** * 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); } } }
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; }