aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/collections/collectionFreeForm
diff options
context:
space:
mode:
authorIEatChili <nanunguyen99@gmail.com>2024-06-26 13:58:20 -0400
committerIEatChili <nanunguyen99@gmail.com>2024-06-26 13:58:20 -0400
commit3190f1eb07a47a5e1ccdd20e346b47094118292d (patch)
tree7b8dab1763720ee71bc89e888b0296fdd31054b5 /src/client/views/collections/collectionFreeForm
parent376ff1626b24cbac12b27ad072690424549f05c7 (diff)
feat: worked more on keyword input for docs
Diffstat (limited to 'src/client/views/collections/collectionFreeForm')
-rw-r--r--src/client/views/collections/collectionFreeForm/ImageLabelBox.tsx53
-rw-r--r--src/client/views/collections/collectionFreeForm/MarqueeView.tsx28
2 files changed, 42 insertions, 39 deletions
diff --git a/src/client/views/collections/collectionFreeForm/ImageLabelBox.tsx b/src/client/views/collections/collectionFreeForm/ImageLabelBox.tsx
index cfb81e1a0..fec4d3e12 100644
--- a/src/client/views/collections/collectionFreeForm/ImageLabelBox.tsx
+++ b/src/client/views/collections/collectionFreeForm/ImageLabelBox.tsx
@@ -123,7 +123,6 @@ export class ImageLabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
@action
groupImages = () => {
this.groupImagesInBox();
- MainView.Instance.closeFlyout();
};
@action
@@ -161,16 +160,7 @@ export class ImageLabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
classifyImagesInBox = async () => {
this.startLoading();
- // const imageInfos = this._selectedImages.map(async doc => {
- // if (!doc[DocData].data_labels) {
- // const [name, type] = ImageCast(doc[Doc.LayoutFieldKey(doc)]).url.href.split('.');
- // return CollectionCardView.imageUrlToBase64(`${name}_o.${type}`).then(hrefBase64 =>
- // !hrefBase64 ? undefined :
- // gptImageLabel(hrefBase64).then(labels =>
- // Promise.all(labels.split('\n').map(label => gptGetEmbedding(label))).then(embeddings =>
- // ({ doc, embeddings, labels }))) ); // prettier-ignore
- // }
- // }); // Converts the images into a Base64 format, afterwhich the information is sent to GPT to label them.
+ // Converts the images into a Base64 format, afterwhich the information is sent to GPT to label them.
const imageInfos = this._selectedImages.map(async doc => {
if (!doc[DocData].data_labels) {
@@ -178,8 +168,7 @@ export class ImageLabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
return CollectionCardView.imageUrlToBase64(`${name}_o.${type}`).then(hrefBase64 =>
!hrefBase64 ? undefined :
gptImageLabel(hrefBase64).then(labels =>
-
- ({ doc, labels }))) ; // prettier-ignore
+ ({ doc, labels }))) ; // prettier-ignore
}
});
@@ -194,24 +183,7 @@ export class ImageLabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
(imageInfo.doc[DocData].data_labels as List<string>).push(label);
});
}
- }); // Add the labels as fields to each image.
-
- // (await Promise.all(imageInfos)).forEach(imageInfo => {
- // if (imageInfo && imageInfo.embeddings && Array.isArray(imageInfo.embeddings)) {
- // imageInfo.doc[DocData].data_labels = new List<string>();
-
- // const labels = imageInfo.labels.split('\n');
- // labels.forEach(label => {
- // label = label.replace(/^\d+\.\s*|-|\*/, '').trim();
- // imageInfo.doc[DocData][`${label}`] = true;
- // (imageInfo.doc[DocData].data_labels as List<string>).push(label);
- // });
-
- // numberRange(5).forEach(n => {
- // imageInfo.doc[`data_labels_embedding_${n + 1}`] = new List<number>(imageInfo.embeddings[n]);
- // });
- // }
- // }); // Add the labels as fields to each image.
+ });
this.endLoading();
};
@@ -220,12 +192,15 @@ export class ImageLabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
* Groups images to most similar labels.
*/
groupImagesInBox = action(async () => {
- this._selectedImages.forEach(doc => {
- (doc[DocData].data_labels as List<string>).forEach(async (label, index) => {
+ this.startLoading();
+
+ for (const doc of this._selectedImages) {
+ for (let index = 0; index < (doc[DocData].data_labels as List<string>).length; index++) {
+ const label = (doc[DocData].data_labels as List<string>)[index];
const embedding = await gptGetEmbedding(label);
doc[`data_labels_embedding_${index + 1}`] = new List<number>(embedding);
- });
- });
+ }
+ }
const labelToEmbedding = new Map<string, number[]>();
// Create embeddings for the labels.
@@ -234,8 +209,8 @@ export class ImageLabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
// For each image, loop through the labels, and calculate similarity. Associate it with the
// most similar one.
this._selectedImages.forEach(doc => {
- const embedLists = numberRange(5).map(n => Array.from(NumListCast(doc[`data_labels_embedding_${n + 1}`])));
- const bestEmbedScore = (embedding: Opt<number[]>) => Math.max(...embedLists.map((l, index) => (embedding && (1 - index * 0.1) * similarity(Array.from(embedding), l)!) || 0));
+ const embedLists = numberRange((doc[DocData].data_labels as List<string>).length).map(n => Array.from(NumListCast(doc[`data_labels_embedding_${n + 1}`])));
+ const bestEmbedScore = (embedding: Opt<number[]>) => Math.max(...embedLists.map((l, index) => (embedding && similarity(Array.from(embedding), l)!) || 0));
const {label: mostSimilarLabelCollect} =
this._labelGroups.map(label => ({ label, similarityScore: bestEmbedScore(labelToEmbedding.get(label)) }))
.reduce((prev, cur) => cur.similarityScore < 0.3 || cur.similarityScore <= prev.similarityScore ? prev: cur,
@@ -243,9 +218,13 @@ export class ImageLabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
doc[DocData].data_label = mostSimilarLabelCollect; // The label most similar to the image's contents.
});
+ this.endLoading();
+
if (this._selectedImages) {
MarqueeOptionsMenu.Instance.groupImages();
}
+
+ MainView.Instance.closeFlyout();
});
render() {
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
index f03a9d62d..197681f62 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
@@ -455,8 +455,32 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
*/
@undoBatch
groupImages = action(async () => {
- this._props.Document._type_collection = CollectionViewType.Time; // Change the collection view to a Time view.
- this._props.Document.pivotField = 'data_label'; // Sets the pivot to be the 'data_label'.
+ const labelGroups: string[] = ImageLabelBoxData.Instance._labelGroups;
+ const labelToCollection: Map<string, Doc> = new Map();
+ const selectedImages = ImageLabelBoxData.Instance._docs;
+
+ // Create new collections associated with each label and get the embeddings for the labels.
+ let x_offset = 0;
+ for (const label of labelGroups) {
+ const newCollection = this.getCollection([], undefined, false);
+ newCollection._freeform_panX = this.Bounds.left + this.Bounds.width / 2;
+ newCollection._freeform_panY = this.Bounds.top + this.Bounds.height / 2;
+ console.log(newCollection._x);
+ labelToCollection.set(label, newCollection);
+ this._props.addDocument?.(newCollection);
+ //newCollection._x = (newCollection._x as number) + x_offset;
+ //x_offset += newCollection._width as number;
+ }
+
+ for (const doc of selectedImages) {
+ if (doc[DocData].data_label) {
+ Doc.AddDocToList(labelToCollection.get(doc[DocData].data_label as string)!, undefined, doc);
+ this._props.removeDocument?.(doc);
+ }
+ }
+
+ //this._props.Document._type_collection = CollectionViewType.Time; // Change the collection view to a Time view.
+ //this._props.Document.pivotField = 'data_label'; // Sets the pivot to be the 'data_label'.
});
@undoBatch