diff --git a/pages/similar_by_color/[id].tsx b/pages/similar_by_color/[id].tsx index 96beec4..a741242 100644 --- a/pages/similar_by_color/[id].tsx +++ b/pages/similar_by_color/[id].tsx @@ -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>=(await db_ops.image_search.get_color_similarities_by_id(id)).filter((el:any)=>el.similarity>0.2) + let similar_by_color:Array>=((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){ diff --git a/server/bulk_calculate_color_hist_and_similarities/calculate_color_hists_and_similarities.ts b/server/bulk_calculate_color_hist_and_similarities/calculate_color_hists_and_similarities.ts index d055ccb..143dc9e 100644 --- a/server/bulk_calculate_color_hist_and_similarities/calculate_color_hists_and_similarities.ts +++ b/server/bulk_calculate_color_hist_and_similarities/calculate_color_hists_and_similarities.ts @@ -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;iel.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() \ No newline at end of file diff --git a/server/helpers/db_ops.ts b/server/helpers/db_ops.ts index bf26c56..d5022b2 100644 --- a/server/helpers/db_ops.ts +++ b/server/helpers/db_ops.ts @@ -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 } diff --git a/server/helpers/image_ops.ts b/server/helpers/image_ops.ts index c9c4168..2d1c760 100644 --- a/server/helpers/image_ops.ts +++ b/server/helpers/image_ops.ts @@ -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} \ No newline at end of file diff --git a/server/routes/import_from_derpi.ts b/server/routes/import_from_derpi.ts index a64bb19..ad4ba85 100644 --- a/server/routes/import_from_derpi.ts +++ b/server/routes/import_from_derpi.ts @@ -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) {