color_similarities reworked

This commit is contained in:
qwertyforce 2020-09-23 13:13:31 +03:00
parent 8f5244769c
commit 82c396f509
5 changed files with 29 additions and 15 deletions

View File

@ -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){

View File

@ -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()

View File

@ -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
}

View File

@ -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}

View File

@ -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) {