mirror of https://github.com/doccano/doccano.git
pythondatasetsactive-learningtext-annotationdatasetnatural-language-processingdata-labelingmachine-learningannotation-tool
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
5.8 KiB
223 lines
5.8 KiB
<template>
|
|
<v-main>
|
|
<v-container fluid>
|
|
<v-row justify="center">
|
|
<v-col cols="12" md="9">
|
|
<v-card>
|
|
<v-card-title>
|
|
<v-chip-group v-model="selectedLabelIndex" column>
|
|
<v-chip
|
|
v-for="item in labels"
|
|
:key="item.id"
|
|
:color="item.backgroundColor"
|
|
filter
|
|
:text-color="$contrastColor(item.backgroundColor)"
|
|
>
|
|
{{ item.text }}
|
|
<v-avatar
|
|
v-if="item.suffixKey"
|
|
right
|
|
color="white"
|
|
class="black--text font-weight-bold"
|
|
>
|
|
{{ item.suffixKey }}
|
|
</v-avatar>
|
|
</v-chip>
|
|
</v-chip-group>
|
|
</v-card-title>
|
|
<v-divider />
|
|
<v-bounding-box
|
|
:rectangles="filteredRectangles"
|
|
:highlight-id="highlightId"
|
|
:image-url="imageUrl"
|
|
:labels="bboxLabels"
|
|
:selected-label="selectedLabel"
|
|
:scale="scale"
|
|
@add-rectangle="addRectangle"
|
|
@update-rectangle="updateRectangle"
|
|
@delete-rectangle="deleteRectangle"
|
|
@update-scale="updateScale"
|
|
@select-rectangle="selectRectangle"
|
|
/>
|
|
</v-card>
|
|
</v-col>
|
|
<v-col cols="12" md="3">
|
|
<list-metadata :metadata="meta" />
|
|
<region-list
|
|
class="mt-4"
|
|
:regions="regionList"
|
|
@change-visibility="changeVisibility"
|
|
@delete-region="deleteRectangle"
|
|
@hover-region="hoverRegion"
|
|
@unhover-region="unhoverRegion"
|
|
/>
|
|
</v-col>
|
|
</v-row>
|
|
</v-container>
|
|
</v-main>
|
|
</template>
|
|
|
|
<script>
|
|
import VBoundingBox from '@/components/tasks/boundingBox/VBoundingBox.vue'
|
|
import ListMetadata from '@/components/tasks/metadata/ListMetadata'
|
|
import RegionList from '@/components/tasks/image/RegionList.vue'
|
|
|
|
export default {
|
|
components: {
|
|
ListMetadata,
|
|
VBoundingBox,
|
|
RegionList
|
|
},
|
|
|
|
layout: 'demo',
|
|
|
|
data() {
|
|
return {
|
|
imageUrl: require('~/assets/images/demo/cat.jpeg'),
|
|
rectangles: [
|
|
{
|
|
id: 'uuid',
|
|
label: 1,
|
|
x: 10,
|
|
y: 10,
|
|
width: 100,
|
|
height: 100
|
|
}
|
|
],
|
|
labels: [
|
|
{
|
|
id: 1,
|
|
text: 'Cat',
|
|
prefixKey: null,
|
|
suffixKey: 'c',
|
|
backgroundColor: '#7c20e0',
|
|
textColor: '#ffffff'
|
|
},
|
|
{
|
|
id: 2,
|
|
text: 'Dog',
|
|
prefixKey: null,
|
|
suffixKey: 'd',
|
|
backgroundColor: '#fbb028',
|
|
textColor: '#000000'
|
|
}
|
|
],
|
|
meta: { wikiPageId: 2 },
|
|
selectedLabelIndex: undefined,
|
|
selectedRectangle: undefined,
|
|
scale: 1,
|
|
visibilities: {},
|
|
highlightId: null
|
|
}
|
|
},
|
|
|
|
computed: {
|
|
bboxLabels() {
|
|
return this.labels.map((label) => {
|
|
return {
|
|
id: label.id,
|
|
name: label.text,
|
|
color: label.backgroundColor
|
|
}
|
|
})
|
|
},
|
|
|
|
selectedLabel() {
|
|
if (this.selectedLabelIndex !== undefined) {
|
|
return this.labels[this.selectedLabelIndex]
|
|
} else {
|
|
return undefined
|
|
}
|
|
},
|
|
|
|
regionList() {
|
|
return this.rectangles.map((rectangle) => {
|
|
return {
|
|
id: rectangle.id,
|
|
category: this.labels.find((label) => rectangle.label === label.id).text,
|
|
color: this.labels.find((label) => rectangle.label === label.id).backgroundColor,
|
|
visibility: rectangle.id in this.visibilities ? this.visibilities[rectangle.id] : true
|
|
}
|
|
})
|
|
},
|
|
|
|
filteredRectangles() {
|
|
return this.rectangles.filter((rectangle) => this.visibilities[rectangle.id] !== false)
|
|
}
|
|
},
|
|
|
|
watch: {
|
|
selectedLabel(newLabel) {
|
|
if (newLabel !== undefined && !!this.selectedRectangle) {
|
|
const rect = this.rectangles.find((r) => r.id === this.selectedRectangle.id)
|
|
rect.label = newLabel.id
|
|
this.updateRectangle(rect)
|
|
}
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
addRectangle(rectangle) {
|
|
console.log('addRectangle', rectangle)
|
|
this.rectangles.push(rectangle)
|
|
this.visibilities[rectangle.id] = true
|
|
this.selectedLabelIndex = undefined
|
|
},
|
|
|
|
updateRectangle(rectangle) {
|
|
console.log('updateRectangle', rectangle)
|
|
const index = this.rectangles.findIndex((r) => r.id === rectangle.id)
|
|
if (index !== -1) {
|
|
this.$set(this.rectangles, index, rectangle)
|
|
}
|
|
},
|
|
|
|
deleteRectangle(rectangleId) {
|
|
console.log('deleteRectangle', rectangleId)
|
|
this.rectangles = this.rectangles.filter((r) => r.id !== rectangleId)
|
|
delete this.visibilities[rectangleId]
|
|
},
|
|
|
|
changeVisibility(regionId, visibility) {
|
|
console.log('changeVisibility', regionId, visibility)
|
|
this.$set(this.visibilities, regionId, visibility)
|
|
this.visibilities = Object.assign({}, this.visibilities)
|
|
},
|
|
|
|
hoverRegion(regionId) {
|
|
console.log('hoverRegion', regionId)
|
|
this.highlightId = regionId
|
|
},
|
|
|
|
unhoverRegion(regionId) {
|
|
console.log('unhoverRegion', regionId)
|
|
this.highlightId = null
|
|
},
|
|
|
|
selectRectangle(rectangleId) {
|
|
console.log('selectRectangle', rectangleId)
|
|
if (rectangleId) {
|
|
this.selectedRectangle = this.rectangles.find((r) => r.id === rectangleId)
|
|
this.selectedLabelIndex = this.labels.findIndex(
|
|
(l) => l.id === this.selectedRectangle.label
|
|
)
|
|
} else {
|
|
this.selectedRectangle = undefined
|
|
this.selectedLabelIndex = undefined
|
|
}
|
|
},
|
|
|
|
zoomOut() {
|
|
this.scale -= 0.1
|
|
},
|
|
|
|
zoomIn() {
|
|
this.scale += 0.1
|
|
},
|
|
|
|
updateScale(scale) {
|
|
this.scale = scale
|
|
}
|
|
}
|
|
}
|
|
</script>
|