mirror of
https://github.com/qwertyforce/scenery.git
synced 2025-05-31 11:42:35 +00:00
color_similarities reworked
This commit is contained in:
parent
8f5244769c
commit
82c396f509
@ -51,7 +51,7 @@ export async function getStaticProps(context: any) {
|
||||
const photos = []
|
||||
if (context.params.id) {
|
||||
const id=parseInt(context.params.id)
|
||||
let similar_by_color:Array<Record<string,any>>=(await db_ops.image_search.get_color_similarities_by_id(id)).filter((el:any)=>el.similarity>0.2)
|
||||
let similar_by_color:Array<Record<string,any>>=((await db_ops.image_search.get_color_similarities_by_id(id))[0].similarities).filter((el:any)=>el.similarity>0.2)
|
||||
similar_by_color.sort((a,b)=>b.similarity-a.similarity)
|
||||
similar_by_color=similar_by_color.slice(0,images_on_page)
|
||||
for(const img of similar_by_color){
|
||||
|
@ -2,6 +2,7 @@ import * as cv from 'opencv4nodejs'
|
||||
import { HistAxes } from 'opencv4nodejs';
|
||||
import path from 'path';
|
||||
import db_ops from '../helpers/db_ops'
|
||||
import config from '../../config/config'
|
||||
const BIN_SIZE=16
|
||||
const histAxes:HistAxes[]= [
|
||||
new HistAxes({
|
||||
@ -20,9 +21,10 @@ const histAxes:HistAxes[]= [
|
||||
ranges: [0, 255]
|
||||
}),
|
||||
]
|
||||
const PATH_TO_IMAGES = path.join("..", "..", "..", 'public', 'images')
|
||||
const PATH_TO_IMAGES = path.join(config.root_path, 'public', 'images')
|
||||
|
||||
async function calculate_color_hist(){
|
||||
return
|
||||
const images = await db_ops.image_ops.get_all_images()
|
||||
for(const image of images){
|
||||
const check_if_already_calculated= await db_ops.image_search.get_color_hist_by_id(image.id)
|
||||
@ -41,21 +43,35 @@ async function calculate_color_hist(){
|
||||
}
|
||||
|
||||
async function calc_similarities() {
|
||||
const cache=[]
|
||||
const images = await db_ops.image_ops.get_all_images()
|
||||
for(let i=0;i<images.length;i++){
|
||||
cache[i]=Array(images.length).fill(-1)
|
||||
}
|
||||
const get_all_hist=await db_ops.image_search.get_all_color_hists()
|
||||
console.time();
|
||||
for (let i = 0; i < images.length - 1; i++) {
|
||||
const check_if_already_calculated=await db_ops.image_search.get_color_similarities_by_id(images[i].id)
|
||||
if(check_if_already_calculated.length!==0){
|
||||
continue
|
||||
}
|
||||
// const check_if_already_calculated=await db_ops.image_search.get_color_similarities_by_id(images[i].id)
|
||||
// if(check_if_already_calculated.length!==0){
|
||||
// continue
|
||||
// }
|
||||
|
||||
const target_image = get_all_hist.find((el)=>el.id===images[i].id)
|
||||
const target_hist = new cv.Mat(target_image.color_hist, cv.CV_32F)
|
||||
const similarities=[]
|
||||
for (let j = i + 1; j < images.length; j++) {
|
||||
for (let j = 0; j < images.length; j++) {
|
||||
if(i===j){
|
||||
continue;
|
||||
}
|
||||
if(cache[j][i]!==-1){
|
||||
console.log('cache hit')
|
||||
similarities.push({id:images[j].id,similarity:cache[j][i]})
|
||||
continue
|
||||
}
|
||||
const _image = get_all_hist.find((el)=>el.id===images[j].id)
|
||||
const color_hist_mat = new cv.Mat(_image.color_hist, cv.CV_32F);
|
||||
const similarity = await target_hist.compareHistAsync(color_hist_mat, cv.HISTCMP_INTERSECT)
|
||||
cache[i][j]=similarity
|
||||
similarities.push({id:images[j].id,similarity:similarity})
|
||||
color_hist_mat.release()
|
||||
console.log(`${i}->${j}`)
|
||||
@ -67,6 +83,6 @@ async function calc_similarities() {
|
||||
async function calc_color_hists_and_similarities() {
|
||||
await calculate_color_hist()
|
||||
await calc_similarities()
|
||||
process.exit()
|
||||
// process.exit()
|
||||
}
|
||||
calc_color_hists_and_similarities()
|
@ -94,12 +94,7 @@ async function generate_id() {
|
||||
async function get_color_similarities_by_id(id:number){
|
||||
const collection = client.db(db_main).collection("color_similarities");
|
||||
// collection.find(selector).project({_id:0}).explain((_err,exp)=>console.log(exp))
|
||||
const similarities_by_id = await collection.find({id:id}).project({_id:0,id:0}).toArray()
|
||||
const similarities=(similarities_by_id[0]?.similarities||[])
|
||||
const other_images_similar_by_id = await collection.find({similarities: { $elemMatch: { id: id} }}).project({_id:0,id:1,"similarities.$": 1,}).toArray()
|
||||
for(const x of other_images_similar_by_id){
|
||||
similarities.push({id:x.id,similarity:x.similarities[0].similarity})
|
||||
}
|
||||
const similarities = collection.find({id:id}).project({_id:0,id:0}).toArray()
|
||||
return similarities
|
||||
}
|
||||
|
||||
|
@ -27,14 +27,16 @@ const histAxes:HistAxes[]= [
|
||||
rgb_hist = rgb_hist.div(img_mat.sizes[0]*img_mat.sizes[1])
|
||||
const arr=rgb_hist.getDataAsArray()
|
||||
db_ops.image_search.add_color_hist_by_id(new_image_id,arr)
|
||||
const similarities=[]
|
||||
const ids=(await db_ops.image_search.get_image_ids_from_color_similarities()).map((el)=>el.id)
|
||||
for(const _id of ids){
|
||||
const _image = (await db_ops.image_search.get_color_hist_by_id(_id))[0]
|
||||
const color_hist_mat = new cv.Mat(_image.color_hist, cv.CV_32F);
|
||||
const similarity = await rgb_hist.compareHistAsync(color_hist_mat, cv.HISTCMP_INTERSECT)
|
||||
color_hist_mat.release()
|
||||
similarities.push({id:_id,similarity:similarity})
|
||||
db_ops.image_search.add_color_similarity_to_other_image(_id,{id:new_image_id,similarity:similarity})
|
||||
}
|
||||
await db_ops.image_search.add_color_similarities_by_id(new_image_id,[])
|
||||
await db_ops.image_search.add_color_similarities_by_id(new_image_id,similarities)
|
||||
}
|
||||
export default {calculate_color_hist_and_similarities}
|
@ -57,6 +57,7 @@ async function import_from_derpi(req: Request, res: Response) {
|
||||
await db_ops.image_ops.add_image(new_image_id, derpi_data.format.toLowerCase(), derpi_data.width, derpi_data.height, parsed_author, derpi_data.size,
|
||||
derpi_link, derpi_data.upvotes, derpi_data.downvotes, derpi_data.id, derpi_data.created_at,
|
||||
derpi_data.source_url, derpi_data.tags, derpi_data.wilson_score, derpi_data.sha512_hash, phash, derpi_data.description)
|
||||
console.log(`OK. New image_id: ${new_image_id}`)
|
||||
res.json({ message: `OK. New image_id: ${new_image_id}`})
|
||||
return
|
||||
} catch (error) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user