मैं अंत में समस्या पर वापस आया, और इसे काम पर लाया।
समस्या बस इतनी थी कि मेरे पास कुछ शून्य था ORDImage . में मान फ़ील्ड...
StillImage . को संग्रहीत करने का प्रयास करके मुझे अपनी त्रुटि मिली सीधे मेरी फ़ोटो . में आपत्ति करें टेबल :
alter table PHOTOS add phot_source2 SI_Stillimage;
update photos p set p.phot_source2 = si_stillimage(p.phot_source.source.localData) where p.phot_id < 10;
और फिर निम्न न्यूनतम उदाहरण को लागू करना :
DECLARE
l_img_obj si_stillimage;
l_avgcolor si_averagecolor;
l_colorhist si_colorhistogram;
l_poscolor si_positionalcolor;
l_texture si_texture;
l_featurelist si_featurelist;
l_blob BLOB;
l_exist INTEGER;
BEGIN
-- get the blob from the ordimage
SELECT p.phot_source.source.localdata
INTO l_blob FROM photos p
WHERE phot_id = 2;
-- build the stillimage object from the blob
l_img_obj := NEW si_stillimage(l_blob);
-- get image features and build the featureList object
l_avgcolor := NEW si_averagecolor(l_img_obj);
l_colorhist := NEW si_colorhistogram(l_img_obj);
l_poscolor := NEW si_positionalcolor(l_img_obj);
l_texture := NEW si_texture(l_img_obj);
l_featurelist := NEW si_featurelist(l_avgcolor, 1, l_colorhist, 1, l_poscolor, 1, l_texture, 1);
-- check if a similar image is found in the table
SELECT 1
INTO l_exist
FROM photos p
WHERE si_scorebyftrlist(l_featurelist, p.phot_source2) = 0
AND phot_id < 10
AND rownum = 1;
-- show message if at least one similar photo has been found
IF (l_exist = 1) THEN
dbms_output.put_line('A similar photo has been found');
END IF;
END;
/
phot_id
. को प्रतिबंधित करते समय यह ठीक काम कर रहा था p.phot_source2
. को बदलकर भी 10 तक si_mkstillimage1(p.phot_source.source.localdata)
. के साथ (जो समस्या पैदा कर रहा था)। लेकिन phot_id
. को हटाते समय यह विफल हो गया प्रतिबंध तो मैं अंत में समझ गया कि मेरे पास कुछ शून्य है phot_source
में मान कॉलम (ORDImage ) जो समस्या पैदा कर सकता है।
और वास्तव में SI_StillImage()
को कॉल कर रहे हैं एक शून्य . के साथ कंस्ट्रक्टर पैरामीटर निम्न त्रुटि संदेश की ओर जाता है:
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at "ORDSYS.SI_STILLIMAGE", line 27
ORA-06512: at "ORDSYS.SI_MKSTILLIMAGE1", line 6
ORA-06512: at line 24
मैंने सभी शून्य को हटा दिया phot_source
. से मान कॉलम और अब सब ठीक काम कर रहा है :)
आगे जाने के लिए:
इसका नकारात्मक पक्ष यह है कि तालिका में संग्रहीत सभी छवियों के साथ तुलना करने में बहुत लंबा समय लगता है (1155 सेकंड (लगभग 20 मिनट) 5000 . के लिए तस्वीरें)। इसलिए मैंने इमेज फीचर्स को सीधे टेबल में स्टोर करने की कोशिश की है:
alter table photos add (
phot_averagecolor si_averagecolor,
phot_colorhistogram si_colorhistogram,
phot_positionalcolor si_positionalcolor,
phot_texture si_texture
)
update photos p set
p.phot_averagecolor = si_averagecolor(si_stillimage(p.phot_source.source.localData)),
p.phot_colorhistogram = si_colorhistogram(si_stillimage(p.phot_source.source.localData)),
p.phot_positionalcolor = si_positionalcolor(si_stillimage(p.phot_source.source.localData)),
p.phot_texture = si_texture(si_stillimage(p.phot_source.source.localData))
where p.phot_id < 10
और फिर इस तरह तुलना करें:
-- get the blob from the ordimage
SELECT p.phot_source.source.localdata
INTO l_blob FROM photos p
WHERE phot_id = 2;
-- build the stillimage object from the blob
l_img_obj := NEW si_stillimage(l_blob);
-- get image features and build the featureList object
l_avgcolor := si_averagecolor(l_img_obj);
l_colorhist := si_colorhistogram(l_img_obj);
l_poscolor := si_positionalcolor(l_img_obj);
l_texture := si_texture(l_img_obj);
l_featurelist := NEW si_featurelist(l_avgcolor, 1, l_colorhist, 1, l_poscolor, 1, l_texture, 1);
-- check if a similar image is found in the table
SELECT 1
INTO l_exist
FROM photos p
WHERE p.phot_averagecolor = l_avgcolor
AND p.phot_colorhistogram = l_colorhist
AND p.phot_positionalcolor = l_poscolor
AND p.phot_texture = l_texture
AND p.phot_id < 10
AND rownum = 1;
लेकिन यह निम्न त्रुटि देता है क्योंकि =
. का उपयोग करके सीधे छवि सुविधाओं की तुलना करना संभव नहीं लगता है ऑपरेटर :
ORA-22901: cannot compare VARRAY or LOB attributes of an object type
ORA-06512: at line 24
मैंने सोचा था कि छवि सुविधाओं को संख्यात्मक मानों के रूप में संग्रहीत करना एक समाधान होगा, लेकिन मैंने संपूर्ण दस्तावेज़ीकरण और मुझे छवि सुविधा से कोई संगत संख्यात्मक मान प्राप्त करने का कोई तरीका नहीं मिला है।
सौभाग्य से, SI_score
प्रत्येक छवि सुविधा के लिए फ़ंक्शन प्रदान किए जाते हैं, इसलिए हम छवियों की तुलना करने के लिए निम्नलिखित का उपयोग कर सकते हैं:
DECLARE
l_img_obj si_stillimage;
l_blob BLOB;
l_exist INTEGER;
BEGIN
-- get the blob from the ordimage
SELECT p.phot_source.source.localdata
INTO l_blob FROM photos p
WHERE phot_id = 2;
-- build the stillimage object from the blob
l_img_obj := NEW si_stillimage(l_blob);
-- check if a similar image is found in the table
SELECT 1
INTO l_exist
FROM photos p
WHERE p.phot_averagecolor.SI_Score(l_img_obj) = 0
AND p.phot_colorhistogram.SI_Score(l_img_obj) = 0
AND p.phot_positionalcolor.SI_Score(l_img_obj) = 0
AND p.phot_texture.SI_Score(l_img_obj) = 0
AND rownum = 1;
-- show message
dbms_output.put_line(l_count || ' similar photo(s) found');
END;
/
मैंने 1155 सेकेंड (लगभग 20 मिनट) . से समय कम किया है से 226 सेकंड (3 मिनट से कम) 5000 . के लिए छवियां।
मुझे पता है, यह अभी भी बहुत धीमा है, लेकिन मुझे प्रदर्शन में सुधार करने का दूसरा तरीका नहीं मिल रहा है..., अगर किसी के पास कोई विचार है तो साझा करने में संकोच न करें।