✨ complete model integration
This commit is contained in:
3
.dockerignore
Normal file
3
.dockerignore
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
*.log
|
17
build.Dockerfile
Normal file
17
build.Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
FROM node:22.12.0 as build
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY package*.json ./
|
||||||
|
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
FROM nginx:alpine
|
||||||
|
|
||||||
|
COPY --from=build /app/dist /usr/share/nginx/html
|
||||||
|
|
||||||
|
EXPOSE 80
|
17
components.d.ts
vendored
17
components.d.ts
vendored
@@ -58,7 +58,6 @@ declare module 'vue' {
|
|||||||
BackgroundAnimation: typeof import('./src/components/BackgroundAnimation/BackgroundAnimation.vue')['default']
|
BackgroundAnimation: typeof import('./src/components/BackgroundAnimation/BackgroundAnimation.vue')['default']
|
||||||
BackTop: typeof import('./src/components/MyUI/BackTop/BackTop.vue')['default']
|
BackTop: typeof import('./src/components/MyUI/BackTop/BackTop.vue')['default']
|
||||||
Badge: typeof import('./src/components/MyUI/Badge/Badge.vue')['default']
|
Badge: typeof import('./src/components/MyUI/Badge/Badge.vue')['default']
|
||||||
BarsOutlined: typeof import('@ant-design/icons-vue')['BarsOutlined']
|
|
||||||
BoxDog: typeof import('./src/components/BoxDog/BoxDog.vue')['default']
|
BoxDog: typeof import('./src/components/BoxDog/BoxDog.vue')['default']
|
||||||
Breadcrumb: typeof import('./src/components/MyUI/Breadcrumb/Breadcrumb.vue')['default']
|
Breadcrumb: typeof import('./src/components/MyUI/Breadcrumb/Breadcrumb.vue')['default']
|
||||||
Button: typeof import('./src/components/MyUI/Button/Button.vue')['default']
|
Button: typeof import('./src/components/MyUI/Button/Button.vue')['default']
|
||||||
@@ -68,7 +67,6 @@ declare module 'vue' {
|
|||||||
Cascader: typeof import('./src/components/MyUI/Cascader/Cascader.vue')['default']
|
Cascader: typeof import('./src/components/MyUI/Cascader/Cascader.vue')['default']
|
||||||
Checkbox: typeof import('./src/components/MyUI/Checkbox/Checkbox.vue')['default']
|
Checkbox: typeof import('./src/components/MyUI/Checkbox/Checkbox.vue')['default']
|
||||||
CheckCard: typeof import('./src/components/MyUI/CheckCard/CheckCard.vue')['default']
|
CheckCard: typeof import('./src/components/MyUI/CheckCard/CheckCard.vue')['default']
|
||||||
CheckOutlined: typeof import('@ant-design/icons-vue')['CheckOutlined']
|
|
||||||
CloseCircleOutlined: typeof import('@ant-design/icons-vue')['CloseCircleOutlined']
|
CloseCircleOutlined: typeof import('@ant-design/icons-vue')['CloseCircleOutlined']
|
||||||
CloseOutlined: typeof import('@ant-design/icons-vue')['CloseOutlined']
|
CloseOutlined: typeof import('@ant-design/icons-vue')['CloseOutlined']
|
||||||
Clouds: typeof import('./src/components/Clouds/Clouds.vue')['default']
|
Clouds: typeof import('./src/components/Clouds/Clouds.vue')['default']
|
||||||
@@ -82,7 +80,6 @@ declare module 'vue' {
|
|||||||
DatePicker: typeof import('./src/components/MyUI/DatePicker/DatePicker.vue')['default']
|
DatePicker: typeof import('./src/components/MyUI/DatePicker/DatePicker.vue')['default']
|
||||||
DeleteOutlined: typeof import('@ant-design/icons-vue')['DeleteOutlined']
|
DeleteOutlined: typeof import('@ant-design/icons-vue')['DeleteOutlined']
|
||||||
Descriptions: typeof import('./src/components/MyUI/Descriptions/Descriptions.vue')['default']
|
Descriptions: typeof import('./src/components/MyUI/Descriptions/Descriptions.vue')['default']
|
||||||
Detail: typeof import('./src/views/Album/LocationAlbum/Detail.vue')['default']
|
|
||||||
Dialog: typeof import('./src/components/MyUI/Dialog/Dialog.vue')['default']
|
Dialog: typeof import('./src/components/MyUI/Dialog/Dialog.vue')['default']
|
||||||
Divider: typeof import('./src/components/MyUI/Divider/Divider.vue')['default']
|
Divider: typeof import('./src/components/MyUI/Divider/Divider.vue')['default']
|
||||||
DownloadOutlined: typeof import('@ant-design/icons-vue')['DownloadOutlined']
|
DownloadOutlined: typeof import('@ant-design/icons-vue')['DownloadOutlined']
|
||||||
@@ -100,17 +97,17 @@ declare module 'vue' {
|
|||||||
GradientText: typeof import('./src/components/MyUI/GradientText/GradientText.vue')['default']
|
GradientText: typeof import('./src/components/MyUI/GradientText/GradientText.vue')['default']
|
||||||
Image: typeof import('./src/components/MyUI/Image/Image.vue')['default']
|
Image: typeof import('./src/components/MyUI/Image/Image.vue')['default']
|
||||||
ImageShare: typeof import('./src/views/ImageShare/ImageShare.vue')['default']
|
ImageShare: typeof import('./src/views/ImageShare/ImageShare.vue')['default']
|
||||||
|
ImageUpload: typeof import('./src/views/Photograph/ImageUpload/ImageUpload.vue')['default']
|
||||||
ImageWaterfall: typeof import('./src/components/MyUI/Waterfall/ImageWaterfall.vue')['default']
|
ImageWaterfall: typeof import('./src/components/MyUI/Waterfall/ImageWaterfall.vue')['default']
|
||||||
InboxOutlined: typeof import('@ant-design/icons-vue')['InboxOutlined']
|
|
||||||
Index: typeof import('./src/views/Album/LocationAlbum/Index.vue')['default']
|
|
||||||
Input: typeof import('./src/components/MyUI/Input/Input.vue')['default']
|
Input: typeof import('./src/components/MyUI/Input/Input.vue')['default']
|
||||||
InputSearch: typeof import('./src/components/MyUI/InputSearch/InputSearch.vue')['default']
|
InputSearch: typeof import('./src/components/MyUI/InputSearch/InputSearch.vue')['default']
|
||||||
LandingPage: typeof import('./src/views/Landing/LandingPage.vue')['default']
|
LandingPage: typeof import('./src/views/Landing/LandingPage.vue')['default']
|
||||||
LazyImage: typeof import('./src/components/MyUI/LazyImage/LazyImage.vue')['default']
|
|
||||||
List: typeof import('./src/components/MyUI/List/List.vue')['default']
|
List: typeof import('./src/components/MyUI/List/List.vue')['default']
|
||||||
LoadingBar: typeof import('./src/components/MyUI/LoadingBar/LoadingBar.vue')['default']
|
LoadingBar: typeof import('./src/components/MyUI/LoadingBar/LoadingBar.vue')['default']
|
||||||
LoadingGraphic: typeof import('./src/components/LoadingGraphic/LoadingGraphic.vue')['default']
|
LoadingGraphic: typeof import('./src/components/LoadingGraphic/LoadingGraphic.vue')['default']
|
||||||
LocationAlbum: typeof import('./src/views/Album/LocationAlbum/LocationAlbum.vue')['default']
|
LocationAlbum: typeof import('./src/views/Album/LocationAlbum/LocationAlbum.vue')['default']
|
||||||
|
LocationAlbumDetail: typeof import('./src/views/Album/LocationAlbum/LocationAlbumDetail.vue')['default']
|
||||||
|
LocationAlbumList: typeof import('./src/views/Album/LocationAlbum/LocationAlbumList.vue')['default']
|
||||||
LockOutlined: typeof import('@ant-design/icons-vue')['LockOutlined']
|
LockOutlined: typeof import('@ant-design/icons-vue')['LockOutlined']
|
||||||
LoginFooter: typeof import('./src/views/Login/LoginFooter.vue')['default']
|
LoginFooter: typeof import('./src/views/Login/LoginFooter.vue')['default']
|
||||||
LoginPage: typeof import('./src/views/Login/LoginPage.vue')['default']
|
LoginPage: typeof import('./src/views/Login/LoginPage.vue')['default']
|
||||||
@@ -125,10 +122,13 @@ declare module 'vue' {
|
|||||||
Pagination: typeof import('./src/components/MyUI/Pagination/Pagination.vue')['default']
|
Pagination: typeof import('./src/components/MyUI/Pagination/Pagination.vue')['default']
|
||||||
ParameterSetting: typeof import('./src/views/Upscale/ParameterSetting.vue')['default']
|
ParameterSetting: typeof import('./src/views/Upscale/ParameterSetting.vue')['default']
|
||||||
PeopleAlbum: typeof import('./src/views/Album/PeopleAlbum/PeopleAlbum.vue')['default']
|
PeopleAlbum: typeof import('./src/views/Album/PeopleAlbum/PeopleAlbum.vue')['default']
|
||||||
|
PeopleAlbumDetail: typeof import('./src/views/Album/PeopleAlbum/PeopleAlbumDetail.vue')['default']
|
||||||
|
PeopleAlbumList: typeof import('./src/views/Album/PeopleAlbum/PeopleAlbumList.vue')['default']
|
||||||
Phoalbum: typeof import('./src/views/Album/Phoalbum/Phoalbum.vue')['default']
|
Phoalbum: typeof import('./src/views/Album/Phoalbum/Phoalbum.vue')['default']
|
||||||
|
PhoalbumDetail: typeof import('./src/views/Album/Phoalbum/PhoalbumDetail.vue')['default']
|
||||||
|
PhoalbumList: typeof import('./src/views/Album/Phoalbum/PhoalbumList.vue')['default']
|
||||||
PhoneUpload: typeof import('./src/views/PhoneUpload/PhoneUpload.vue')['default']
|
PhoneUpload: typeof import('./src/views/PhoneUpload/PhoneUpload.vue')['default']
|
||||||
PhotoStack: typeof import('./src/components/MyUI/PhotoStack/PhotoStack.vue')['default']
|
PhotoStack: typeof import('./src/components/MyUI/PhotoStack/PhotoStack.vue')['default']
|
||||||
PictureStack: typeof import('./src/views/Album/Phoalbum/PictureStack.vue')['default']
|
|
||||||
PlusOutlined: typeof import('@ant-design/icons-vue')['PlusOutlined']
|
PlusOutlined: typeof import('@ant-design/icons-vue')['PlusOutlined']
|
||||||
PlusSquareOutlined: typeof import('@ant-design/icons-vue')['PlusSquareOutlined']
|
PlusSquareOutlined: typeof import('@ant-design/icons-vue')['PlusSquareOutlined']
|
||||||
Popconfirm: typeof import('./src/components/MyUI/Popconfirm/Popconfirm.vue')['default']
|
Popconfirm: typeof import('./src/components/MyUI/Popconfirm/Popconfirm.vue')['default']
|
||||||
@@ -171,6 +171,8 @@ declare module 'vue' {
|
|||||||
Textarea: typeof import('./src/components/MyUI/Textarea/Textarea.vue')['default']
|
Textarea: typeof import('./src/components/MyUI/Textarea/Textarea.vue')['default']
|
||||||
TextScroll: typeof import('./src/components/MyUI/TextScroll/TextScroll.vue')['default']
|
TextScroll: typeof import('./src/components/MyUI/TextScroll/TextScroll.vue')['default']
|
||||||
ThingAlbum: typeof import('./src/views/Album/ThingAlbum/ThingAlbum.vue')['default']
|
ThingAlbum: typeof import('./src/views/Album/ThingAlbum/ThingAlbum.vue')['default']
|
||||||
|
ThingAlbumDetail: typeof import('./src/views/Album/ThingAlbum/ThingAlbumDetail.vue')['default']
|
||||||
|
ThingAlbumList: typeof import('./src/views/Album/ThingAlbum/ThingAlbumList.vue')['default']
|
||||||
Timeline: typeof import('./src/components/MyUI/Timeline/Timeline.vue')['default']
|
Timeline: typeof import('./src/components/MyUI/Timeline/Timeline.vue')['default']
|
||||||
Tooltip: typeof import('./src/components/MyUI/Tooltip/Tooltip.vue')['default']
|
Tooltip: typeof import('./src/components/MyUI/Tooltip/Tooltip.vue')['default']
|
||||||
TreeChart: typeof import('./src/components/MyUI/TreeChart/TreeChart.vue')['default']
|
TreeChart: typeof import('./src/components/MyUI/TreeChart/TreeChart.vue')['default']
|
||||||
@@ -182,6 +184,5 @@ declare module 'vue' {
|
|||||||
Video: typeof import('./src/components/MyUI/Video/Video.vue')['default']
|
Video: typeof import('./src/components/MyUI/Video/Video.vue')['default']
|
||||||
VueCompareImage: typeof import('./src/components/VueCompareImage/VueCompareImage.vue')['default']
|
VueCompareImage: typeof import('./src/components/VueCompareImage/VueCompareImage.vue')['default']
|
||||||
WarningOutlined: typeof import('@ant-design/icons-vue')['WarningOutlined']
|
WarningOutlined: typeof import('@ant-design/icons-vue')['WarningOutlined']
|
||||||
Waterfall: typeof import('./src/components/MyUI/Waterfall/ImageWaterfall.vue')['default']
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
40
package.json
40
package.json
@@ -13,36 +13,44 @@
|
|||||||
"@alova/adapter-axios": "^2.0.12",
|
"@alova/adapter-axios": "^2.0.12",
|
||||||
"@ant-design/icons-vue": "^7.0.1",
|
"@ant-design/icons-vue": "^7.0.1",
|
||||||
"@intlify/eslint-plugin-vue-i18n": "^3.2.0",
|
"@intlify/eslint-plugin-vue-i18n": "^3.2.0",
|
||||||
|
"@mediapipe/face_detection": "^0.4.1646425229",
|
||||||
"@tensorflow-models/coco-ssd": "^2.2.3",
|
"@tensorflow-models/coco-ssd": "^2.2.3",
|
||||||
|
"@tensorflow-models/face-detection": "^1.0.3",
|
||||||
|
"@tensorflow-models/face-landmarks-detection": "^1.0.6",
|
||||||
"@tensorflow-models/knn-classifier": "^1.2.6",
|
"@tensorflow-models/knn-classifier": "^1.2.6",
|
||||||
"@tensorflow-models/mobilenet": "^2.1.1",
|
"@tensorflow-models/mobilenet": "^2.1.1",
|
||||||
"@tensorflow/tfjs": "^4.22.0",
|
"@tensorflow/tfjs": "^4.22.0",
|
||||||
|
"@tensorflow/tfjs-backend-cpu": "^4.22.0",
|
||||||
|
"@tensorflow/tfjs-backend-wasm": "^4.22.0",
|
||||||
"@tensorflow/tfjs-backend-webgl": "^4.22.0",
|
"@tensorflow/tfjs-backend-webgl": "^4.22.0",
|
||||||
"@tensorflow/tfjs-backend-webgpu": "^4.22.0",
|
"@tensorflow/tfjs-backend-webgpu": "^4.22.0",
|
||||||
|
"@tensorflow/tfjs-converter": "^4.22.0",
|
||||||
"@tensorflow/tfjs-core": "^4.22.0",
|
"@tensorflow/tfjs-core": "^4.22.0",
|
||||||
|
"@tensorflow/tfjs-node": "^4.22.0",
|
||||||
|
"@tensorflow/tfjs-node-gpu": "^4.22.0",
|
||||||
"@types/animejs": "^3.1.12",
|
"@types/animejs": "^3.1.12",
|
||||||
"@types/crypto-js": "^4.2.2",
|
"@types/crypto-js": "^4.2.2",
|
||||||
"@types/json-stringify-safe": "^5.0.3",
|
"@types/json-stringify-safe": "^5.0.3",
|
||||||
"@types/node": "^22.10.5",
|
"@types/node": "^22.10.5",
|
||||||
"@types/nprogress": "^0.2.3",
|
"@types/nprogress": "^0.2.3",
|
||||||
"@vuepic/vue-datepicker": "^10.0.0",
|
"@vladmandic/face-api": "^1.7.14",
|
||||||
"@vueuse/core": "^12.3.0",
|
"@vuepic/vue-datepicker": "^11.0.1",
|
||||||
"@vueuse/integrations": "^12.3.0",
|
"@vueuse/core": "^12.4.0",
|
||||||
|
"@vueuse/integrations": "^12.4.0",
|
||||||
"alova": "^3.2.7",
|
"alova": "^3.2.7",
|
||||||
"animejs": "^3.2.2",
|
"animejs": "^3.2.2",
|
||||||
"ant-design-vue": "^4.2.6",
|
"ant-design-vue": "^4.2.6",
|
||||||
"autofit.js": "^3.2.2",
|
|
||||||
"axios": "^1.7.9",
|
"axios": "^1.7.9",
|
||||||
"browser-image-compression": "^2.0.2",
|
"browser-image-compression": "^2.0.2",
|
||||||
"buffer": "^6.0.3",
|
"buffer": "^6.0.3",
|
||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
"echarts": "^5.6.0",
|
"echarts": "^5.6.0",
|
||||||
"eslint": "9.17.0",
|
"eslint": "9.18.0",
|
||||||
"go-captcha-vue": "^2.0.5",
|
"go-captcha-vue": "^2.0.5",
|
||||||
"gsap": "^3.12.5",
|
"gsap": "^3.12.5",
|
||||||
"jsencrypt": "^3.3.2",
|
"jsencrypt": "^3.3.2",
|
||||||
"json-stringify-safe": "^5.0.1",
|
"json-stringify-safe": "^5.0.1",
|
||||||
"less": "^4.2.0",
|
"less": "^4.2.1",
|
||||||
"localforage": "^1.10.0",
|
"localforage": "^1.10.0",
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
"nsfwjs": "^4.2.1",
|
"nsfwjs": "^4.2.1",
|
||||||
@@ -50,8 +58,8 @@
|
|||||||
"pinia-plugin-persistedstate-2": "^2.0.28",
|
"pinia-plugin-persistedstate-2": "^2.0.28",
|
||||||
"qrcode": "^1",
|
"qrcode": "^1",
|
||||||
"seedrandom": "^3.0.5",
|
"seedrandom": "^3.0.5",
|
||||||
"swiper": "^11.2.0",
|
"swiper": "^11.2.1",
|
||||||
"unplugin-auto-import": "^0.19.0",
|
"unplugin-auto-import": "^19.0.0",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-html": "^3.2.2",
|
"vite-plugin-html": "^3.2.2",
|
||||||
"vite-plugin-node-polyfills": "^0.22.0",
|
"vite-plugin-node-polyfills": "^0.22.0",
|
||||||
@@ -63,17 +71,25 @@
|
|||||||
"ws": "^8.18.0"
|
"ws": "^8.18.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.17.0",
|
"@eslint/js": "^9.18.0",
|
||||||
"@vitejs/plugin-vue": "^5.2.1",
|
"@vitejs/plugin-vue": "^5.2.1",
|
||||||
"eslint-plugin-vue": "^9.32.0",
|
"eslint-plugin-vue": "^9.32.0",
|
||||||
"globals": "^15.14.0",
|
"globals": "^15.14.0",
|
||||||
"sass": "^1.83.1",
|
"sass": "^1.83.1",
|
||||||
"typescript": "^5.7.2",
|
"typescript": "^5.7.3",
|
||||||
"typescript-eslint": "^8.19.0",
|
"typescript-eslint": "^8.19.1",
|
||||||
"unplugin-vue-components": "^0.28.0",
|
"unplugin-vue-components": "^28.0.0",
|
||||||
"vite": "^6.0.7",
|
"vite": "^6.0.7",
|
||||||
"vite-plugin-bundle-obfuscator": "1.4.0",
|
"vite-plugin-bundle-obfuscator": "1.4.0",
|
||||||
"vite-plugin-chunk-split": "^0.5.0",
|
"vite-plugin-chunk-split": "^0.5.0",
|
||||||
"vue-tsc": "2.2.0"
|
"vue-tsc": "2.2.0"
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"vite-plugin-node-polyfills": {
|
||||||
|
"vite": "^6.0.7"
|
||||||
|
},
|
||||||
|
"vite-plugin-chunk-split": {
|
||||||
|
"vite": "^6.0.7"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1
public/tfjs/anime_classifier2/metadata.json
Normal file
1
public/tfjs/anime_classifier2/metadata.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"tfjsVersion":"1.3.1","tmVersion":"2.4.7","packageVersion":"0.8.4-alpha2","packageName":"@teachablemachine/image","timeStamp":"2023-10-15T20:09:31.979Z","userMetadata":{},"modelName":"tm-my-image-model","labels":["Anime","Furry","Neutral"],"imageSize":224}
|
1
public/tfjs/anime_classifier2/model.json
Normal file
1
public/tfjs/anime_classifier2/model.json
Normal file
File diff suppressed because one or more lines are too long
BIN
public/tfjs/anime_classifier2/weights.bin
Normal file
BIN
public/tfjs/anime_classifier2/weights.bin
Normal file
Binary file not shown.
@@ -0,0 +1,62 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"weights":
|
||||||
|
[
|
||||||
|
{"name":"entry_flow/conv_in/filters","shape":[3,3,3,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005431825039433498,"min":-0.7441600304023892}},
|
||||||
|
{"name":"entry_flow/conv_in/bias","shape":[32],"dtype":"float32"},
|
||||||
|
{"name":"entry_flow/reduction_block_0/separable_conv0/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005691980614381678,"min":-0.6090419257388395}},
|
||||||
|
{"name":"entry_flow/reduction_block_0/separable_conv0/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009089225881239947,"min":-1.1179747833925135}},
|
||||||
|
{"name":"entry_flow/reduction_block_0/separable_conv0/bias","shape":[64],"dtype":"float32"},
|
||||||
|
{"name":"entry_flow/reduction_block_0/separable_conv1/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00683894624897078,"min":-0.8138346036275228}},
|
||||||
|
{"name":"entry_flow/reduction_block_0/separable_conv1/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011632566358528886,"min":-1.3028474321552352}},
|
||||||
|
{"name":"entry_flow/reduction_block_0/separable_conv1/bias","shape":[64],"dtype":"float32"},
|
||||||
|
{"name":"entry_flow/reduction_block_0/expansion_conv/filters","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010254812240600587,"min":-0.9229331016540528}},
|
||||||
|
{"name":"entry_flow/reduction_block_0/expansion_conv/bias","shape":[64],"dtype":"float32"},
|
||||||
|
{"name":"entry_flow/reduction_block_1/separable_conv0/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0052509616403018725,"min":-0.6406173201168285}},
|
||||||
|
{"name":"entry_flow/reduction_block_1/separable_conv0/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010788509424994973,"min":-1.4564487723743214}},
|
||||||
|
{"name":"entry_flow/reduction_block_1/separable_conv0/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"entry_flow/reduction_block_1/separable_conv1/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00553213918910307,"min":-0.7025816770160899}},
|
||||||
|
{"name":"entry_flow/reduction_block_1/separable_conv1/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013602388606351965,"min":-1.6186842441558837}},
|
||||||
|
{"name":"entry_flow/reduction_block_1/separable_conv1/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"entry_flow/reduction_block_1/expansion_conv/filters","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.007571851038465313,"min":-1.158493208885193}},
|
||||||
|
{"name":"entry_flow/reduction_block_1/expansion_conv/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"middle_flow/main_block_0/separable_conv0/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005766328409606335,"min":-0.6688940955143349}},
|
||||||
|
{"name":"middle_flow/main_block_0/separable_conv0/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.012136116214826995,"min":-1.5776951079275094}},
|
||||||
|
{"name":"middle_flow/main_block_0/separable_conv0/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"middle_flow/main_block_0/separable_conv1/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004314773222979377,"min":-0.5652352922102984}},
|
||||||
|
{"name":"middle_flow/main_block_0/separable_conv1/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01107162026798024,"min":-1.2400214700137868}},
|
||||||
|
{"name":"middle_flow/main_block_0/separable_conv1/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"middle_flow/main_block_0/separable_conv2/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0036451735917259667,"min":-0.4848080876995536}},
|
||||||
|
{"name":"middle_flow/main_block_0/separable_conv2/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008791744942758598,"min":-1.134135097615859}},
|
||||||
|
{"name":"middle_flow/main_block_0/separable_conv2/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"middle_flow/main_block_1/separable_conv0/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004915751896652521,"min":-0.6095532351849126}},
|
||||||
|
{"name":"middle_flow/main_block_1/separable_conv0/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010868691463096469,"min":-1.3368490499608656}},
|
||||||
|
{"name":"middle_flow/main_block_1/separable_conv0/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"middle_flow/main_block_1/separable_conv1/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005010117269029804,"min":-0.6012140722835765}},
|
||||||
|
{"name":"middle_flow/main_block_1/separable_conv1/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010311148213405235,"min":-1.3816938605963016}},
|
||||||
|
{"name":"middle_flow/main_block_1/separable_conv1/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"middle_flow/main_block_1/separable_conv2/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004911523706772748,"min":-0.7367285560159123}},
|
||||||
|
{"name":"middle_flow/main_block_1/separable_conv2/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008976466047997568,"min":-1.2207993825276693}},
|
||||||
|
{"name":"middle_flow/main_block_1/separable_conv2/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"exit_flow/reduction_block/separable_conv0/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005074804436926748,"min":-0.7104726211697447}},
|
||||||
|
{"name":"exit_flow/reduction_block/separable_conv0/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011453078307357489,"min":-1.4545409450344011}},
|
||||||
|
{"name":"exit_flow/reduction_block/separable_conv0/bias","shape":[256],"dtype":"float32"},
|
||||||
|
{"name":"exit_flow/reduction_block/separable_conv1/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.007741751390344957,"min":-1.1380374543807086}},
|
||||||
|
{"name":"exit_flow/reduction_block/separable_conv1/pointwise_filter","shape":[1,1,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011347713189966538,"min":-1.497898141075583}},
|
||||||
|
{"name":"exit_flow/reduction_block/separable_conv1/bias","shape":[256],"dtype":"float32"},
|
||||||
|
{"name":"exit_flow/reduction_block/expansion_conv/filters","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006717281014311547,"min":-0.8329428457746318}},
|
||||||
|
{"name":"exit_flow/reduction_block/expansion_conv/bias","shape":[256],"dtype":"float32"},
|
||||||
|
{"name":"exit_flow/separable_conv/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0027201742518181892,"min":-0.3237007359663645}},
|
||||||
|
{"name":"exit_flow/separable_conv/pointwise_filter","shape":[1,1,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010076364348916447,"min":-1.330080094056971}},
|
||||||
|
{"name":"exit_flow/separable_conv/bias","shape":[512],"dtype":"float32"},
|
||||||
|
{"name":"fc/age/weights","shape":[512,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008674054987290326,"min":-1.2664120281443876}},
|
||||||
|
{"name":"fc/age/bias","shape":[1],"dtype":"float32"},
|
||||||
|
{"name":"fc/gender/weights","shape":[512,2],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0029948226377075793,"min":-0.34140978069866407}},
|
||||||
|
{"name":"fc/gender/bias","shape":[2],"dtype":"float32"}
|
||||||
|
],
|
||||||
|
"paths":
|
||||||
|
[
|
||||||
|
"age_gender_model.bin"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
public/tfjs/face_api/model/age_gender_model.bin
Normal file
BIN
public/tfjs/face_api/model/age_gender_model.bin
Normal file
Binary file not shown.
@@ -0,0 +1,60 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"weights":
|
||||||
|
[
|
||||||
|
{"name":"dense0/conv0/filters","shape":[3,3,3,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0057930146946626555,"min":-0.7125408074435067}},
|
||||||
|
{"name":"dense0/conv0/bias","shape":[32],"dtype":"float32"},
|
||||||
|
{"name":"dense0/conv1/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006473719839956246,"min":-0.6408982641556684}},
|
||||||
|
{"name":"dense0/conv1/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010509579321917366,"min":-1.408283629136927}},
|
||||||
|
{"name":"dense0/conv1/bias","shape":[32],"dtype":"float32"},
|
||||||
|
{"name":"dense0/conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005666389652326995,"min":-0.7252978754978554}},
|
||||||
|
{"name":"dense0/conv2/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010316079270605948,"min":-1.1760330368490781}},
|
||||||
|
{"name":"dense0/conv2/bias","shape":[32],"dtype":"float32"},
|
||||||
|
{"name":"dense0/conv3/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0063220320963392074,"min":-0.853474333005793}},
|
||||||
|
{"name":"dense0/conv3/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010322785377502442,"min":-1.4658355236053466}},
|
||||||
|
{"name":"dense0/conv3/bias","shape":[32],"dtype":"float32"},
|
||||||
|
{"name":"dense1/conv0/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0042531527724920535,"min":-0.5741756242864272}},
|
||||||
|
{"name":"dense1/conv0/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010653339647779278,"min":-1.1825207009035}},
|
||||||
|
{"name":"dense1/conv0/bias","shape":[64],"dtype":"float32"},
|
||||||
|
{"name":"dense1/conv1/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005166931012097527,"min":-0.6355325144879957}},
|
||||||
|
{"name":"dense1/conv1/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011478300188101974,"min":-1.3888743227603388}},
|
||||||
|
{"name":"dense1/conv1/bias","shape":[64],"dtype":"float32"},
|
||||||
|
{"name":"dense1/conv2/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006144821410085641,"min":-0.8479853545918185}},
|
||||||
|
{"name":"dense1/conv2/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010541967317169788,"min":-1.3809977185492421}},
|
||||||
|
{"name":"dense1/conv2/bias","shape":[64],"dtype":"float32"},
|
||||||
|
{"name":"dense1/conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005769844849904378,"min":-0.686611537138621}},
|
||||||
|
{"name":"dense1/conv3/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010939095534530341,"min":-1.2689350820055196}},
|
||||||
|
{"name":"dense1/conv3/bias","shape":[64],"dtype":"float32"},
|
||||||
|
{"name":"dense2/conv0/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0037769308277204924,"min":-0.40790852939381317}},
|
||||||
|
{"name":"dense2/conv0/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01188667194516051,"min":-1.4382873053644218}},
|
||||||
|
{"name":"dense2/conv0/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"dense2/conv1/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006497045825509464,"min":-0.8381189114907208}},
|
||||||
|
{"name":"dense2/conv1/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011632198913424622,"min":-1.3377028750438316}},
|
||||||
|
{"name":"dense2/conv1/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"dense2/conv2/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005947182225246056,"min":-0.7969224181829715}},
|
||||||
|
{"name":"dense2/conv2/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011436844339557722,"min":-1.4524792311238306}},
|
||||||
|
{"name":"dense2/conv2/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"dense2/conv3/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006665432686899222,"min":-0.8998334127313949}},
|
||||||
|
{"name":"dense2/conv3/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01283421422920975,"min":-1.642779421338848}},
|
||||||
|
{"name":"dense2/conv3/bias","shape":[128],"dtype":"float32"},
|
||||||
|
{"name":"dense3/conv0/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004711699953266218,"min":-0.6737730933170692}},
|
||||||
|
{"name":"dense3/conv0/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010955964817720302,"min":-1.3914075318504784}},
|
||||||
|
{"name":"dense3/conv0/bias","shape":[256],"dtype":"float32"},
|
||||||
|
{"name":"dense3/conv1/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00554193468654857,"min":-0.7149095745647656}},
|
||||||
|
{"name":"dense3/conv1/pointwise_filter","shape":[1,1,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016790372250126858,"min":-2.484975093018775}},
|
||||||
|
{"name":"dense3/conv1/bias","shape":[256],"dtype":"float32"},
|
||||||
|
{"name":"dense3/conv2/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006361540626077091,"min":-0.8142772001378676}},
|
||||||
|
{"name":"dense3/conv2/pointwise_filter","shape":[1,1,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01777329678628959,"min":-1.7062364914838006}},
|
||||||
|
{"name":"dense3/conv2/bias","shape":[256],"dtype":"float32"},
|
||||||
|
{"name":"dense3/conv3/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006900275922289082,"min":-0.8625344902861353}},
|
||||||
|
{"name":"dense3/conv3/pointwise_filter","shape":[1,1,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015449936717164282,"min":-1.9003422162112067}},
|
||||||
|
{"name":"dense3/conv3/bias","shape":[256],"dtype":"float32"},
|
||||||
|
{"name":"fc/weights","shape":[256,7],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004834276554631252,"min":-0.7203072066400565}},
|
||||||
|
{"name":"fc/bias","shape":[7],"dtype":"float32"}
|
||||||
|
],
|
||||||
|
"paths":
|
||||||
|
[
|
||||||
|
"face_expression_model.bin"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
public/tfjs/face_api/model/face_expression_model.bin
Normal file
BIN
public/tfjs/face_api/model/face_expression_model.bin
Normal file
Binary file not shown.
@@ -0,0 +1,60 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"weights":
|
||||||
|
[
|
||||||
|
{"name":"dense0/conv0/filters","shape":[3,3,3,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004853619781194949,"min":-0.5872879935245888}},
|
||||||
|
{"name":"dense0/conv0/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004396426443960153,"min":-0.7298067896973853}},
|
||||||
|
{"name":"dense0/conv1/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00635151559231328,"min":-0.5589333721235686}},
|
||||||
|
{"name":"dense0/conv1/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009354315552057004,"min":-1.2628325995276957}},
|
||||||
|
{"name":"dense0/conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0029380727048013726,"min":-0.5846764682554731}},
|
||||||
|
{"name":"dense0/conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0049374802439820535,"min":-0.6171850304977566}},
|
||||||
|
{"name":"dense0/conv2/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009941946758943446,"min":-1.3421628124573652}},
|
||||||
|
{"name":"dense0/conv2/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0030300481062309416,"min":-0.5272283704841838}},
|
||||||
|
{"name":"dense0/conv3/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005672684837790097,"min":-0.7431217137505026}},
|
||||||
|
{"name":"dense0/conv3/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010712201455060173,"min":-1.5639814124387852}},
|
||||||
|
{"name":"dense0/conv3/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0030966934035806097,"min":-0.3839899820439956}},
|
||||||
|
{"name":"dense1/conv0/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0039155554537679636,"min":-0.48161332081345953}},
|
||||||
|
{"name":"dense1/conv0/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01023082966898002,"min":-1.094698774580862}},
|
||||||
|
{"name":"dense1/conv0/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0027264176630506327,"min":-0.3871513081531898}},
|
||||||
|
{"name":"dense1/conv1/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004583378632863362,"min":-0.5454220573107401}},
|
||||||
|
{"name":"dense1/conv1/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00915846403907327,"min":-1.117332612766939}},
|
||||||
|
{"name":"dense1/conv1/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003091680419211294,"min":-0.5966943209077797}},
|
||||||
|
{"name":"dense1/conv2/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005407439727409214,"min":-0.708374604290607}},
|
||||||
|
{"name":"dense1/conv2/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00946493943532308,"min":-1.2399070660273235}},
|
||||||
|
{"name":"dense1/conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004409168514550901,"min":-0.9788354102303}},
|
||||||
|
{"name":"dense1/conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004478132958505668,"min":-0.6493292789833219}},
|
||||||
|
{"name":"dense1/conv3/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011063695888893277,"min":-1.2501976354449402}},
|
||||||
|
{"name":"dense1/conv3/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003909627596537272,"min":-0.6646366914113363}},
|
||||||
|
{"name":"dense2/conv0/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003213915404151468,"min":-0.3374611174359041}},
|
||||||
|
{"name":"dense2/conv0/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010917326048308728,"min":-1.4520043644250609}},
|
||||||
|
{"name":"dense2/conv0/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002800439152063108,"min":-0.38085972468058266}},
|
||||||
|
{"name":"dense2/conv1/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0050568851770139206,"min":-0.6927932692509071}},
|
||||||
|
{"name":"dense2/conv1/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01074961213504567,"min":-1.3222022926106174}},
|
||||||
|
{"name":"dense2/conv1/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0030654204242369708,"min":-0.5487102559384177}},
|
||||||
|
{"name":"dense2/conv2/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00591809165244009,"min":-0.917304206128214}},
|
||||||
|
{"name":"dense2/conv2/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01092823346455892,"min":-1.366029183069865}},
|
||||||
|
{"name":"dense2/conv2/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002681120470458386,"min":-0.36463238398234055}},
|
||||||
|
{"name":"dense2/conv3/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0048311497650894465,"min":-0.5797379718107336}},
|
||||||
|
{"name":"dense2/conv3/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011227761062921263,"min":-1.4483811771168429}},
|
||||||
|
{"name":"dense2/conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0034643323982463162,"min":-0.3360402426298927}},
|
||||||
|
{"name":"dense3/conv0/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394978887894574,"min":-0.49227193874471326}},
|
||||||
|
{"name":"dense3/conv0/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010051267287310432,"min":-1.2765109454884247}},
|
||||||
|
{"name":"dense3/conv0/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003142924752889895,"min":-0.4588670139219247}},
|
||||||
|
{"name":"dense3/conv1/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00448304671867221,"min":-0.5872791201460595}},
|
||||||
|
{"name":"dense3/conv1/pointwise_filter","shape":[1,1,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016063522357566685,"min":-2.3613377865623026}},
|
||||||
|
{"name":"dense3/conv1/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00287135781026354,"min":-0.47664539650374765}},
|
||||||
|
{"name":"dense3/conv2/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006002906724518421,"min":-0.7923836876364315}},
|
||||||
|
{"name":"dense3/conv2/pointwise_filter","shape":[1,1,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.017087187019048954,"min":-1.6061955797906016}},
|
||||||
|
{"name":"dense3/conv2/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003124481205846749,"min":-0.46242321846531886}},
|
||||||
|
{"name":"dense3/conv3/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006576311588287353,"min":-1.0193282961845398}},
|
||||||
|
{"name":"dense3/conv3/pointwise_filter","shape":[1,1,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015590153955945782,"min":-1.99553970636106}},
|
||||||
|
{"name":"dense3/conv3/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004453541601405424,"min":-0.6546706154065973}},
|
||||||
|
{"name":"fc/weights","shape":[256,136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010417488509533453,"min":-1.500118345372817}},
|
||||||
|
{"name":"fc/bias","shape":[136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0025084222648658005,"min":0.07683877646923065}}
|
||||||
|
],
|
||||||
|
"paths":
|
||||||
|
[
|
||||||
|
"face_landmark_68_model.bin"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
public/tfjs/face_api/model/face_landmark_68_model.bin
Normal file
BIN
public/tfjs/face_api/model/face_landmark_68_model.bin
Normal file
Binary file not shown.
@@ -0,0 +1,39 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"weights":
|
||||||
|
[
|
||||||
|
{"name":"dense0/conv0/filters","shape":[3,3,3,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008194216092427571,"min":-0.9423348506291708}},
|
||||||
|
{"name":"dense0/conv0/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006839508168837603,"min":-0.8412595047670252}},
|
||||||
|
{"name":"dense0/conv1/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009194007106855804,"min":-1.2779669878529567}},
|
||||||
|
{"name":"dense0/conv1/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0036026100317637128,"min":-0.3170296827952067}},
|
||||||
|
{"name":"dense0/conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.000740380117706224,"min":-0.06367269012273527}},
|
||||||
|
{"name":"dense0/conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":1,"min":0}},
|
||||||
|
{"name":"dense0/conv2/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":1,"min":0}},
|
||||||
|
{"name":"dense0/conv2/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0037702228508743585,"min":-0.6220867703942692}},
|
||||||
|
{"name":"dense1/conv0/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0033707996209462483,"min":-0.421349952618281}},
|
||||||
|
{"name":"dense1/conv0/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014611541991140328,"min":-1.8556658328748217}},
|
||||||
|
{"name":"dense1/conv0/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002832523046755323,"min":-0.30307996600281956}},
|
||||||
|
{"name":"dense1/conv1/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006593170586754294,"min":-0.6329443763284123}},
|
||||||
|
{"name":"dense1/conv1/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.012215249211180444,"min":-1.6001976466646382}},
|
||||||
|
{"name":"dense1/conv1/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002384825547536214,"min":-0.3028728445370992}},
|
||||||
|
{"name":"dense1/conv2/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005859645441466687,"min":-0.7617539073906693}},
|
||||||
|
{"name":"dense1/conv2/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013121426806730382,"min":-1.7845140457153321}},
|
||||||
|
{"name":"dense1/conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0032247188044529336,"min":-0.46435950784122243}},
|
||||||
|
{"name":"dense2/conv0/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002659512618008782,"min":-0.32977956463308894}},
|
||||||
|
{"name":"dense2/conv0/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015499923743453681,"min":-1.9839902391620712}},
|
||||||
|
{"name":"dense2/conv0/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0032450980999890497,"min":-0.522460794098237}},
|
||||||
|
{"name":"dense2/conv1/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005911862382701799,"min":-0.792189559282041}},
|
||||||
|
{"name":"dense2/conv1/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021025861478319356,"min":-2.2077154552235325}},
|
||||||
|
{"name":"dense2/conv1/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00349616945958605,"min":-0.46149436866535865}},
|
||||||
|
{"name":"dense2/conv2/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008104994250278847,"min":-1.013124281284856}},
|
||||||
|
{"name":"dense2/conv2/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.029337059282789044,"min":-3.5791212325002633}},
|
||||||
|
{"name":"dense2/conv2/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0038808938334969913,"min":-0.4230174278511721}},
|
||||||
|
{"name":"fc/weights","shape":[128,136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014016061670639936,"min":-1.8921683255363912}},
|
||||||
|
{"name":"fc/bias","shape":[136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0029505149698724935,"min":0.088760145008564}}
|
||||||
|
],
|
||||||
|
"paths":
|
||||||
|
[
|
||||||
|
"face_landmark_68_tiny_model.bin"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
public/tfjs/face_api/model/face_landmark_68_tiny_model.bin
Normal file
BIN
public/tfjs/face_api/model/face_landmark_68_tiny_model.bin
Normal file
Binary file not shown.
@@ -0,0 +1,128 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"weights":
|
||||||
|
[
|
||||||
|
{"name":"conv32_down/conv/filters","shape":[7,7,3,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0005260649557207145,"min":-0.07101876902229645}},
|
||||||
|
{"name":"conv32_down/conv/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":8.471445956577858e-7,"min":-0.00014740315964445472}},
|
||||||
|
{"name":"conv32_down/scale/weights","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.06814416062598135,"min":5.788674831390381}},
|
||||||
|
{"name":"conv32_down/scale/biases","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008471635042452345,"min":-0.931879854669758}},
|
||||||
|
{"name":"conv32_1/conv1/conv/filters","shape":[3,3,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0007328585666768691,"min":-0.0974701893680236}},
|
||||||
|
{"name":"conv32_1/conv1/conv/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":1.5952091238361e-8,"min":-0.000001978059313556764}},
|
||||||
|
{"name":"conv32_1/conv1/scale/weights","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.02146628510718252,"min":3.1103382110595703}},
|
||||||
|
{"name":"conv32_1/conv1/scale/biases","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0194976619645661,"min":-2.3787147596770644}},
|
||||||
|
{"name":"conv32_1/conv2/conv/filters","shape":[3,3,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0004114975824075587,"min":-0.05267169054816751}},
|
||||||
|
{"name":"conv32_1/conv2/conv/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":4.600177166424806e-9,"min":-5.70421968636676e-7}},
|
||||||
|
{"name":"conv32_1/conv2/scale/weights","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.03400764932819441,"min":2.1677730083465576}},
|
||||||
|
{"name":"conv32_1/conv2/scale/biases","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010974494616190593,"min":-1.240117891629537}},
|
||||||
|
{"name":"conv32_2/conv1/conv/filters","shape":[3,3,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0005358753251094444,"min":-0.0760942961655411}},
|
||||||
|
{"name":"conv32_2/conv1/conv/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":5.9886454383719385e-9,"min":-7.366033889197485e-7}},
|
||||||
|
{"name":"conv32_2/conv1/scale/weights","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014633869657329485,"min":2.769575357437134}},
|
||||||
|
{"name":"conv32_2/conv1/scale/biases","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.022131107367721257,"min":-2.5229462399202234}},
|
||||||
|
{"name":"conv32_2/conv2/conv/filters","shape":[3,3,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00030145110452876373,"min":-0.03949009469326805}},
|
||||||
|
{"name":"conv32_2/conv2/conv/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":6.8779549306497095e-9,"min":-9.010120959151119e-7}},
|
||||||
|
{"name":"conv32_2/conv2/scale/weights","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.03929369870354148,"min":4.8010945320129395}},
|
||||||
|
{"name":"conv32_2/conv2/scale/biases","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010553357180427103,"min":-1.2452961472903983}},
|
||||||
|
{"name":"conv32_3/conv1/conv/filters","shape":[3,3,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0003133527642371608,"min":-0.040735859350830905}},
|
||||||
|
{"name":"conv32_3/conv1/conv/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":4.1064200719547974e-9,"min":-3.0387508532465503e-7}},
|
||||||
|
{"name":"conv32_3/conv1/scale/weights","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009252088210161994,"min":2.333256721496582}},
|
||||||
|
{"name":"conv32_3/conv1/scale/biases","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.007104101251153385,"min":-0.34810096130651585}},
|
||||||
|
{"name":"conv32_3/conv2/conv/filters","shape":[3,3,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00029995629892629733,"min":-0.031195455088334923}},
|
||||||
|
{"name":"conv32_3/conv2/conv/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":5.62726418316814e-9,"min":-6.921534945296811e-7}},
|
||||||
|
{"name":"conv32_3/conv2/scale/weights","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0467432975769043,"min":5.362040996551514}},
|
||||||
|
{"name":"conv32_3/conv2/scale/biases","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010314425300149357,"min":-1.268674311918371}},
|
||||||
|
{"name":"conv64_down/conv1/conv/filters","shape":[3,3,32,64],"dtype":"float32"},
|
||||||
|
{"name":"conv64_down/conv1/conv/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":8.373908033218849e-10,"min":-1.172347124650639e-7}},
|
||||||
|
{"name":"conv64_down/conv1/scale/weights","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0066875364266189875,"min":2.5088400840759277}},
|
||||||
|
{"name":"conv64_down/conv1/scale/biases","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01691421620986041,"min":-2.0973628100226906}},
|
||||||
|
{"name":"conv64_down/conv2/conv/filters","shape":[3,3,64,64],"dtype":"float32"},
|
||||||
|
{"name":"conv64_down/conv2/conv/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":2.3252014483766877e-9,"min":-2.673981665633191e-7}},
|
||||||
|
{"name":"conv64_down/conv2/scale/weights","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.032557439804077146,"min":2.6351239681243896}},
|
||||||
|
{"name":"conv64_down/conv2/scale/biases","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015429047509735706,"min":-1.5429047509735707}},
|
||||||
|
{"name":"conv64_1/conv1/conv/filters","shape":[3,3,64,64],"dtype":"float32"},
|
||||||
|
{"name":"conv64_1/conv1/conv/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":1.1319172039756998e-9,"min":-1.4941307092479238e-7}},
|
||||||
|
{"name":"conv64_1/conv1/scale/weights","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.007802607031429515,"min":3.401733160018921}},
|
||||||
|
{"name":"conv64_1/conv1/scale/biases","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01425027146058924,"min":-0.6982633015688727}},
|
||||||
|
{"name":"conv64_1/conv2/conv/filters","shape":[3,3,64,64],"dtype":"float32"},
|
||||||
|
{"name":"conv64_1/conv2/conv/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":2.5635019893325435e-9,"min":-2.717312108692496e-7}},
|
||||||
|
{"name":"conv64_1/conv2/scale/weights","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.04062801716374416,"min":3.542381525039673}},
|
||||||
|
{"name":"conv64_1/conv2/scale/biases","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.007973166306813557,"min":-0.7415044665336609}},
|
||||||
|
{"name":"conv64_2/conv1/conv/filters","shape":[3,3,64,64],"dtype":"float32"},
|
||||||
|
{"name":"conv64_2/conv1/conv/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":1.2535732661062331e-9,"min":-1.8302169685151004e-7}},
|
||||||
|
{"name":"conv64_2/conv1/scale/weights","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005631206549850164,"min":2.9051668643951416}},
|
||||||
|
{"name":"conv64_2/conv1/scale/biases","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01859012585060269,"min":-2.3795361088771445}},
|
||||||
|
{"name":"conv64_2/conv2/conv/filters","shape":[3,3,64,64],"dtype":"float32"},
|
||||||
|
{"name":"conv64_2/conv2/conv/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":2.486726369919351e-9,"min":-3.5311514452854786e-7}},
|
||||||
|
{"name":"conv64_2/conv2/scale/weights","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.03740917467603497,"min":5.571568965911865}},
|
||||||
|
{"name":"conv64_2/conv2/scale/biases","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006418555858088475,"min":-0.5263215803632549}},
|
||||||
|
{"name":"conv64_3/conv1/conv/filters","shape":[3,3,64,64],"dtype":"float32"},
|
||||||
|
{"name":"conv64_3/conv1/conv/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":7.432564576875473e-10,"min":-8.47312361763804e-8}},
|
||||||
|
{"name":"conv64_3/conv1/scale/weights","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006400122362024644,"min":2.268010377883911}},
|
||||||
|
{"name":"conv64_3/conv1/scale/biases","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010945847922680425,"min":-1.3353934465670119}},
|
||||||
|
{"name":"conv64_3/conv2/conv/filters","shape":[3,3,64,64],"dtype":"float32"},
|
||||||
|
{"name":"conv64_3/conv2/conv/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":2.278228722014533e-9,"min":-3.212302498040492e-7}},
|
||||||
|
{"name":"conv64_3/conv2/scale/weights","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.029840927498013366,"min":7.038398265838623}},
|
||||||
|
{"name":"conv64_3/conv2/scale/biases","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.010651412197187834,"min":-1.161003929493474}},
|
||||||
|
{"name":"conv128_down/conv1/conv/filters","shape":[3,3,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00020040544662989823,"min":-0.022245004575918704}},
|
||||||
|
{"name":"conv128_down/conv1/conv/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":4.3550543563576545e-10,"min":-4.311503812794078e-8}},
|
||||||
|
{"name":"conv128_down/conv1/scale/weights","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.007448580685783835,"min":2.830846071243286}},
|
||||||
|
{"name":"conv128_down/conv1/scale/biases","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01211262824488621,"min":-1.6957679542840696}},
|
||||||
|
{"name":"conv128_down/conv2/conv/filters","shape":[3,3,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00022380277514457702,"min":-0.02484210804104805}},
|
||||||
|
{"name":"conv128_down/conv2/conv/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":9.031058637304466e-10,"min":-1.1650065642122761e-7}},
|
||||||
|
{"name":"conv128_down/conv2/scale/weights","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.027663578706629135,"min":3.1111555099487305}},
|
||||||
|
{"name":"conv128_down/conv2/scale/biases","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008878476946961646,"min":-1.029903325847551}},
|
||||||
|
{"name":"conv128_1/conv1/conv/filters","shape":[3,3,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00022380667574265425,"min":-0.032899581334170175}},
|
||||||
|
{"name":"conv128_1/conv1/conv/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":4.4147297756478345e-10,"min":-5.253528433020923e-8}},
|
||||||
|
{"name":"conv128_1/conv1/scale/weights","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013599334978589825,"min":3.634530782699585}},
|
||||||
|
{"name":"conv128_1/conv1/scale/biases","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014059314073300829,"min":-1.4059314073300828}},
|
||||||
|
{"name":"conv128_1/conv2/conv/filters","shape":[3,3,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00021715293474057143,"min":-0.02909849325523657}},
|
||||||
|
{"name":"conv128_1/conv2/conv/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":9.887046963276768e-10,"min":-1.1370104007768284e-7}},
|
||||||
|
{"name":"conv128_1/conv2/scale/weights","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.029993299409454943,"min":3.630716562271118}},
|
||||||
|
{"name":"conv128_1/conv2/scale/biases","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00782704236460667,"min":-0.7200878975438136}},
|
||||||
|
{"name":"conv128_2/conv1/conv/filters","shape":[3,3,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00017718105923895743,"min":-0.022324813464108636}},
|
||||||
|
{"name":"conv128_2/conv1/conv/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":3.567012027797675e-10,"min":-5.243507680862582e-8}},
|
||||||
|
{"name":"conv128_2/conv1/scale/weights","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.007940645778880399,"min":4.927767753601074}},
|
||||||
|
{"name":"conv128_2/conv1/scale/biases","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015933452867994122,"min":-1.5614783810634238}},
|
||||||
|
{"name":"conv128_2/conv2/conv/filters","shape":[3,3,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0001451439717236687,"min":-0.01712698866339291}},
|
||||||
|
{"name":"conv128_2/conv2/conv/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":1.0383988570966347e-9,"min":-1.2356946399449953e-7}},
|
||||||
|
{"name":"conv128_2/conv2/scale/weights","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.02892604528688917,"min":4.750600814819336}},
|
||||||
|
{"name":"conv128_2/conv2/scale/biases","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00797275748907351,"min":-0.7414664464838364}},
|
||||||
|
{"name":"conv256_down/conv1/conv/filters","shape":[3,3,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0002698827827093648,"min":-0.03994265184098599}},
|
||||||
|
{"name":"conv256_down/conv1/conv/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":5.036909834755123e-10,"min":-6.396875490139006e-8}},
|
||||||
|
{"name":"conv256_down/conv1/scale/weights","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014870181738161573,"min":4.269900798797607}},
|
||||||
|
{"name":"conv256_down/conv1/scale/biases","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.022031106200872685,"min":-3.1063859743230484}},
|
||||||
|
{"name":"conv256_down/conv2/conv/filters","shape":[3,3,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00046430734150549946,"min":-0.03946612402796745}},
|
||||||
|
{"name":"conv256_down/conv2/conv/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":6.693064577513153e-10,"min":-7.630093618364995e-8}},
|
||||||
|
{"name":"conv256_down/conv2/scale/weights","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.03475512242784687,"min":3.608360528945923}},
|
||||||
|
{"name":"conv256_down/conv2/scale/biases","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01290142021927179,"min":-1.1482263995151893}},
|
||||||
|
{"name":"conv256_1/conv1/conv/filters","shape":[3,3,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00037147209924810076,"min":-0.04234781931428348}},
|
||||||
|
{"name":"conv256_1/conv1/conv/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":3.2105515457510146e-10,"min":-3.467395669411096e-8}},
|
||||||
|
{"name":"conv256_1/conv1/scale/weights","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.043242172166412955,"min":5.28542947769165}},
|
||||||
|
{"name":"conv256_1/conv1/scale/biases","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01643658619300992,"min":-1.3149268954407936}},
|
||||||
|
{"name":"conv256_1/conv2/conv/filters","shape":[3,3,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0003289232651392619,"min":-0.041773254672686264}},
|
||||||
|
{"name":"conv256_1/conv2/conv/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":9.13591691187321e-10,"min":-1.2333487831028833e-7}},
|
||||||
|
{"name":"conv256_1/conv2/scale/weights","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0573908618852204,"min":4.360693454742432}},
|
||||||
|
{"name":"conv256_1/conv2/scale/biases","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0164216583850337,"min":-1.3958409627278647}},
|
||||||
|
{"name":"conv256_2/conv1/conv/filters","shape":[3,3,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00010476927912118389,"min":-0.015610622589056398}},
|
||||||
|
{"name":"conv256_2/conv1/conv/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":2.418552539068639e-10,"min":-2.539480166022071e-8}},
|
||||||
|
{"name":"conv256_2/conv1/scale/weights","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.06024209564807368,"min":6.598613739013672}},
|
||||||
|
{"name":"conv256_2/conv1/scale/biases","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01578534350675695,"min":-1.1049740454729864}},
|
||||||
|
{"name":"conv256_2/conv2/conv/filters","shape":[3,3,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00005543030908002573,"min":-0.007427661416723448}},
|
||||||
|
{"name":"conv256_2/conv2/conv/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":1.0822061852320308e-9,"min":-1.515088659324843e-7}},
|
||||||
|
{"name":"conv256_2/conv2/scale/weights","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.04302893993901272,"min":2.2855491638183594}},
|
||||||
|
{"name":"conv256_2/conv2/scale/biases","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006792667566561232,"min":-0.8083274404207865}},
|
||||||
|
{"name":"conv256_down_out/conv1/conv/filters","shape":[3,3,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.000568966465253456,"min":-0.05632768006009214}},
|
||||||
|
{"name":"conv256_down_out/conv1/conv/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":4.5347887884881677e-10,"min":-6.530095855422961e-8}},
|
||||||
|
{"name":"conv256_down_out/conv1/scale/weights","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.017565592597512638,"min":4.594101905822754}},
|
||||||
|
{"name":"conv256_down_out/conv1/scale/biases","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.04850864223405427,"min":-6.306123490427055}},
|
||||||
|
{"name":"conv256_down_out/conv2/conv/filters","shape":[3,3,256,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0003739110687199761,"min":-0.06954745878191555}},
|
||||||
|
{"name":"conv256_down_out/conv2/conv/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":1.2668428328152895e-9,"min":-2.2549802424112154e-7}},
|
||||||
|
{"name":"conv256_down_out/conv2/scale/weights","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.04351314469879749,"min":4.31956672668457}},
|
||||||
|
{"name":"conv256_down_out/conv2/scale/biases","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021499746921015722,"min":-1.2039858275768804}},
|
||||||
|
{"name":"fc","shape":[256,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.000357687911566566,"min":-0.04578405268052045}}
|
||||||
|
],
|
||||||
|
"paths":
|
||||||
|
[
|
||||||
|
"face_recognition_model.bin"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
public/tfjs/face_api/model/face_recognition_model.bin
Normal file
BIN
public/tfjs/face_api/model/face_recognition_model.bin
Normal file
Binary file not shown.
@@ -0,0 +1,162 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"weights":
|
||||||
|
[
|
||||||
|
{"dtype":"float32","shape":[1,1,512,9],"quantization":{"scale":0.0026856216729856004,"min":-0.34107395246917127,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/ClassPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[9],"quantization":{"scale":0.00198518248165355,"min":-0.32159956202787515,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/ClassPredictor/biases"},
|
||||||
|
{"dtype":"float32","shape":[1,1,1024,18],"quantization":{"scale":0.003060340296988394,"min":-0.489654447518143,"dtype":"uint8"},"name":"Prediction/BoxPredictor_1/ClassPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[18],"quantization":{"scale":0.0008040678851744708,"min":-0.12221831854651957,"dtype":"uint8"},"name":"Prediction/BoxPredictor_1/ClassPredictor/biases"},
|
||||||
|
{"dtype":"float32","shape":[1,1,512,18],"quantization":{"scale":0.0012513800578958848,"min":-0.16017664741067325,"dtype":"uint8"},"name":"Prediction/BoxPredictor_2/ClassPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[18],"quantization":{"scale":0.000338070518245884,"min":-0.05510549447407909,"dtype":"uint8"},"name":"Prediction/BoxPredictor_2/ClassPredictor/biases"},
|
||||||
|
{"dtype":"float32","shape":[1,1,256,18],"quantization":{"scale":0.0011819932975021064,"min":-0.1453851755927591,"dtype":"uint8"},"name":"Prediction/BoxPredictor_3/ClassPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[18],"quantization":{"scale":0.00015985782386041154,"min":-0.026536398760828316,"dtype":"uint8"},"name":"Prediction/BoxPredictor_3/ClassPredictor/biases"},
|
||||||
|
{"dtype":"float32","shape":[1,1,256,18],"quantization":{"scale":0.0007035591438704846,"min":-0.08513065640832863,"dtype":"uint8"},"name":"Prediction/BoxPredictor_4/ClassPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[18],"quantization":{"scale":0.00008793946574716008,"min":-0.013190919862074012,"dtype":"uint8"},"name":"Prediction/BoxPredictor_4/ClassPredictor/biases"},
|
||||||
|
{"dtype":"float32","shape":[1,1,128,18],"quantization":{"scale":0.00081320781918133,"min":-0.11059626340866088,"dtype":"uint8"},"name":"Prediction/BoxPredictor_5/ClassPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[18],"quantization":{"scale":0.0000980533805547976,"min":-0.014609953702664841,"dtype":"uint8"},"name":"Prediction/BoxPredictor_5/ClassPredictor/biases"},
|
||||||
|
{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":3,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/stack_1/2"},
|
||||||
|
{"dtype":"int32","shape":[3],"quantization":{"scale":0.00392156862745098,"min":0,"dtype":"uint8"},"name":"Postprocessor/Slice/begin"},
|
||||||
|
{"dtype":"int32","shape":[3],"quantization":{"scale":1,"min":-1,"dtype":"uint8"},"name":"Postprocessor/Slice/size"},
|
||||||
|
{"dtype":"float32","shape":[1,1,512,12],"quantization":{"scale":0.003730384859384275,"min":-0.4327246436885759,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/BoxEncodingPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[12],"quantization":{"scale":0.0018744708568442102,"min":-0.3917644090804399,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/BoxEncodingPredictor/biases"},
|
||||||
|
{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":3072,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/stack_1/1"},
|
||||||
|
{"dtype":"float32","shape":[1,1,1024,24],"quantization":{"scale":0.00157488017689948,"min":-0.20000978246623397,"dtype":"uint8"},"name":"Prediction/BoxPredictor_1/BoxEncodingPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[24],"quantization":{"scale":0.0002823906713256649,"min":-0.043488163384152394,"dtype":"uint8"},"name":"Prediction/BoxPredictor_1/BoxEncodingPredictor/biases"},
|
||||||
|
{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":1536,"dtype":"uint8"},"name":"Prediction/BoxPredictor_1/stack_1/1"},
|
||||||
|
{"dtype":"float32","shape":[1,1,512,24],"quantization":{"scale":0.0007974451663447361,"min":-0.11004743295557358,"dtype":"uint8"},"name":"Prediction/BoxPredictor_2/BoxEncodingPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[24],"quantization":{"scale":0.0001350417988849621,"min":-0.02039131163162928,"dtype":"uint8"},"name":"Prediction/BoxPredictor_2/BoxEncodingPredictor/biases"},
|
||||||
|
{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":384,"dtype":"uint8"},"name":"Prediction/BoxPredictor_2/stack_1/1"},
|
||||||
|
{"dtype":"float32","shape":[1,1,256,24],"quantization":{"scale":0.0007113990246080885,"min":-0.0860792819775787,"dtype":"uint8"},"name":"Prediction/BoxPredictor_3/BoxEncodingPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[24],"quantization":{"scale":0.000050115815418608046,"min":-0.007617603943628423,"dtype":"uint8"},"name":"Prediction/BoxPredictor_3/BoxEncodingPredictor/biases"},
|
||||||
|
{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":96,"dtype":"uint8"},"name":"Prediction/BoxPredictor_3/stack_1/1"},
|
||||||
|
{"dtype":"float32","shape":[1,1,256,24],"quantization":{"scale":0.000590049314732645,"min":-0.06903576982371946,"dtype":"uint8"},"name":"Prediction/BoxPredictor_4/BoxEncodingPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[24],"quantization":{"scale":0.00003513663861097074,"min":-0.006359731588585704,"dtype":"uint8"},"name":"Prediction/BoxPredictor_4/BoxEncodingPredictor/biases"},
|
||||||
|
{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":24,"dtype":"uint8"},"name":"Prediction/BoxPredictor_4/stack_1/1"},
|
||||||
|
{"dtype":"float32","shape":[1,1,128,24],"quantization":{"scale":0.0005990567744946948,"min":-0.07907549423329971,"dtype":"uint8"},"name":"Prediction/BoxPredictor_5/BoxEncodingPredictor/weights"},
|
||||||
|
{"dtype":"float32","shape":[24],"quantization":{"scale":0.00003392884288640583,"min":-0.006039334033780238,"dtype":"uint8"},"name":"Prediction/BoxPredictor_5/BoxEncodingPredictor/biases"},
|
||||||
|
{"dtype":"float32","shape":[],"quantization":{"scale":1,"min":0.007843137718737125,"dtype":"uint8"},"name":"Preprocessor/mul/x"},
|
||||||
|
{"dtype":"int32","shape":[2],"quantization":{"scale":1,"min":512,"dtype":"uint8"},"name":"Preprocessor/ResizeImage/size"},
|
||||||
|
{"dtype":"float32","shape":[],"quantization":{"scale":1,"min":1,"dtype":"uint8"},"name":"Preprocessor/sub/y"},
|
||||||
|
{"dtype":"float32","shape":[3,3,3,32],"quantization":{"scale":0.03948551065781537,"min":-5.014659853542552,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_0_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[32],"quantization":{"scale":0.0498106133704092,"min":-7.371970778820562,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_0_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,32,1],"quantization":{"scale":0.036833542468501075,"min":-4.714693435968138,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[32],"quantization":{"scale":0.012173276705046495,"min":-0.012173276705046495,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[32],"quantization":{"scale":0.032182769214405736,"min":-2.4780732295092416,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[32],"quantization":{"scale":0.028287527607936486,"min":-3.366215785344442,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[32],"quantization":{"scale":0.04716738532571232,"min":3.9071404665769224e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,32,64],"quantization":{"scale":0.04010109433940812,"min":-4.290817094316669,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[64],"quantization":{"scale":0.2212210038129021,"min":-34.51047659481273,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,64,1],"quantization":{"scale":0.010024750933927648,"min":-1.343316625146305,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[64],"quantization":{"scale":0.006120916675118839,"min":0.5227176547050476,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[64],"quantization":{"scale":0.02317035385206634,"min":-0.7646216771181892,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[64],"quantization":{"scale":0.04980821422502106,"min":-5.8275610643274645,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[64],"quantization":{"scale":0.051751047022202436,"min":3.916113799002297e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,64,128],"quantization":{"scale":0.021979344124887504,"min":-2.1319963801140878,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.09958663267247816,"min":-11.054116226645077,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,128,1],"quantization":{"scale":0.01943492702409333,"min":-2.6237151482525993,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.017852897737540452,"min":0.40204083919525146,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.029888209174661076,"min":-1.972621805527631,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.029319268581913967,"min":-5.130872001834945,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.014018708584355373,"min":3.9083178263362604e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,128,128],"quantization":{"scale":0.020776657964669022,"min":-2.5347522716896207,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.14383157094319662,"min":-9.636715253194174,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,128,1],"quantization":{"scale":0.004463558571011412,"min":-0.5981168485155293,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.006487431245691636,"min":0.47910428047180176,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.026542164297664865,"min":-1.2209395576925839,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.05119945675719018,"min":-8.60150873520795,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.03081628388049556,"min":3.911508751095344e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,128,256],"quantization":{"scale":0.010758659886378868,"min":-1.0328313490923713,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.08058219610476026,"min":-9.34753474815219,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,256,1],"quantization":{"scale":0.01145936741548426,"min":-1.3292866201961742,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.0083988838336047,"min":0.36280909180641174,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.02858148649627087,"min":-3.6584302715226715,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.03988401375564874,"min":-7.099354448505476,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.009090481683904049,"min":0.020878996700048447,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,256,256],"quantization":{"scale":0.008951201625898773,"min":-1.1189002032373465,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.051758006974762565,"min":-5.745138774198645,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,256,1],"quantization":{"scale":0.004110433190476661,"min":-0.6042336790000691,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.013170199768216002,"min":0.3386639356613159,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.03599378548416437,"min":-3.70735990486893,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.026967673208199296,"min":-3.748506575939702,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.012615410486857097,"min":3.9111388979838637e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,256,512],"quantization":{"scale":0.00822840648538926,"min":-1.1848905338960536,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.06608965817619772,"min":-7.468131373910342,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.008801074355256323,"min":-0.9593171047229393,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.030577416513480393,"min":0.3285980224609375,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.04778536441279393,"min":-8.935863145192464,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.04331884945140165,"min":-9.660103427662568,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.04126455444367785,"min":0.000604183878749609,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,512,512],"quantization":{"scale":0.009305818408143287,"min":-1.1446156642016243,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.04640720217835669,"min":-4.733534622192383,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.008138792655047248,"min":-0.9766551186056698,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.027351748358969596,"min":0.34030041098594666,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.04415061053107767,"min":-7.019947074441349,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.02476683784933651,"min":-2.9224868662217083,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.02547598832684076,"min":0.00026032101595774293,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,512,512],"quantization":{"scale":0.01083052625843123,"min":-1.2563410459780227,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.06360894371481503,"min":-7.951117964351878,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.006704086883395326,"min":-0.8648272079579971,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.015343831567203297,"min":0.2711026668548584,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.03378283930759804,"min":-4.797163181678922,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.021910778213949763,"min":-3.987761634938857,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.009284070410007296,"min":0.000021581046894425526,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,512,512],"quantization":{"scale":0.012783036979974485,"min":-1.9046725100161983,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.07273082733154297,"min":-9.52773838043213,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.006126228033327589,"min":-0.7351473639993107,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.029703759212119908,"min":0.28687000274658203,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.04394429898729511,"min":-6.3279790541704966,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.016566915605582443,"min":-2.7501079905266854,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.012152872833551145,"min":3.913338286370366e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,512,512],"quantization":{"scale":0.01354524388032801,"min":-1.7473364605623134,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.08566816367355047,"min":-9.937506986131854,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.006012305558896532,"min":-0.7876120282154457,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.01469323155926723,"min":0.29223933815956116,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.030889174517463234,"min":-3.2433633243336395,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.014836942448335536,"min":-2.047498057870304,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.007234466105343445,"min":0.00013165915152058005,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,512,512],"quantization":{"scale":0.016261722527298274,"min":-1.4798167499841428,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.091437328563017,"min":-14.172785927267636,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.004750356487199372,"min":-0.650798838746314,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.008174965545242907,"min":0.3120670020580292,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.030133422215779623,"min":-2.41067377726237,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.006088157261119169,"min":-0.7853722866843729,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.003668997334498985,"min":3.9124486300013356e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,512,1024],"quantization":{"scale":0.010959514449624454,"min":-1.4028178495519301,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[1024],"quantization":{"scale":0.10896045834410424,"min":-14.818622334798176,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,1024,1],"quantization":{"scale":0.004633033509347953,"min":-0.5652300881404502,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_depthwise/depthwise_weights"},
|
||||||
|
{"dtype":"float32","shape":[1024],"quantization":{"scale":0.022285057224479377,"min":0.23505790531635284,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_depthwise/BatchNorm/gamma"},
|
||||||
|
{"dtype":"float32","shape":[1024],"quantization":{"scale":0.0324854850769043,"min":-3.9957146644592285,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_depthwise/BatchNorm/beta"},
|
||||||
|
{"dtype":"float32","shape":[1024],"quantization":{"scale":0.014760061806323482,"min":-2.125448900110581,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_depthwise/BatchNorm/moving_mean"},
|
||||||
|
{"dtype":"float32","shape":[1024],"quantization":{"scale":0.0036057423142825855,"min":3.9067056828997994e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_depthwise/BatchNorm/moving_variance"},
|
||||||
|
{"dtype":"float32","shape":[1,1,1024,1024],"quantization":{"scale":0.017311988157384536,"min":-2.094750567043529,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[1024],"quantization":{"scale":0.16447528764313343,"min":-25.658144872328815,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[1,1,1024,256],"quantization":{"scale":0.0026493051472832175,"min":-0.36825341547236723,"dtype":"uint8"},"name":"Prediction/Conv2d_0_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.012474596734140433,"min":-2.3078003958159803,"dtype":"uint8"},"name":"Prediction/Conv2d_0_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,256,512],"quantization":{"scale":0.014533351449405445,"min":-1.8166689311756807,"dtype":"uint8"},"name":"Prediction/Conv2d_1_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[512],"quantization":{"scale":0.024268776762719248,"min":-2.4754152297973633,"dtype":"uint8"},"name":"Prediction/Conv2d_1_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[1,1,512,128],"quantization":{"scale":0.002208403746287028,"min":-0.28709248701731366,"dtype":"uint8"},"name":"Prediction/Conv2d_2_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.012451349052728392,"min":-1.5937726787492341,"dtype":"uint8"},"name":"Prediction/Conv2d_2_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,128,256],"quantization":{"scale":0.026334229637594783,"min":-2.8967652601354263,"dtype":"uint8"},"name":"Prediction/Conv2d_3_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.02509917792151956,"min":-1.4055539636050953,"dtype":"uint8"},"name":"Prediction/Conv2d_3_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[1,1,256,128],"quantization":{"scale":0.004565340046789132,"min":-0.3971845840706545,"dtype":"uint8"},"name":"Prediction/Conv2d_4_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.017302456556581983,"min":-2.5953684834872974,"dtype":"uint8"},"name":"Prediction/Conv2d_4_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,128,256],"quantization":{"scale":0.025347338470758176,"min":-3.8527954475552426,"dtype":"uint8"},"name":"Prediction/Conv2d_5_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[256],"quantization":{"scale":0.033134659598855414,"min":-2.9158500446992766,"dtype":"uint8"},"name":"Prediction/Conv2d_5_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[1,1,256,64],"quantization":{"scale":0.002493104397081861,"min":-0.2817207968702503,"dtype":"uint8"},"name":"Prediction/Conv2d_6_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[64],"quantization":{"scale":0.011383360974928912,"min":-1.2749364291920382,"dtype":"uint8"},"name":"Prediction/Conv2d_6_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"float32","shape":[3,3,64,128],"quantization":{"scale":0.020821522731407017,"min":-2.7484410005457263,"dtype":"uint8"},"name":"Prediction/Conv2d_7_pointwise/weights"},
|
||||||
|
{"dtype":"float32","shape":[128],"quantization":{"scale":0.052144218893612135,"min":-3.5979511036592373,"dtype":"uint8"},"name":"Prediction/Conv2d_7_pointwise/convolution_bn_offset"},
|
||||||
|
{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":6,"dtype":"uint8"},"name":"Prediction/BoxPredictor_5/stack_1/1"},
|
||||||
|
{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":1,"dtype":"uint8"},"name":"concat_1/axis"},
|
||||||
|
{"dtype":"int32","shape":[1],"quantization":{"scale":1,"min":0,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/strided_slice/stack"},
|
||||||
|
{"dtype":"int32","shape":[1],"quantization":{"scale":1,"min":1,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/strided_slice/stack_1"},
|
||||||
|
{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":5118,"dtype":"uint8"},"name":"Postprocessor/stack/1"},
|
||||||
|
{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":4,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/stack/3"},
|
||||||
|
{"dtype":"float32","shape":[1,5118,4],"name":"Output/extra_dim"}
|
||||||
|
],
|
||||||
|
"paths":
|
||||||
|
[
|
||||||
|
"ssd_mobilenetv1_model.bin"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
public/tfjs/face_api/model/ssd_mobilenetv1_model.bin
Normal file
BIN
public/tfjs/face_api/model/ssd_mobilenetv1_model.bin
Normal file
Binary file not shown.
@@ -0,0 +1,30 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"weights":
|
||||||
|
[
|
||||||
|
{"name":"conv0/filters","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009007044399485869,"min":-1.2069439495311063}},
|
||||||
|
{"name":"conv0/bias","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005263455241334205,"min":-0.9211046672334858}},
|
||||||
|
{"name":"conv1/depthwise_filter","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004001977630690033,"min":-0.5042491814669441}},
|
||||||
|
{"name":"conv1/pointwise_filter","shape":[1,1,16,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013836609615999109,"min":-1.411334180831909}},
|
||||||
|
{"name":"conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0015159862590771096,"min":-0.30926119685173037}},
|
||||||
|
{"name":"conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002666276225856706,"min":-0.317286870876948}},
|
||||||
|
{"name":"conv2/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015265831292844286,"min":-1.6792414422128714}},
|
||||||
|
{"name":"conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0020280554598453,"min":-0.37113414915168985}},
|
||||||
|
{"name":"conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006100742489683862,"min":-0.8907084034938438}},
|
||||||
|
{"name":"conv3/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016276211832083907,"min":-2.0508026908425725}},
|
||||||
|
{"name":"conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394414279975143,"min":-0.7637432129944072}},
|
||||||
|
{"name":"conv4/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006716050119961009,"min":-0.8059260143953211}},
|
||||||
|
{"name":"conv4/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021875603993733724,"min":-2.8875797271728514}},
|
||||||
|
{"name":"conv4/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0041141652009066415,"min":-0.8187188749804216}},
|
||||||
|
{"name":"conv5/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008423839597141042,"min":-0.9013508368940915}},
|
||||||
|
{"name":"conv5/pointwise_filter","shape":[1,1,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.030007277283014035,"min":-3.8709387695088107}},
|
||||||
|
{"name":"conv5/bias","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008402082966823203,"min":-1.4871686851277068}},
|
||||||
|
{"name":"conv8/filters","shape":[1,1,512,25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.028336129469030042,"min":-4.675461362389957}},
|
||||||
|
{"name":"conv8/bias","shape":[25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002268134028303857,"min":-0.41053225912299807}}
|
||||||
|
],
|
||||||
|
"paths":
|
||||||
|
[
|
||||||
|
"tiny_face_detector_model.bin"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
public/tfjs/face_api/model/tiny_face_detector_model.bin
Normal file
BIN
public/tfjs/face_api/model/tiny_face_detector_model.bin
Normal file
Binary file not shown.
BIN
public/tfjs/landscape_recognition/group1-shard1of1.bin
Normal file
BIN
public/tfjs/landscape_recognition/group1-shard1of1.bin
Normal file
Binary file not shown.
1
public/tfjs/landscape_recognition/model.json
Normal file
1
public/tfjs/landscape_recognition/model.json
Normal file
File diff suppressed because one or more lines are too long
@@ -5,8 +5,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { defineProps } from 'vue';
|
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
src?: string;
|
src?: string;
|
||||||
defaultSrc: string;
|
defaultSrc: string;
|
||||||
|
@@ -39,7 +39,7 @@ const props = withDefaults(defineProps<Props>(), {
|
|||||||
accept: '*', // 默认支持所有类型
|
accept: '*', // 默认支持所有类型
|
||||||
multiple: false,
|
multiple: false,
|
||||||
maxCount: undefined,
|
maxCount: undefined,
|
||||||
tip: 'Upload',
|
tip: 'ImageUpload',
|
||||||
fit: 'contain',
|
fit: 'contain',
|
||||||
draggable: true,
|
draggable: true,
|
||||||
disabled: false,
|
disabled: false,
|
||||||
|
242
src/constant/coco_ssd_label_category.ts
Normal file
242
src/constant/coco_ssd_label_category.ts
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
// 定义类别名称常量
|
||||||
|
export const CATEGORIES = {
|
||||||
|
ANIMALS: {en: 'animals', zh: '动物'},
|
||||||
|
VEHICLES: {en: 'vehicles', zh: '交通工具'},
|
||||||
|
FURNITURE: {en: 'furniture', zh: '家具'},
|
||||||
|
FOOD: {en: 'food', zh: '食物'},
|
||||||
|
SPORTS: {en: 'sports', zh: '运动'},
|
||||||
|
CONTAINERS: {en: 'containers', zh: '容器'},
|
||||||
|
ELECTRONICS: {en: 'electronics', zh: '电子产品'},
|
||||||
|
EVERYDAY_ITEMS: {en: 'everyday_items', zh: '日常物品'},
|
||||||
|
HOUSEHOLD: {en: 'household', zh: '家居用品'},
|
||||||
|
HUMAN: {en: 'human', zh: '人类'},
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
// 为每个标签提供中文名称的映射
|
||||||
|
export const LABELS = {
|
||||||
|
|
||||||
|
// Human 人类
|
||||||
|
'person': {en: 'person', zh: '人'},
|
||||||
|
|
||||||
|
// Vehicles 交通工具
|
||||||
|
'bicycle': {en: 'bicycle', zh: '自行车'},
|
||||||
|
'car': {en: 'car', zh: '汽车'},
|
||||||
|
'motorcycle': {en: 'motorcycle', zh: '摩托车'},
|
||||||
|
'airplane': {en: 'airplane', zh: '飞机'},
|
||||||
|
'bus': {en: 'bus', zh: '公共汽车'},
|
||||||
|
'train': {en: 'train', zh: '火车'},
|
||||||
|
'truck': {en: 'truck', zh: '卡车'},
|
||||||
|
'boat': {en: 'boat', zh: '船'},
|
||||||
|
'traffic_light': {en: 'traffic_light', zh: '交通信号灯'},
|
||||||
|
'fire_hydrant': {en: 'fire_hydrant', zh: '消防栓'},
|
||||||
|
'stop_sign': {en: 'stop_sign', zh: '停车标志'},
|
||||||
|
'parking_meter': {en: 'parking_meter', zh: '停车计时器'},
|
||||||
|
|
||||||
|
// Furniture 家具
|
||||||
|
'bench': {en: 'bench', zh: '长椅'},
|
||||||
|
'chair': {en: 'chair', zh: '椅子'},
|
||||||
|
'couch': {en: 'couch', zh: '沙发'},
|
||||||
|
'potted_plant': {en: 'potted_plant', zh: '盆栽'},
|
||||||
|
'bed': {en: 'bed', zh: '床'},
|
||||||
|
'dining_table': {en: 'dining_table', zh: '餐桌'},
|
||||||
|
'toilet': {en: 'toilet', zh: '厕所'},
|
||||||
|
|
||||||
|
// Food 食物
|
||||||
|
'banana': {en: 'banana', zh: '香蕉'},
|
||||||
|
'apple': {en: 'apple', zh: '苹果'},
|
||||||
|
'sandwich': {en: 'sandwich', zh: '三明治'},
|
||||||
|
'orange': {en: 'orange', zh: '橙子'},
|
||||||
|
'broccoli': {en: 'broccoli', zh: '西兰花'},
|
||||||
|
'carrot': {en: 'carrot', zh: '胡萝卜'},
|
||||||
|
'hot_dog': {en: 'hot_dog', zh: '热狗'},
|
||||||
|
'pizza': {en: 'pizza', zh: '披萨'},
|
||||||
|
'donut': {en: 'donut', zh: '甜甜圈'},
|
||||||
|
'cake': {en: 'cake', zh: '蛋糕'},
|
||||||
|
|
||||||
|
// Sports 运动
|
||||||
|
'frisbee': {en: 'frisbee', zh: '飞盘'},
|
||||||
|
'skis': {en: 'skis', zh: '滑雪板'},
|
||||||
|
'snowboard': {en: 'snowboard', zh: '滑雪板'},
|
||||||
|
'sports_ball': {en: 'sports_ball', zh: '运动球'},
|
||||||
|
'kite': {en: 'kite', zh: '风筝'},
|
||||||
|
'baseball_bat': {en: 'baseball_bat', zh: '棒球棒'},
|
||||||
|
'baseball_glove': {en: 'baseball_glove', zh: '棒球手套'},
|
||||||
|
'skateboard': {en: 'skateboard', zh: '滑板'},
|
||||||
|
'surfboard': {en: 'surfboard', zh: '冲浪板'},
|
||||||
|
'tennis_racket': {en: 'tennis_racket', zh: '网球拍'},
|
||||||
|
|
||||||
|
// Containers 容器
|
||||||
|
'bottle': {en: 'bottle', zh: '瓶子'},
|
||||||
|
'wine_glass': {en: 'wine_glass', zh: '酒杯'},
|
||||||
|
'cup': {en: 'cup', zh: '杯子'},
|
||||||
|
'fork': {en: 'fork', zh: '叉子'},
|
||||||
|
'knife': {en: 'knife', zh: '刀'},
|
||||||
|
'spoon': {en: 'spoon', zh: '勺子'},
|
||||||
|
'bowl': {en: 'bowl', zh: '碗'},
|
||||||
|
|
||||||
|
// Electronics 电子产品
|
||||||
|
'tv': {en: 'tv', zh: '电视'},
|
||||||
|
'laptop': {en: 'laptop', zh: '笔记本电脑'},
|
||||||
|
'mouse': {en: 'mouse', zh: '鼠标'},
|
||||||
|
'remote': {en: 'remote', zh: '遥控器'},
|
||||||
|
'keyboard': {en: 'keyboard', zh: '键盘'},
|
||||||
|
'cell_phone': {en: 'cell_phone', zh: '手机'},
|
||||||
|
'microwave': {en: 'microwave', zh: '微波炉'},
|
||||||
|
'oven': {en: 'oven', zh: '烤箱'},
|
||||||
|
'toaster': {en: 'toaster', zh: '烤面包机'},
|
||||||
|
'sink': {en: 'sink', zh: '水槽'},
|
||||||
|
'refrigerator': {en: 'refrigerator', zh: '冰箱'},
|
||||||
|
|
||||||
|
// Everyday Items 日常物品
|
||||||
|
'backpack': {en: 'backpack', zh: '背包'},
|
||||||
|
'umbrella': {en: 'umbrella', zh: '雨伞'},
|
||||||
|
'handbag': {en: 'handbag', zh: '手袋'},
|
||||||
|
'tie': {en: 'tie', zh: '领带'},
|
||||||
|
'suitcase': {en: 'suitcase', zh: '行李箱'},
|
||||||
|
'scissors': {en: 'scissors', zh: '剪刀'},
|
||||||
|
'teddy_bear': {en: 'teddy_bear', zh: '泰迪熊'},
|
||||||
|
'hair_dryer': {en: 'hair_dryer', zh: '吹风机'},
|
||||||
|
'toothbrush': {en: 'toothbrush', zh: '牙刷'},
|
||||||
|
|
||||||
|
// Household 家居用品
|
||||||
|
'book': {en: 'book', zh: '书'},
|
||||||
|
'clock': {en: 'clock', zh: '时钟'},
|
||||||
|
'vase': {en: 'vase', zh: '花瓶'},
|
||||||
|
|
||||||
|
// Animals 动物
|
||||||
|
'cat': {en: 'cat', zh: '猫'},
|
||||||
|
'dog': {en: 'dog', zh: '狗'},
|
||||||
|
'horse': {en: 'horse', zh: '马'},
|
||||||
|
'sheep': {en: 'sheep', zh: '羊'},
|
||||||
|
'cow': {en: 'cow', zh: '牛'},
|
||||||
|
'elephant': {en: 'elephant', zh: '大象'},
|
||||||
|
'bear': {en: 'bear', zh: '熊'},
|
||||||
|
'zebra': {en: 'zebra', zh: '斑马'},
|
||||||
|
'giraffe': {en: 'giraffe', zh: '长颈鹿'},
|
||||||
|
'bird': {en: 'bird', zh: '鸟'}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 创建标签到类别的映射(使用 Map 实现高效查找)
|
||||||
|
export const LABEL_TO_CATEGORY = new Map<string, { en: string, zh: string }>([
|
||||||
|
// Human 人类
|
||||||
|
['person', CATEGORIES.HUMAN],
|
||||||
|
// Vehicles 交通工具
|
||||||
|
['bicycle', CATEGORIES.VEHICLES],
|
||||||
|
['car', CATEGORIES.VEHICLES],
|
||||||
|
['motorcycle', CATEGORIES.VEHICLES],
|
||||||
|
['airplane', CATEGORIES.VEHICLES],
|
||||||
|
['bus', CATEGORIES.VEHICLES],
|
||||||
|
['train', CATEGORIES.VEHICLES],
|
||||||
|
['truck', CATEGORIES.VEHICLES],
|
||||||
|
['boat', CATEGORIES.VEHICLES],
|
||||||
|
['traffic_light', CATEGORIES.VEHICLES],
|
||||||
|
['fire_hydrant', CATEGORIES.VEHICLES],
|
||||||
|
['stop_sign', CATEGORIES.VEHICLES],
|
||||||
|
['parking_meter', CATEGORIES.VEHICLES],
|
||||||
|
|
||||||
|
// Furniture 家具
|
||||||
|
['bench', CATEGORIES.FURNITURE],
|
||||||
|
['chair', CATEGORIES.FURNITURE],
|
||||||
|
['couch', CATEGORIES.FURNITURE],
|
||||||
|
['potted_plant', CATEGORIES.FURNITURE],
|
||||||
|
['bed', CATEGORIES.FURNITURE],
|
||||||
|
['dining_table', CATEGORIES.FURNITURE],
|
||||||
|
['toilet', CATEGORIES.FURNITURE],
|
||||||
|
|
||||||
|
// Food 食物
|
||||||
|
['banana', CATEGORIES.FOOD],
|
||||||
|
['apple', CATEGORIES.FOOD],
|
||||||
|
['sandwich', CATEGORIES.FOOD],
|
||||||
|
['orange', CATEGORIES.FOOD],
|
||||||
|
['broccoli', CATEGORIES.FOOD],
|
||||||
|
['carrot', CATEGORIES.FOOD],
|
||||||
|
['hot_dog', CATEGORIES.FOOD],
|
||||||
|
['pizza', CATEGORIES.FOOD],
|
||||||
|
['donut', CATEGORIES.FOOD],
|
||||||
|
['cake', CATEGORIES.FOOD],
|
||||||
|
|
||||||
|
// Sports 运动
|
||||||
|
['frisbee', CATEGORIES.SPORTS],
|
||||||
|
['skis', CATEGORIES.SPORTS],
|
||||||
|
['snowboard', CATEGORIES.SPORTS],
|
||||||
|
['sports_ball', CATEGORIES.SPORTS],
|
||||||
|
['kite', CATEGORIES.SPORTS],
|
||||||
|
['baseball_bat', CATEGORIES.SPORTS],
|
||||||
|
['baseball_glove', CATEGORIES.SPORTS],
|
||||||
|
['skateboard', CATEGORIES.SPORTS],
|
||||||
|
['surfboard', CATEGORIES.SPORTS],
|
||||||
|
['tennis_racket', CATEGORIES.SPORTS],
|
||||||
|
|
||||||
|
// Containers 容器
|
||||||
|
['bottle', CATEGORIES.CONTAINERS],
|
||||||
|
['wine_glass', CATEGORIES.CONTAINERS],
|
||||||
|
['cup', CATEGORIES.CONTAINERS],
|
||||||
|
['fork', CATEGORIES.CONTAINERS],
|
||||||
|
['knife', CATEGORIES.CONTAINERS],
|
||||||
|
['spoon', CATEGORIES.CONTAINERS],
|
||||||
|
['bowl', CATEGORIES.CONTAINERS],
|
||||||
|
|
||||||
|
// Electronics 电子产品
|
||||||
|
['tv', CATEGORIES.ELECTRONICS],
|
||||||
|
['laptop', CATEGORIES.ELECTRONICS],
|
||||||
|
['mouse', CATEGORIES.ELECTRONICS],
|
||||||
|
['remote', CATEGORIES.ELECTRONICS],
|
||||||
|
['keyboard', CATEGORIES.ELECTRONICS],
|
||||||
|
['cell_phone', CATEGORIES.ELECTRONICS],
|
||||||
|
['microwave', CATEGORIES.ELECTRONICS],
|
||||||
|
['oven', CATEGORIES.ELECTRONICS],
|
||||||
|
['toaster', CATEGORIES.ELECTRONICS],
|
||||||
|
['sink', CATEGORIES.ELECTRONICS],
|
||||||
|
['refrigerator', CATEGORIES.ELECTRONICS],
|
||||||
|
|
||||||
|
// Everyday Items 日常物品
|
||||||
|
['backpack', CATEGORIES.EVERYDAY_ITEMS],
|
||||||
|
['umbrella', CATEGORIES.EVERYDAY_ITEMS],
|
||||||
|
['handbag', CATEGORIES.EVERYDAY_ITEMS],
|
||||||
|
['tie', CATEGORIES.EVERYDAY_ITEMS],
|
||||||
|
['suitcase', CATEGORIES.EVERYDAY_ITEMS],
|
||||||
|
['scissors', CATEGORIES.EVERYDAY_ITEMS],
|
||||||
|
['teddy_bear', CATEGORIES.EVERYDAY_ITEMS],
|
||||||
|
['hair_dryer', CATEGORIES.EVERYDAY_ITEMS],
|
||||||
|
['toothbrush', CATEGORIES.EVERYDAY_ITEMS],
|
||||||
|
|
||||||
|
// Household 家居用品
|
||||||
|
['book', CATEGORIES.HOUSEHOLD],
|
||||||
|
['clock', CATEGORIES.HOUSEHOLD],
|
||||||
|
['vase', CATEGORIES.HOUSEHOLD],
|
||||||
|
|
||||||
|
// Animals 动物
|
||||||
|
['cat', CATEGORIES.ANIMALS],
|
||||||
|
['dog', CATEGORIES.ANIMALS],
|
||||||
|
['horse', CATEGORIES.ANIMALS],
|
||||||
|
['sheep', CATEGORIES.ANIMALS],
|
||||||
|
['cow', CATEGORIES.ANIMALS],
|
||||||
|
['elephant', CATEGORIES.ANIMALS],
|
||||||
|
['bear', CATEGORIES.ANIMALS],
|
||||||
|
['zebra', CATEGORIES.ANIMALS],
|
||||||
|
['giraffe', CATEGORIES.ANIMALS],
|
||||||
|
['bird', CATEGORIES.ANIMALS]
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 获取标签所属大类的函数,支持英文和中文返回
|
||||||
|
export function getCategoryByLabel(label: string, lang: 'en' | 'zh' = 'en'): string | undefined {
|
||||||
|
const category = LABEL_TO_CATEGORY.get(label);
|
||||||
|
return category ? category[lang] : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取标签所属大类的函数,支持英文和中文返回
|
||||||
|
export function getCategoryName(label: string, lang: 'en' | 'zh' = 'en'): string | undefined {
|
||||||
|
const category = CATEGORIES[label];
|
||||||
|
return category ? category[lang] : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取标签的小分类名称
|
||||||
|
export function getLabelName(label: string, lang: 'en' | 'zh' = 'en'): string | undefined {
|
||||||
|
const labelInfo = LABELS[label];
|
||||||
|
return labelInfo ? labelInfo[lang] : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用示例
|
||||||
|
// console.log(getLabelName('person')); // 输出: 'person' (英文)
|
||||||
|
// console.log(getLabelName('person', 'zh')); // 输出: '人' (中文)
|
@@ -1,20 +1,20 @@
|
|||||||
import PhoalbumIndex from "@/views/Album/Phoalbum/Index.vue";
|
import PhoalbumPhoalbum from "@/views/Album/Phoalbum/Phoalbum.vue";
|
||||||
import PeopleAlbumIndex from "@/views/Album/PeopleAlbum/Index.vue";
|
import PeopleAlbumPeopleAlbum from "@/views/Album/PeopleAlbum/PeopleAlbum.vue";
|
||||||
import LocationAlbum from "@/views/Album/LocationAlbum/LocationAlbum.vue";
|
import LocationAlbum from "@/views/Album/LocationAlbum/LocationAlbumList.vue";
|
||||||
import LocationAlbumIndex from "@/views/Album/LocationAlbum/Index.vue";
|
import LocationAlbumIndex from "@/views/Album/LocationAlbum/LocationAlbum.vue";
|
||||||
import ThingAlbum from "@/views/Album/ThingAlbum/ThingAlbum.vue";
|
import ThingAlbum from "@/views/Album/ThingAlbum/ThingAlbumList.vue";
|
||||||
import ThingAlbumIndex from "@/views/Album/ThingAlbum/Index.vue";
|
import ThingAlbumThingAlbum from "@/views/Album/ThingAlbum/ThingAlbum.vue";
|
||||||
import Phoalbum from "@/views/Album/Phoalbum/Phoalbum.vue";
|
import Phoalbum from "@/views/Album/Phoalbum/PhoalbumList.vue";
|
||||||
import PeopleAlbum from "@/views/Album/PeopleAlbum/PeopleAlbum.vue";
|
import PeopleAlbum from "@/views/Album/PeopleAlbum/PeopleAlbumList.vue";
|
||||||
import PhoalbumDetail from "@/views/Album/Phoalbum/Detail.vue";
|
import PhoalbumDetail from "@/views/Album/Phoalbum/PhoalbumDetail.vue";
|
||||||
import PeopleAlbumDetail from "@/views/Album/PeopleAlbum/Detail.vue";
|
import PeopleAlbumDetail from "@/views/Album/PeopleAlbum/PeopleAlbumDetail.vue";
|
||||||
import LocationAlbumDetail from "@/views/Album/LocationAlbum/Detail.vue";
|
import LocationAlbumDetail from "@/views/Album/LocationAlbum/LocationAlbumDetail.vue";
|
||||||
import ThingAlbumDetail from "@/views/Album/ThingAlbum/Detail.vue";
|
import ThingAlbumDetail from "@/views/Album/ThingAlbum/ThingAlbumDetail.vue";
|
||||||
|
|
||||||
export default [
|
export default [
|
||||||
{
|
{
|
||||||
path: '/main/album/albums',
|
path: '/main/album/albums',
|
||||||
component: PhoalbumIndex,
|
component: PhoalbumPhoalbum,
|
||||||
redirect: '/main/album/albums',
|
redirect: '/main/album/albums',
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
@@ -39,7 +39,7 @@ export default [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/main/album/people',
|
path: '/main/album/people',
|
||||||
component: PeopleAlbumIndex,
|
component: PeopleAlbumPeopleAlbum,
|
||||||
redirect: '/main/album/people',
|
redirect: '/main/album/people',
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
@@ -89,7 +89,7 @@ export default [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/main/album/thing',
|
path: '/main/album/thing',
|
||||||
component: ThingAlbumIndex,
|
component: ThingAlbumThingAlbum,
|
||||||
redirect: '/main/album/thing',
|
redirect: '/main/album/thing',
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
|
@@ -1,80 +1,45 @@
|
|||||||
import {initNSFWJs, predictNSFW} from "@/utils/nsfw/nsfw.ts";
|
interface UploadPredictResult {
|
||||||
import i18n from "@/locales";
|
isAnime: boolean;
|
||||||
|
hasFace: boolean;
|
||||||
|
objectArray: string[] | unknown[];
|
||||||
|
landscape: 'building' | 'forest' | 'glacier' | 'mountain' | 'sea' | 'street' | 'none' | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
import {NSFWJS} from "nsfwjs";
|
|
||||||
import {message} from "ant-design-vue";
|
|
||||||
|
|
||||||
// import {loadCocoSsd, loadMobileNet} from "@/utils/tfjs/tfjs.ts";
|
|
||||||
import {loadModel, predictImage} from "@/utils/tfjs/anime_classifier.ts";
|
|
||||||
|
|
||||||
export const useUploadStore = defineStore(
|
export const useUploadStore = defineStore(
|
||||||
'upload',
|
'upload',
|
||||||
() => {
|
() => {
|
||||||
const openUploadDrawer = ref<boolean>(false);
|
const openUploadDrawer = ref<boolean>(false);
|
||||||
const image: HTMLImageElement = document.createElement('img');
|
|
||||||
|
const predictResult = reactive<UploadPredictResult>({
|
||||||
|
isAnime: false,
|
||||||
|
hasFace: false,
|
||||||
|
objectArray: [],
|
||||||
|
landscape: undefined as 'building' | 'forest' | 'glacier' | 'mountain' | 'sea' | 'street' | 'none' | undefined,
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 图片上传前的校验
|
* 打开上传抽屉
|
||||||
* @param file
|
|
||||||
*/
|
*/
|
||||||
async function beforeUpload(file: File) {
|
async function openUploadDrawerFn() {
|
||||||
image.src = URL.createObjectURL(file);
|
openUploadDrawer.value = true;
|
||||||
// 图片 NSFW 检测
|
|
||||||
const nsfw: NSFWJS = await initNSFWJs();
|
|
||||||
const isNSFW: boolean = await predictNSFW(nsfw, image);
|
|
||||||
if (isNSFW) {
|
|
||||||
message.error(i18n.global.t('comment.illegalImage'));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// const predictions = await loadMobileNet(image);
|
|
||||||
// console.log(predictions);
|
|
||||||
//
|
|
||||||
// const prediction = await loadCocoSsd(image);
|
|
||||||
// console.log(prediction);
|
|
||||||
|
|
||||||
const model = await loadModel('/tfjs/anime_classifier/model.json');
|
|
||||||
|
|
||||||
// 进行预测
|
|
||||||
const output = await predictImage(model, image);
|
|
||||||
console.log(output);
|
|
||||||
|
|
||||||
// console.log('Predicted Class:', predictedClass);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 自定义上传请求
|
* 清除预测结果
|
||||||
* @param file
|
|
||||||
*/
|
*/
|
||||||
async function customUploadRequest(file: any) {
|
function clearPredictResult() {
|
||||||
|
predictResult.isAnime = false;
|
||||||
const progress = {percent: 1};
|
predictResult.hasFace = false;
|
||||||
|
predictResult.objectArray = [];
|
||||||
|
predictResult.landscape = undefined;
|
||||||
const intervalId = setInterval(() => {
|
|
||||||
if (progress.percent < 100) {
|
|
||||||
progress.percent++;
|
|
||||||
file.onProgress(progress);
|
|
||||||
} else {
|
|
||||||
clearInterval(intervalId);
|
|
||||||
}
|
|
||||||
}, 100);
|
|
||||||
file.onSuccess(true);
|
|
||||||
|
|
||||||
// file.onSuccess = () => {
|
|
||||||
// message.success(i18n.global.t('comment.uploadSuccess'));
|
|
||||||
// };
|
|
||||||
// file.onError = () => {
|
|
||||||
// message.error(i18n.global.t('comment.uploadError'));
|
|
||||||
// };
|
|
||||||
// return Promise.resolve(file);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
openUploadDrawer,
|
openUploadDrawer,
|
||||||
beforeUpload,
|
predictResult,
|
||||||
customUploadRequest
|
openUploadDrawerFn,
|
||||||
|
clearPredictResult
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@@ -5,8 +5,8 @@ import i18n from "@/locales";
|
|||||||
import {NSFWJS} from "nsfwjs";
|
import {NSFWJS} from "nsfwjs";
|
||||||
import localForage from "localforage";
|
import localForage from "localforage";
|
||||||
import {message} from "ant-design-vue";
|
import {message} from "ant-design-vue";
|
||||||
import Img from "@/workers/image.ts";
|
import Img from "@/workers/upscale/image.ts";
|
||||||
import Module from "@/workers/imghelper.ts";
|
import Module from "@/workers/upscale/imghelper.ts";
|
||||||
|
|
||||||
|
|
||||||
export const useUpscaleStore = defineStore(
|
export const useUpscaleStore = defineStore(
|
||||||
|
19
src/utils/imageUtils/imageElementToUint8Array.ts
Normal file
19
src/utils/imageUtils/imageElementToUint8Array.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import * as tf from '@tensorflow/tfjs';
|
||||||
|
|
||||||
|
export async function imageToUint8Array(imageElement) {
|
||||||
|
// 创建一个 TensorFlow.js 图像张量
|
||||||
|
const tensor = tf.browser.fromPixels(imageElement, 3).toFloat();
|
||||||
|
|
||||||
|
// 获取图像的宽度和高度
|
||||||
|
const width = imageElement.width;
|
||||||
|
const height = imageElement.height;
|
||||||
|
|
||||||
|
// 将张量转为 Uint8Array(RGB 格式,值范围从 0 到 255)
|
||||||
|
const uint8Array = await tensor.data();
|
||||||
|
|
||||||
|
return {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
uint8Array
|
||||||
|
};
|
||||||
|
}
|
10
src/utils/imageUtils/imgToBase64.ts
Normal file
10
src/utils/imageUtils/imgToBase64.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
export function imageToBase64(img) {
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
canvas.width = img.width;
|
||||||
|
canvas.height = img.height;
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
if (ctx) {
|
||||||
|
ctx.drawImage(img, 0, 0);
|
||||||
|
}
|
||||||
|
return canvas.toDataURL('image/png'); // 或者 'image/jpeg'
|
||||||
|
}
|
@@ -2,21 +2,23 @@ import * as nsfwjs from "nsfwjs";
|
|||||||
import {NSFWJS} from "nsfwjs";
|
import {NSFWJS} from "nsfwjs";
|
||||||
import * as tf from "@tensorflow/tfjs";
|
import * as tf from "@tensorflow/tfjs";
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes the NSFWJS model and returns it.
|
|
||||||
*/
|
|
||||||
let isInit: boolean = false;
|
|
||||||
const initNSFWJs = async (): Promise<NSFWJS> => {
|
const initNSFWJs = async (): Promise<NSFWJS> => {
|
||||||
tf.enableProdMode();
|
let nsfwModelCache: NSFWJS | null = null; // 缓存模型实例
|
||||||
if (!isInit) {
|
// 如果模型已经加载,则直接返回缓存
|
||||||
const initialLoad: nsfwjs.NSFWJS = await nsfwjs.load("/nsfw/mobilenet_v2_mid/", {
|
try {
|
||||||
size: 224,
|
// 首先尝试从 IndexedDB 加载模型
|
||||||
type: "graph"
|
nsfwModelCache = await nsfwjs.load("indexeddb://nsfwjs-model", {size: 224, type: "graph"});
|
||||||
});
|
console.log("NSFWJS 模型成功从 IndexedDB 加载");
|
||||||
await initialLoad.model.save("indexeddb://nsfwjs-model");
|
} catch (_error) {
|
||||||
isInit = true;
|
console.warn("IndexedDB 中未找到模型,正在从网络加载...");
|
||||||
|
// 如果 IndexedDB 加载失败,从 URL 加载模型并保存到 IndexedDB
|
||||||
|
nsfwModelCache = await nsfwjs.load("/nsfw/mobilenet_v2_mid/", {size: 224, type: "graph"});
|
||||||
|
await nsfwModelCache.model.save("indexeddb://nsfwjs-model");
|
||||||
|
console.log("NSFWJS 模型已从网络加载并保存到 IndexedDB");
|
||||||
}
|
}
|
||||||
return await nsfwjs.load("indexeddb://nsfwjs-model", {size: 224, type: "graph"});
|
|
||||||
|
return nsfwModelCache;
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* Predicts the NSFW score of an image using the NSFWJS model.
|
* Predicts the NSFW score of an image using the NSFWJS model.
|
||||||
|
16
src/utils/tfjs/BBT_face_similarity.ts
Normal file
16
src/utils/tfjs/BBT_face_similarity.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import * as faceapi from '@vladmandic/face-api/dist/face-api.esm-nobundle.js';
|
||||||
|
|
||||||
|
export async function loadModel() {
|
||||||
|
const modelsPath = `/tfjs/face_api/model`;
|
||||||
|
// 面部识别模型
|
||||||
|
await faceapi.nets.faceRecognitionNet.load(modelsPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function faceSimilarity(img1: HTMLImageElement, img2: HTMLImageElement) {
|
||||||
|
const descriptor1 = await faceapi.computeFaceDescriptor(img1);
|
||||||
|
const descriptor2 = await faceapi.computeFaceDescriptor(img2);
|
||||||
|
if (descriptor1 instanceof Float32Array && descriptor2 instanceof Float32Array) {
|
||||||
|
return faceapi.euclideanDistance(descriptor1, descriptor2).toFixed(2);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
@@ -1,23 +1,68 @@
|
|||||||
import * as tf from '@tensorflow/tfjs';
|
import * as tf from '@tensorflow/tfjs';
|
||||||
|
import '@tensorflow/tfjs-backend-webgl';
|
||||||
|
|
||||||
// 封装处理图像和推理的工具函数
|
async function loadModelFromIndexedDBOrUrl(modelName: string, modelUrl: string) {
|
||||||
export async function loadModel(modelPath) {
|
let model: tf.GraphModel;
|
||||||
const model = await tf.loadGraphModel(modelPath);
|
tf.setBackend('webgl');
|
||||||
console.log('Model Loaded');
|
try {
|
||||||
|
// 尝试从 IndexedDB 加载模型
|
||||||
|
model = await tf.loadGraphModel(`indexeddb://${modelName}-model`);
|
||||||
|
console.log("模型成功从 IndexedDB 加载");
|
||||||
|
} catch (_error) {
|
||||||
|
console.log("从 URL 下载模型...");
|
||||||
|
// 如果 IndexedDB 中没有模型,则从 URL 加载并保存到 IndexedDB
|
||||||
|
model = await tf.loadGraphModel(modelUrl);
|
||||||
|
await model.save(`indexeddb://${modelName}-model`);
|
||||||
|
console.log("模型已从 URL 下载并保存到 IndexedDB");
|
||||||
|
}
|
||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 封装处理图像和推理的工具函数
|
||||||
|
export async function loadAnimeClassifierModel() {
|
||||||
|
const modelName = 'anime_classifier';
|
||||||
|
const modelUrl = '/tfjs/anime_classifier/model.json';
|
||||||
|
return await loadModelFromIndexedDBOrUrl(modelName, modelUrl);
|
||||||
|
}
|
||||||
|
|
||||||
// 处理图片并进行推理
|
// 处理图片并进行推理
|
||||||
export async function predictImage(model, imageElement) {
|
export async function animePredictImage(imageElement) {
|
||||||
|
|
||||||
|
const model: tf.GraphModel = await loadAnimeClassifierModel();
|
||||||
// 将图片转换为张量
|
// 将图片转换为张量
|
||||||
const tensor = tf.browser.fromPixels(imageElement).toFloat();
|
const tensor = tf.browser.fromPixels(imageElement, 3).toFloat();
|
||||||
const resized = tf.image.resizeBilinear(tensor, [224, 224]); // 调整图片大小为模型输入大小
|
const resized = tf.image.resizeBilinear(tensor, [224, 224]); // 调整图片大小为模型输入大小
|
||||||
const input = resized.expandDims(0); // 增加批次维度
|
const input = resized.expandDims(0); // 增加批次维度
|
||||||
|
|
||||||
// 进行推理
|
// 进行推理
|
||||||
const prediction = model.predict(input);
|
const prediction: any = model.predict(input);
|
||||||
|
|
||||||
// 获取预测结果并返回
|
// 获取预测结果并返回
|
||||||
const resultArray = await prediction.array();
|
const resultArray = await prediction.array();
|
||||||
return resultArray[0]; // 返回第一项的预测结果
|
const result = resultArray[0]; // 获取预测结果数组
|
||||||
|
return result.indexOf(1) === 0 ? 'Anime' : 'Neutral';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// export async function animePredictImage(width: number, height: number, uint8Array: Uint8Array) {
|
||||||
|
// const model: tf.GraphModel = await loadModel();
|
||||||
|
//
|
||||||
|
// // 将 Uint8Array 转换为 Tensor
|
||||||
|
// const tensor = tf.tensor3d(uint8Array, [height, width, 3], 'int32').toFloat();
|
||||||
|
//
|
||||||
|
// // 调整图片大小为模型输入大小
|
||||||
|
// const resized = tf.image.resizeBilinear(tensor, [224, 224]);
|
||||||
|
//
|
||||||
|
// // 增加批次维度
|
||||||
|
// const input = resized.expandDims(0);
|
||||||
|
//
|
||||||
|
// // 进行推理
|
||||||
|
// const prediction: any = model.predict(input);
|
||||||
|
//
|
||||||
|
// // 获取预测结果并返回
|
||||||
|
// const resultArray = await prediction.array();
|
||||||
|
// const result = resultArray[0]; // 获取预测结果数组
|
||||||
|
// return result.indexOf(1) === 0 ? 'Anime' : 'Neutral';
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
65
src/utils/tfjs/anime_classifier_pro.ts
Normal file
65
src/utils/tfjs/anime_classifier_pro.ts
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
import * as tf from '@tensorflow/tfjs';
|
||||||
|
import '@tensorflow/tfjs-backend-webgl';
|
||||||
|
|
||||||
|
async function loadModelFromIndexedDBOrUrl(modelName: string, modelUrl: string) {
|
||||||
|
let model: tf.LayersModel;
|
||||||
|
tf.setBackend('webgl');
|
||||||
|
try {
|
||||||
|
// 尝试从 IndexedDB 加载模型
|
||||||
|
model = await tf.loadLayersModel(`indexeddb://${modelName}-model`);
|
||||||
|
console.log("模型成功从 IndexedDB 加载");
|
||||||
|
} catch (_error) {
|
||||||
|
console.log("从 URL 下载模型...");
|
||||||
|
// 如果 IndexedDB 中没有模型,则从 URL 加载并保存到 IndexedDB
|
||||||
|
model = await tf.loadLayersModel(modelUrl);
|
||||||
|
await model.save(`indexeddb://${modelName}-model`);
|
||||||
|
console.log("模型已从 URL 下载并保存到 IndexedDB");
|
||||||
|
}
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 封装处理图像和推理的工具函数
|
||||||
|
export async function loadAnimeClassifierProModel() {
|
||||||
|
const modelName = 'anime_classifier2';
|
||||||
|
const modelUrl = '/tfjs/anime_classifier2/model.json';
|
||||||
|
return await loadModelFromIndexedDBOrUrl(modelName, modelUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理图片并进行推理
|
||||||
|
export async function animePredictImagePro(imageElement) {
|
||||||
|
|
||||||
|
const model: any = await loadAnimeClassifierProModel();
|
||||||
|
// 将图片转换为张量
|
||||||
|
const tensor = tf.browser.fromPixels(imageElement).toFloat();
|
||||||
|
const imageResized = tf.image.resizeBilinear(tensor, [224, 224]);
|
||||||
|
const imageReshaped = imageResized.reshape([1, 224, 224, 3]);
|
||||||
|
const imageNormalized = imageReshaped.div(255);
|
||||||
|
|
||||||
|
// 进行推理
|
||||||
|
const prediction: any = model.predict(imageNormalized);
|
||||||
|
|
||||||
|
|
||||||
|
const predictedClass = tf.argMax(prediction, 1).dataSync()[0];
|
||||||
|
// const predictedClassConfidence = await prediction.dataSync()[predictedClass].toFixed(2);
|
||||||
|
// console.log(`预测结果: ${predictedClassName}(${predictedClassConfidence})`);
|
||||||
|
return ['Anime', 'Furry', 'Neutral'][predictedClass];
|
||||||
|
}
|
||||||
|
|
||||||
|
// export async function animePredictImagePro(width: number, height: number, uint8Array: Uint8Array) {
|
||||||
|
//
|
||||||
|
// const model: any = await loadModel();
|
||||||
|
// // 将图片转换为张量
|
||||||
|
// const tensor = tf.tensor3d(uint8Array, [height, width, 3], 'int32').toFloat();
|
||||||
|
// const imageResized = tf.image.resizeBilinear(tensor, [224, 224]);
|
||||||
|
// const imageReshaped = imageResized.reshape([1, 224, 224, 3]);
|
||||||
|
// const imageNormalized = imageReshaped.div(255);
|
||||||
|
//
|
||||||
|
// // 进行推理
|
||||||
|
// const prediction: any = model.predict(imageNormalized);
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// const predictedClass = tf.argMax(prediction, 1).dataSync()[0];
|
||||||
|
// // const predictedClassConfidence = await prediction.dataSync()[predictedClass].toFixed(2);
|
||||||
|
// // console.log(`预测结果: ${predictedClassName}(${predictedClassConfidence})`);
|
||||||
|
// return ['Anime', 'Furry', 'Neutral'][predictedClass];
|
||||||
|
// }
|
42
src/utils/tfjs/face_detection.ts
Normal file
42
src/utils/tfjs/face_detection.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import '@mediapipe/face_detection';
|
||||||
|
import '@tensorflow/tfjs-core';
|
||||||
|
// Register WebGL backend.
|
||||||
|
import '@tensorflow/tfjs-backend-webgl';
|
||||||
|
import * as faceDetection from '@tensorflow-models/face-detection';
|
||||||
|
import * as faceLandmarksDetection from '@tensorflow-models/face-landmarks-detection';
|
||||||
|
import '@mediapipe/face_mesh';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测人脸
|
||||||
|
* @param image
|
||||||
|
*/
|
||||||
|
export async function detectFaces(image: HTMLImageElement) {
|
||||||
|
const model = faceDetection.SupportedModels.MediaPipeFaceDetector;
|
||||||
|
const detectorConfig: any = {
|
||||||
|
runtime: 'tfjs',
|
||||||
|
maxFaces: 1,
|
||||||
|
modelType: 'short', //'short'|'full'
|
||||||
|
};
|
||||||
|
const detector = await faceDetection.createDetector(model, detectorConfig);
|
||||||
|
const estimationConfig = {flipHorizontal: false};
|
||||||
|
const faces = await detector.estimateFaces(image, estimationConfig);
|
||||||
|
return faces;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测人脸特征点
|
||||||
|
* @param image
|
||||||
|
*/
|
||||||
|
export async function detectionFaceLandmarks(image: HTMLImageElement) {
|
||||||
|
const model = faceLandmarksDetection.SupportedModels.MediaPipeFaceMesh;
|
||||||
|
const detectorConfig: any = {
|
||||||
|
runtime: 'tfjs',
|
||||||
|
maxFaces: 1,
|
||||||
|
refineLandmarks: false,
|
||||||
|
};
|
||||||
|
const detector = await faceLandmarksDetection.createDetector(model, detectorConfig);
|
||||||
|
const estimationConfig = {flipHorizontal: false};
|
||||||
|
const faces = await detector.estimateFaces(image, estimationConfig);
|
||||||
|
return faces;
|
||||||
|
|
||||||
|
}
|
28
src/utils/tfjs/face_extraction.ts
Normal file
28
src/utils/tfjs/face_extraction.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import * as faceapi from '@vladmandic/face-api/dist/face-api.esm-nobundle.js';
|
||||||
|
import '@tensorflow/tfjs-backend-webgl';
|
||||||
|
import * as tf from '@tensorflow/tfjs';
|
||||||
|
|
||||||
|
export async function loadFaceExtractorModel() {
|
||||||
|
tf.setBackend('webgl'); // set webgl backend
|
||||||
|
// 模型文件访问路径
|
||||||
|
const modelsPath = `/tfjs/face_api/model/ssd_mobilenetv1_model-weights_manifest.json`;
|
||||||
|
// 模型参数-ssdMobilenetv1
|
||||||
|
await faceapi.nets.ssdMobilenetv1.load(modelsPath);
|
||||||
|
return new faceapi.SsdMobilenetv1Options({
|
||||||
|
minConfidence: 0.5, // 0 ~ 1
|
||||||
|
maxResults: 50, // 0 ~ 100
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function fnDetectFace(img: HTMLImageElement) {
|
||||||
|
const options = await loadFaceExtractorModel();
|
||||||
|
const detections = await faceapi.detectSingleFace(
|
||||||
|
img,
|
||||||
|
options,
|
||||||
|
);
|
||||||
|
if (!detections) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const faceImages = await faceapi.extractFaces(img, [detections]);
|
||||||
|
return faceImages[0].toDataURL('image/png');
|
||||||
|
}
|
54
src/utils/tfjs/landscape_recognition.ts
Normal file
54
src/utils/tfjs/landscape_recognition.ts
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import * as tf from '@tensorflow/tfjs';
|
||||||
|
import '@tensorflow/tfjs-backend-webgl';
|
||||||
|
|
||||||
|
export async function loadLandscapeRecognitionModel() {
|
||||||
|
const modelName = 'landscape_recognition';
|
||||||
|
const modelUrl = '/tfjs/landscape_recognition/model.json';
|
||||||
|
let model: tf.LayersModel;
|
||||||
|
tf.setBackend('webgl');
|
||||||
|
try {
|
||||||
|
// 尝试从 IndexedDB 加载模型
|
||||||
|
model = await tf.loadLayersModel(`indexeddb://${modelName}-model`);
|
||||||
|
console.log("模型成功从 IndexedDB 加载");
|
||||||
|
} catch (_error) {
|
||||||
|
console.log("从 URL 下载模型...");
|
||||||
|
// 如果 IndexedDB 中没有模型,则从 URL 加载模型
|
||||||
|
model = await tf.loadLayersModel(modelUrl);
|
||||||
|
await model.save(`indexeddb://${modelName}-model`);
|
||||||
|
console.log("模型已从 URL 下载并保存到 IndexedDB");
|
||||||
|
}
|
||||||
|
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const predictLandscape = async (imgElement) => {
|
||||||
|
if (!imgElement) return;
|
||||||
|
const model = await loadLandscapeRecognitionModel();
|
||||||
|
const img = tf.cast(tf.browser.fromPixels(imgElement), 'float32').resizeBilinear([150, 150]);
|
||||||
|
|
||||||
|
const offset = tf.scalar(127.5);
|
||||||
|
const normalized = img.sub(offset).div(offset);
|
||||||
|
const batched = normalized.reshape([1, 150, 150, 3]);
|
||||||
|
|
||||||
|
const results: any = model.predict(batched);
|
||||||
|
return getCategory(results.dataSync().indexOf(results.max().dataSync()[0]));
|
||||||
|
};
|
||||||
|
|
||||||
|
const getCategory = (index: number) => {
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
return "building";
|
||||||
|
case 1:
|
||||||
|
return "forest";
|
||||||
|
case 2:
|
||||||
|
return "glacier";
|
||||||
|
case 3:
|
||||||
|
return "mountain";
|
||||||
|
case 4:
|
||||||
|
return "sea";
|
||||||
|
case 5:
|
||||||
|
return "street";
|
||||||
|
default:
|
||||||
|
return "none";
|
||||||
|
}
|
||||||
|
};
|
@@ -1,6 +1,7 @@
|
|||||||
import * as tf from '@tensorflow/tfjs';
|
import * as tf from '@tensorflow/tfjs';
|
||||||
import * as mobilenet from '@tensorflow-models/mobilenet';
|
import * as mobilenet from '@tensorflow-models/mobilenet';
|
||||||
import * as cocoSsd from '@tensorflow-models/coco-ssd';
|
import * as cocoSsd from '@tensorflow-models/coco-ssd';
|
||||||
|
import '@tensorflow/tfjs-backend-webgl';
|
||||||
|
|
||||||
// 确保 TensorFlow.js 已准备好并设置后端
|
// 确保 TensorFlow.js 已准备好并设置后端
|
||||||
async function initializeTensorFlow(backend = "webgl") {
|
async function initializeTensorFlow(backend = "webgl") {
|
||||||
@@ -49,36 +50,43 @@ export async function loadMobileNet(image) {
|
|||||||
return await model.classify(image, 3);
|
return await model.classify(image, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 加载 COCO SSD 模型的工具函数
|
// 工具函数:加载或缓存模型
|
||||||
export async function loadCocoSsd(image) {
|
export async function loadCocoSsdModel() {
|
||||||
const modelName = "cocoSsd-model";
|
const modelName = "cocoSsd-model";
|
||||||
const modelUrl = '/tfjs/mobilenet/ssd-mobilenet-v2-tfjs-default-v1/model.json';
|
const modelUrl = '/tfjs/mobilenet/ssd-mobilenet-v2-tfjs-default-v1/model.json';
|
||||||
|
|
||||||
// 初始化 TensorFlow.js
|
|
||||||
if (!(await initializeTensorFlow())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let model;
|
let model;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 尝试从 IndexedDB 加载模型
|
// 尝试从 IndexedDB 加载模型
|
||||||
model = await cocoSsd.load({
|
model = await cocoSsd.load({
|
||||||
base: 'mobilenet_v2',
|
base: 'mobilenet_v2',
|
||||||
modelUrl: `indexeddb://${modelName}`,
|
modelUrl: `indexeddb://${modelName}`,
|
||||||
});
|
});
|
||||||
console.log("COCO SSD model loaded from IndexedDB successfully");
|
console.log(`${modelName} loaded from IndexedDB successfully`);
|
||||||
} catch (_error) {
|
} catch (_error) {
|
||||||
console.log("Downloading COCO SSD model...");
|
console.log(`Downloading ${modelName}...`);
|
||||||
// 如果 IndexedDB 中没有模型则从 URL 加载并保存到 IndexedDB
|
// 如果 IndexedDB 中没有模型则从 URL 加载并保存到 IndexedDB
|
||||||
model = await cocoSsd.load({
|
model = await cocoSsd.load({
|
||||||
base: 'mobilenet_v2',
|
base: 'mobilenet_v2',
|
||||||
modelUrl: modelUrl,
|
modelUrl: modelUrl,
|
||||||
});
|
});
|
||||||
const Model = await tf.loadGraphModel(modelUrl);
|
const graphModel = await tf.loadGraphModel(modelUrl);
|
||||||
await Model.save(`indexeddb://${modelName}`);
|
await graphModel.save(`indexeddb://${modelName}`);
|
||||||
console.log("COCO SSD model downloaded and saved to IndexedDB");
|
console.log(`${modelName} downloaded and saved to IndexedDB`);
|
||||||
}
|
}
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加载 COCO SSD 模型的工具函数
|
||||||
|
// 使用提取的加载模型工具函数
|
||||||
|
export async function cocoSsdPredict(image) {
|
||||||
|
// 初始化 TensorFlow.js
|
||||||
|
tf.setBackend('webgl');
|
||||||
|
if (!(await initializeTensorFlow())) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
// 加载模型
|
||||||
|
const model = await loadCocoSsdModel();
|
||||||
// 使用模型进行检测
|
// 使用模型进行检测
|
||||||
return await model.detect(image);
|
return await model.detect(image);
|
||||||
}
|
}
|
||||||
|
|
@@ -1,11 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<router-view></router-view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped lang="less">
|
|
||||||
|
|
||||||
</style>
|
|
@@ -1,122 +1,11 @@
|
|||||||
<template>
|
|
||||||
<div class="location-album">
|
|
||||||
<div class="location-album-header">
|
|
||||||
<AButton type="link" size="large" class="location-album-button">地点</AButton>
|
|
||||||
<span class="location-album-count">你一共在2个地点留下足迹</span>
|
|
||||||
</div>
|
|
||||||
<div class="location-album-content">
|
|
||||||
<div class="location-album-container" @click="handleClick">
|
|
||||||
<img class="background-image" src="/test/5.png" alt=""/>
|
|
||||||
<div class="overlay">
|
|
||||||
<span>乌鲁木齐市</span>
|
|
||||||
<span class="location-album-overlay-count">---</span>
|
|
||||||
<span class="location-album-overlay-count">16张照片</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
const route = useRoute();
|
|
||||||
const router = useRouter();
|
|
||||||
|
|
||||||
function handleClick() {
|
|
||||||
router.push({ path: route.path + '/1' });
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
<style scoped lang="scss">
|
|
||||||
.location-album {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.location-album-header {
|
<template>
|
||||||
width: 100%;
|
<router-view></router-view>
|
||||||
height: 50px;
|
</template>
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
gap: 10px;
|
|
||||||
border-bottom: 1px solid #e2e2e2;
|
|
||||||
|
|
||||||
.location-album-button {
|
<style scoped lang="less">
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 20px;
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
.location-album-count {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.location-album-content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: flex-start;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
overflow-y: auto;
|
|
||||||
padding-top: 20px;
|
|
||||||
gap: 20px;
|
|
||||||
|
|
||||||
.location-album-container {
|
|
||||||
width: 180px;
|
|
||||||
height: 180px;
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
|
|
||||||
.background-image {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
object-fit: cover;
|
|
||||||
}
|
|
||||||
|
|
||||||
.overlay {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
background-color: rgba(0, 0, 0, 0.2); /* 黑色半透明 */
|
|
||||||
backdrop-filter: blur(2px); /* 背景虚化 */
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
color: white;
|
|
||||||
font-size: 16px;
|
|
||||||
transition: background-color 0.3s ease, backdrop-filter 0.3s ease;
|
|
||||||
gap: 0;
|
|
||||||
|
|
||||||
.location-album-overlay-count {
|
|
||||||
font-size: 12px;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.overlay:hover {
|
|
||||||
background-color: rgba(0, 0, 0, 0.1); /* 黑色半透明 */
|
|
||||||
backdrop-filter: blur(0px); /* 背景虚化 */
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.location-album-container:hover {
|
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
122
src/views/Album/LocationAlbum/LocationAlbumList.vue
Normal file
122
src/views/Album/LocationAlbum/LocationAlbumList.vue
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
<template>
|
||||||
|
<div class="location-album">
|
||||||
|
<div class="location-album-header">
|
||||||
|
<AButton type="link" size="large" class="location-album-button">地点</AButton>
|
||||||
|
<span class="location-album-count">你一共在2个地点留下足迹</span>
|
||||||
|
</div>
|
||||||
|
<div class="location-album-content">
|
||||||
|
<div class="location-album-container" @click="handleClick">
|
||||||
|
<img class="background-image" src="/test/5.png" alt=""/>
|
||||||
|
<div class="overlay">
|
||||||
|
<span>乌鲁木齐市</span>
|
||||||
|
<span class="location-album-overlay-count">---</span>
|
||||||
|
<span class="location-album-overlay-count">16张照片</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
const route = useRoute();
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
function handleClick() {
|
||||||
|
router.push({ path: route.path + '/1' });
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.location-album {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.location-album-header {
|
||||||
|
width: 100%;
|
||||||
|
height: 50px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
gap: 10px;
|
||||||
|
border-bottom: 1px solid #e2e2e2;
|
||||||
|
|
||||||
|
.location-album-button {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 20px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.location-album-count {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.location-album-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-start;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding-top: 20px;
|
||||||
|
gap: 20px;
|
||||||
|
|
||||||
|
.location-album-container {
|
||||||
|
width: 180px;
|
||||||
|
height: 180px;
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
|
||||||
|
.background-image {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: rgba(0, 0, 0, 0.2); /* 黑色半透明 */
|
||||||
|
backdrop-filter: blur(2px); /* 背景虚化 */
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
color: white;
|
||||||
|
font-size: 16px;
|
||||||
|
transition: background-color 0.3s ease, backdrop-filter 0.3s ease;
|
||||||
|
gap: 0;
|
||||||
|
|
||||||
|
.location-album-overlay-count {
|
||||||
|
font-size: 12px;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay:hover {
|
||||||
|
background-color: rgba(0, 0, 0, 0.1); /* 黑色半透明 */
|
||||||
|
backdrop-filter: blur(0px); /* 背景虚化 */
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.location-album-container:hover {
|
||||||
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@@ -1,11 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<router-view></router-view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped lang="less">
|
|
||||||
|
|
||||||
</style>
|
|
@@ -1,170 +1,11 @@
|
|||||||
<template>
|
|
||||||
<div class="people-album">
|
|
||||||
<div class="people-album-header">
|
|
||||||
<ADropdown>
|
|
||||||
<AButton type="text" size="large" class="people-album-button">
|
|
||||||
人物
|
|
||||||
<DownOutlined class="people-album-icon"/>
|
|
||||||
</AButton>
|
|
||||||
<template #overlay>
|
|
||||||
<AMenu>
|
|
||||||
<AMenuItem>人 物</AMenuItem>
|
|
||||||
<AMenuItem>已隐藏</AMenuItem>
|
|
||||||
</AMenu>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
</ADropdown>
|
|
||||||
</div>
|
|
||||||
<div class="people-album-content">
|
|
||||||
<div class="people-album-item" @mouseover="showButton = true" @mouseleave="showButton = false">
|
|
||||||
<div class="people-album-item-avatar">
|
|
||||||
<AAvatar :size="86" shape="circle" src="/test/4.png"/>
|
|
||||||
</div>
|
|
||||||
<div class="people-album-item-name">
|
|
||||||
<AButton @click="showAddNameInput" class="people-album-add-name" v-show="showButton && !showInput" type="link"
|
|
||||||
size="small">
|
|
||||||
添加名字
|
|
||||||
</AButton>
|
|
||||||
<AInput v-show="showInput" @blur="hideAddNameInput" size="small" class="people-album-add-input">
|
|
||||||
<template #suffix>
|
|
||||||
<AButton type="link" size="small">完成</AButton>
|
|
||||||
</template>
|
|
||||||
</AInput>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="people-album-item" @mouseover="showButton = true" @mouseleave="showButton = false">
|
|
||||||
<div class="people-album-item-avatar">
|
|
||||||
<AAvatar :size="86" shape="circle" src="/test/4.png"/>
|
|
||||||
</div>
|
|
||||||
<div class="people-album-item-name">
|
|
||||||
<AButton @click="showAddNameInput" class="people-album-add-name" v-show="showButton && !showInput" type="link"
|
|
||||||
size="small">
|
|
||||||
添加名字
|
|
||||||
</AButton>
|
|
||||||
<AInput v-show="showInput" @blur="hideAddNameInput" size="small" class="people-album-add-input">
|
|
||||||
<template #suffix>
|
|
||||||
<AButton type="link" size="small">完成</AButton>
|
|
||||||
</template>
|
|
||||||
</AInput>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
const showButton = ref(false);
|
|
||||||
const showInput = ref(false);
|
|
||||||
|
|
||||||
function showAddNameInput() {
|
|
||||||
showInput.value = true;
|
|
||||||
showButton.value = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function hideAddNameInput() {
|
|
||||||
showInput.value = false;
|
|
||||||
showButton.value = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
<style scoped lang="scss">
|
|
||||||
.people-album {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.people-album-header {
|
<template>
|
||||||
width: 100%;
|
<router-view></router-view>
|
||||||
height: 50px;
|
</template>
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
gap: 10px;
|
|
||||||
border-bottom: 1px solid #e2e2e2;
|
|
||||||
|
|
||||||
.people-album-button {
|
<style scoped lang="less">
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
font-size: 20px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #333;
|
|
||||||
|
|
||||||
.people-album-icon {
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.people-album-content {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: flex-start;
|
|
||||||
padding-top: 20px;
|
|
||||||
padding-left: 20px;
|
|
||||||
gap: 20px;
|
|
||||||
|
|
||||||
.people-album-item {
|
|
||||||
width: 130px;
|
|
||||||
height: 160px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
border-radius: 10px;
|
|
||||||
transition: all 0.3s ease-in-out;
|
|
||||||
position: relative;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
.people-album-item-avatar {
|
|
||||||
width: 100%;
|
|
||||||
height: 75%;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.people-album-item-name {
|
|
||||||
width: 100%;
|
|
||||||
height: 25%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
|
|
||||||
.people-album-add-input {
|
|
||||||
width: 80%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.people-album-add-name {
|
|
||||||
color: rgba(126, 126, 135, 0.99);
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.people-album-add-name:hover {
|
|
||||||
color: #0e87cc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.people-album-item:hover {
|
|
||||||
background-color: rgba(248, 248, 248, 0.74);
|
|
||||||
opacity: 1;
|
|
||||||
transform: scale(1.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
170
src/views/Album/PeopleAlbum/PeopleAlbumList.vue
Normal file
170
src/views/Album/PeopleAlbum/PeopleAlbumList.vue
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
<template>
|
||||||
|
<div class="people-album">
|
||||||
|
<div class="people-album-header">
|
||||||
|
<ADropdown>
|
||||||
|
<AButton type="text" size="large" class="people-album-button">
|
||||||
|
人物
|
||||||
|
<DownOutlined class="people-album-icon"/>
|
||||||
|
</AButton>
|
||||||
|
<template #overlay>
|
||||||
|
<AMenu>
|
||||||
|
<AMenuItem>人 物</AMenuItem>
|
||||||
|
<AMenuItem>已隐藏</AMenuItem>
|
||||||
|
</AMenu>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</ADropdown>
|
||||||
|
</div>
|
||||||
|
<div class="people-album-content">
|
||||||
|
<div class="people-album-item" @mouseover="showButton = true" @mouseleave="showButton = false">
|
||||||
|
<div class="people-album-item-avatar">
|
||||||
|
<AAvatar :size="86" shape="circle" src="/test/4.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="people-album-item-name">
|
||||||
|
<AButton @click="showAddNameInput" class="people-album-add-name" v-show="showButton && !showInput" type="link"
|
||||||
|
size="small">
|
||||||
|
添加名字
|
||||||
|
</AButton>
|
||||||
|
<AInput v-show="showInput" @blur="hideAddNameInput" size="small" class="people-album-add-input">
|
||||||
|
<template #suffix>
|
||||||
|
<AButton type="link" size="small">完成</AButton>
|
||||||
|
</template>
|
||||||
|
</AInput>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="people-album-item" @mouseover="showButton = true" @mouseleave="showButton = false">
|
||||||
|
<div class="people-album-item-avatar">
|
||||||
|
<AAvatar :size="86" shape="circle" src="/test/4.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="people-album-item-name">
|
||||||
|
<AButton @click="showAddNameInput" class="people-album-add-name" v-show="showButton && !showInput" type="link"
|
||||||
|
size="small">
|
||||||
|
添加名字
|
||||||
|
</AButton>
|
||||||
|
<AInput v-show="showInput" @blur="hideAddNameInput" size="small" class="people-album-add-input">
|
||||||
|
<template #suffix>
|
||||||
|
<AButton type="link" size="small">完成</AButton>
|
||||||
|
</template>
|
||||||
|
</AInput>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
const showButton = ref(false);
|
||||||
|
const showInput = ref(false);
|
||||||
|
|
||||||
|
function showAddNameInput() {
|
||||||
|
showInput.value = true;
|
||||||
|
showButton.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideAddNameInput() {
|
||||||
|
showInput.value = false;
|
||||||
|
showButton.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.people-album {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.people-album-header {
|
||||||
|
width: 100%;
|
||||||
|
height: 50px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
gap: 10px;
|
||||||
|
border-bottom: 1px solid #e2e2e2;
|
||||||
|
|
||||||
|
.people-album-button {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
|
||||||
|
.people-album-icon {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.people-album-content {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-start;
|
||||||
|
padding-top: 20px;
|
||||||
|
padding-left: 20px;
|
||||||
|
gap: 20px;
|
||||||
|
|
||||||
|
.people-album-item {
|
||||||
|
width: 130px;
|
||||||
|
height: 160px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 10px;
|
||||||
|
transition: all 0.3s ease-in-out;
|
||||||
|
position: relative;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
.people-album-item-avatar {
|
||||||
|
width: 100%;
|
||||||
|
height: 75%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.people-album-item-name {
|
||||||
|
width: 100%;
|
||||||
|
height: 25%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
|
||||||
|
.people-album-add-input {
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.people-album-add-name {
|
||||||
|
color: rgba(126, 126, 135, 0.99);
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.people-album-add-name:hover {
|
||||||
|
color: #0e87cc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.people-album-item:hover {
|
||||||
|
background-color: rgba(248, 248, 248, 0.74);
|
||||||
|
opacity: 1;
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@@ -1,9 +0,0 @@
|
|||||||
<template>
|
|
||||||
<router-view></router-view>
|
|
||||||
</template>
|
|
||||||
<script setup lang="ts">
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<style scoped lang="less">
|
|
||||||
|
|
||||||
</style>
|
|
@@ -1,180 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="phoalbum">
|
<router-view></router-view>
|
||||||
<div class="phoalbum-header">
|
|
||||||
<AButton type="primary" shape="round" size="middle">
|
|
||||||
<template #icon>
|
|
||||||
<PlusSquareOutlined/>
|
|
||||||
</template>
|
|
||||||
创建相册
|
|
||||||
</AButton>
|
|
||||||
<ADropdown>
|
|
||||||
<AButton type="default" shape="round" size="middle">
|
|
||||||
<template #icon>
|
|
||||||
<OrderedListOutlined/>
|
|
||||||
</template>
|
|
||||||
排序
|
|
||||||
</AButton>
|
|
||||||
<template #overlay>
|
|
||||||
<AMenu>
|
|
||||||
<AMenuItem key="1">按时间排序</AMenuItem>
|
|
||||||
<AMenuItem key="2">按名称排序</AMenuItem>
|
|
||||||
</AMenu>
|
|
||||||
</template>
|
|
||||||
</ADropdown>
|
|
||||||
<AInput class="phoalbum-search" placeholder="搜索相册">
|
|
||||||
<template #suffix>
|
|
||||||
<AButton size="small" type="text" shape="circle" @click.prevent>
|
|
||||||
<template #icon>
|
|
||||||
<SearchOutlined/>
|
|
||||||
</template>
|
|
||||||
</AButton>
|
|
||||||
</template>
|
|
||||||
</AInput>
|
|
||||||
</div>
|
|
||||||
<div class="phoalbum-content">
|
|
||||||
<ATabs size="small" :tabBarGutter="50" type="line" tabPosition="top" :tabBarStyle="{position:'unset'}"
|
|
||||||
style="width: 100%;">
|
|
||||||
<template #rightExtra>
|
|
||||||
<span style="color: #999; font-size: 12px;">已全部加载,共 0 个相册</span>
|
|
||||||
</template>
|
|
||||||
<ATabPane key="1" tab="全部相册">
|
|
||||||
<div class="phoalbum-item-container">
|
|
||||||
<div class="phoalbum-item" @mouseover="isHovered = true" @mouseleave="isHovered = false">
|
|
||||||
<PhotoStack :src="'/test/1.png'" default-src=""/>
|
|
||||||
<div class="phoalbum-item-info">
|
|
||||||
<span class="phoalbum-item-name">我的相册</span>
|
|
||||||
<span class="phoalbum-item-date">2022-01-01</span>
|
|
||||||
</div>
|
|
||||||
<div class="phoalbum-item-operation" :class="{ 'fade-in': isHovered, 'fade-out': !isHovered }">
|
|
||||||
<ADropdown trigger="click">
|
|
||||||
<AButton type="text" shape="circle" size="small">
|
|
||||||
<template #icon>
|
|
||||||
<AAvatar shape="circle" size="small" :src="more"/>
|
|
||||||
</template>
|
|
||||||
</AButton>
|
|
||||||
<template #overlay>
|
|
||||||
<AMenu>
|
|
||||||
<AMenuItem key="1">重命名相册</AMenuItem>
|
|
||||||
<AMenuItem key="2">分享相册</AMenuItem>
|
|
||||||
<AMenuItem key="3">删除相册</AMenuItem>
|
|
||||||
<AMenuItem key="4">下载相册</AMenuItem>
|
|
||||||
</AMenu>
|
|
||||||
</template>
|
|
||||||
</ADropdown>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</ATabPane>
|
|
||||||
<ATabPane key="2" tab="我的相册">
|
|
||||||
|
|
||||||
</ATabPane>
|
|
||||||
<ATabPane key="3" tab="收藏相册">
|
|
||||||
</ATabPane>
|
|
||||||
</ATabs>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import more from "@/assets/svgs/more.svg";
|
|
||||||
|
|
||||||
const isHovered = ref<boolean>(false);
|
|
||||||
</script>
|
</script>
|
||||||
<style scoped lang="scss">
|
<style scoped lang="less">
|
||||||
.phoalbum {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.phoalbum-header {
|
|
||||||
width: 100%;
|
|
||||||
height: 50px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
gap: 10px;
|
|
||||||
border-bottom: 1px solid #e2e2e2;
|
|
||||||
|
|
||||||
.phoalbum-search {
|
|
||||||
width: 300px;
|
|
||||||
border-radius: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.phoalbum-content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: flex-start;
|
|
||||||
justify-content: flex-start;
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100% - 65px);
|
|
||||||
|
|
||||||
.phoalbum-item-container {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: flex-start;
|
|
||||||
justify-content: flex-start;
|
|
||||||
gap: 20px;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
overflow-y: auto;
|
|
||||||
|
|
||||||
.phoalbum-item {
|
|
||||||
width: 200px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: flex-start;
|
|
||||||
justify-content: flex-start;
|
|
||||||
gap: 15px;
|
|
||||||
padding: 10px;
|
|
||||||
position: relative;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
.phoalbum-item-info {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: flex-start;
|
|
||||||
|
|
||||||
.phoalbum-item-name {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
.phoalbum-item-date {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.phoalbum-item-operation {
|
|
||||||
position: absolute;
|
|
||||||
top: 20px;
|
|
||||||
right: 20px;
|
|
||||||
z-index: 10;
|
|
||||||
opacity: 0;
|
|
||||||
transform: scale(0);
|
|
||||||
transition: opacity 0.3s ease, transform 0.3s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fade-in {
|
|
||||||
opacity: 1; /* 显示时透明度为1 */
|
|
||||||
transform: scale(1); /* 显示时缩放为1 */
|
|
||||||
z-index: 10; /* 显示时z-index为10 */
|
|
||||||
}
|
|
||||||
|
|
||||||
.fade-out {
|
|
||||||
opacity: 0; /* 隐藏时透明度为0 */
|
|
||||||
transform: scale(0); /* 隐藏时缩放为0 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
180
src/views/Album/Phoalbum/PhoalbumList.vue
Normal file
180
src/views/Album/Phoalbum/PhoalbumList.vue
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
<template>
|
||||||
|
<div class="phoalbum">
|
||||||
|
<div class="phoalbum-header">
|
||||||
|
<AButton type="primary" shape="round" size="middle">
|
||||||
|
<template #icon>
|
||||||
|
<PlusSquareOutlined/>
|
||||||
|
</template>
|
||||||
|
创建相册
|
||||||
|
</AButton>
|
||||||
|
<ADropdown>
|
||||||
|
<AButton type="default" shape="round" size="middle">
|
||||||
|
<template #icon>
|
||||||
|
<OrderedListOutlined/>
|
||||||
|
</template>
|
||||||
|
排序
|
||||||
|
</AButton>
|
||||||
|
<template #overlay>
|
||||||
|
<AMenu>
|
||||||
|
<AMenuItem key="1">按时间排序</AMenuItem>
|
||||||
|
<AMenuItem key="2">按名称排序</AMenuItem>
|
||||||
|
</AMenu>
|
||||||
|
</template>
|
||||||
|
</ADropdown>
|
||||||
|
<AInput class="phoalbum-search" placeholder="搜索相册">
|
||||||
|
<template #suffix>
|
||||||
|
<AButton size="small" type="text" shape="circle" @click.prevent>
|
||||||
|
<template #icon>
|
||||||
|
<SearchOutlined/>
|
||||||
|
</template>
|
||||||
|
</AButton>
|
||||||
|
</template>
|
||||||
|
</AInput>
|
||||||
|
</div>
|
||||||
|
<div class="phoalbum-content">
|
||||||
|
<ATabs size="small" :tabBarGutter="50" type="line" tabPosition="top" :tabBarStyle="{position:'unset'}"
|
||||||
|
style="width: 100%;">
|
||||||
|
<template #rightExtra>
|
||||||
|
<span style="color: #999; font-size: 12px;">已全部加载,共 0 个相册</span>
|
||||||
|
</template>
|
||||||
|
<ATabPane key="1" tab="全部相册">
|
||||||
|
<div class="phoalbum-item-container">
|
||||||
|
<div class="phoalbum-item" @mouseover="isHovered = true" @mouseleave="isHovered = false">
|
||||||
|
<PhotoStack :src="'/test/1.png'" default-src=""/>
|
||||||
|
<div class="phoalbum-item-info">
|
||||||
|
<span class="phoalbum-item-name">我的相册</span>
|
||||||
|
<span class="phoalbum-item-date">2022-01-01</span>
|
||||||
|
</div>
|
||||||
|
<div class="phoalbum-item-operation" :class="{ 'fade-in': isHovered, 'fade-out': !isHovered }">
|
||||||
|
<ADropdown trigger="click">
|
||||||
|
<AButton type="text" shape="circle" size="small">
|
||||||
|
<template #icon>
|
||||||
|
<AAvatar shape="circle" size="small" :src="more"/>
|
||||||
|
</template>
|
||||||
|
</AButton>
|
||||||
|
<template #overlay>
|
||||||
|
<AMenu>
|
||||||
|
<AMenuItem key="1">重命名相册</AMenuItem>
|
||||||
|
<AMenuItem key="2">分享相册</AMenuItem>
|
||||||
|
<AMenuItem key="3">删除相册</AMenuItem>
|
||||||
|
<AMenuItem key="4">下载相册</AMenuItem>
|
||||||
|
</AMenu>
|
||||||
|
</template>
|
||||||
|
</ADropdown>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ATabPane>
|
||||||
|
<ATabPane key="2" tab="我的相册">
|
||||||
|
|
||||||
|
</ATabPane>
|
||||||
|
<ATabPane key="3" tab="收藏相册">
|
||||||
|
</ATabPane>
|
||||||
|
</ATabs>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import more from "@/assets/svgs/more.svg";
|
||||||
|
|
||||||
|
const isHovered = ref<boolean>(false);
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.phoalbum {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.phoalbum-header {
|
||||||
|
width: 100%;
|
||||||
|
height: 50px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
gap: 10px;
|
||||||
|
border-bottom: 1px solid #e2e2e2;
|
||||||
|
|
||||||
|
.phoalbum-search {
|
||||||
|
width: 300px;
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.phoalbum-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
justify-content: flex-start;
|
||||||
|
width: 100%;
|
||||||
|
height: calc(100% - 65px);
|
||||||
|
|
||||||
|
.phoalbum-item-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: flex-start;
|
||||||
|
justify-content: flex-start;
|
||||||
|
gap: 20px;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
.phoalbum-item {
|
||||||
|
width: 200px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
justify-content: flex-start;
|
||||||
|
gap: 15px;
|
||||||
|
padding: 10px;
|
||||||
|
position: relative;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
.phoalbum-item-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-start;
|
||||||
|
|
||||||
|
.phoalbum-item-name {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phoalbum-item-date {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.phoalbum-item-operation {
|
||||||
|
position: absolute;
|
||||||
|
top: 20px;
|
||||||
|
right: 20px;
|
||||||
|
z-index: 10;
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(0);
|
||||||
|
transition: opacity 0.3s ease, transform 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-in {
|
||||||
|
opacity: 1; /* 显示时透明度为1 */
|
||||||
|
transform: scale(1); /* 显示时缩放为1 */
|
||||||
|
z-index: 10; /* 显示时z-index为10 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-out {
|
||||||
|
opacity: 0; /* 隐藏时透明度为0 */
|
||||||
|
transform: scale(0); /* 隐藏时缩放为0 */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@@ -1,11 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<router-view></router-view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped lang="less">
|
|
||||||
|
|
||||||
</style>
|
|
@@ -1,120 +1,11 @@
|
|||||||
<template>
|
|
||||||
<div class="thing-album">
|
|
||||||
<div class="thing-album-header">
|
|
||||||
|
|
||||||
<AButton type="link" size="large" class="thing-album-button">事物</AButton>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="thing-album-content">
|
|
||||||
<span class="thing-album-title">动物</span>
|
|
||||||
<div class="thing-album-container">
|
|
||||||
<img class="background-image" src="/test/7.png" alt=""/>
|
|
||||||
<div class="overlay">
|
|
||||||
<span>猫</span>
|
|
||||||
<span class="thing-album-overlay-count">---</span>
|
|
||||||
<span class="thing-album-overlay-count">16张照片</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
<style scoped lang="scss">
|
|
||||||
.thing-album {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.thing-album-header {
|
<template>
|
||||||
width: 100%;
|
<router-view></router-view>
|
||||||
height: 50px;
|
</template>
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
gap: 10px;
|
|
||||||
border-bottom: 1px solid #e2e2e2;
|
|
||||||
|
|
||||||
.thing-album-button {
|
<style scoped lang="less">
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
font-size: 20px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.thing-album-content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: flex-start;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
overflow-y: auto;
|
|
||||||
padding-top: 20px;
|
|
||||||
padding-left: 25px;
|
|
||||||
gap: 20px;
|
|
||||||
|
|
||||||
.thing-album-title {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.thing-album-container {
|
|
||||||
width: 180px;
|
|
||||||
height: 180px;
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
|
|
||||||
.background-image {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
object-fit: cover;
|
|
||||||
}
|
|
||||||
|
|
||||||
.overlay {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
background-color: rgba(0, 0, 0, 0.2); /* 黑色半透明 */
|
|
||||||
backdrop-filter: blur(2px); /* 背景虚化 */
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
color: white;
|
|
||||||
font-size: 16px;
|
|
||||||
transition: background-color 0.3s ease, backdrop-filter 0.3s ease;
|
|
||||||
gap: 0;
|
|
||||||
|
|
||||||
.thing-album-overlay-count {
|
|
||||||
font-size: 12px;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.overlay:hover {
|
|
||||||
background-color: rgba(0, 0, 0, 0.1); /* 黑色半透明 */
|
|
||||||
backdrop-filter: blur(0px); /* 背景虚化 */
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.thing-album-container:hover {
|
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
120
src/views/Album/ThingAlbum/ThingAlbumList.vue
Normal file
120
src/views/Album/ThingAlbum/ThingAlbumList.vue
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<template>
|
||||||
|
<div class="thing-album">
|
||||||
|
<div class="thing-album-header">
|
||||||
|
|
||||||
|
<AButton type="link" size="large" class="thing-album-button">事物</AButton>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="thing-album-content">
|
||||||
|
<span class="thing-album-title">动物</span>
|
||||||
|
<div class="thing-album-container">
|
||||||
|
<img class="background-image" src="/test/7.png" alt=""/>
|
||||||
|
<div class="overlay">
|
||||||
|
<span>猫</span>
|
||||||
|
<span class="thing-album-overlay-count">---</span>
|
||||||
|
<span class="thing-album-overlay-count">16张照片</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.thing-album {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.thing-album-header {
|
||||||
|
width: 100%;
|
||||||
|
height: 50px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
gap: 10px;
|
||||||
|
border-bottom: 1px solid #e2e2e2;
|
||||||
|
|
||||||
|
.thing-album-button {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.thing-album-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-start;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding-top: 20px;
|
||||||
|
padding-left: 25px;
|
||||||
|
gap: 20px;
|
||||||
|
|
||||||
|
.thing-album-title {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thing-album-container {
|
||||||
|
width: 180px;
|
||||||
|
height: 180px;
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
|
||||||
|
.background-image {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: rgba(0, 0, 0, 0.2); /* 黑色半透明 */
|
||||||
|
backdrop-filter: blur(2px); /* 背景虚化 */
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
color: white;
|
||||||
|
font-size: 16px;
|
||||||
|
transition: background-color 0.3s ease, backdrop-filter 0.3s ease;
|
||||||
|
gap: 0;
|
||||||
|
|
||||||
|
.thing-album-overlay-count {
|
||||||
|
font-size: 12px;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay:hover {
|
||||||
|
background-color: rgba(0, 0, 0, 0.1); /* 黑色半透明 */
|
||||||
|
backdrop-filter: blur(0px); /* 背景虚化 */
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.thing-album-container:hover {
|
||||||
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="all-photo">
|
<div class="all-photo">
|
||||||
<div class="photo-header">
|
<div class="photo-header">
|
||||||
<AButton type="primary" shape="round" size="middle" @click="upload.openUploadDrawer = true">
|
<AButton type="primary" shape="round" size="middle" @click="upload.openUploadDrawerFn()">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<PlusOutlined/>
|
<PlusOutlined/>
|
||||||
</template>
|
</template>
|
||||||
@@ -115,7 +115,7 @@
|
|||||||
</ATabPane>
|
</ATabPane>
|
||||||
</ATabs>
|
</ATabs>
|
||||||
</div>
|
</div>
|
||||||
<Upload/>
|
<ImageUpload/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@ import {Waterfall} from 'vue-waterfall-plugin-next';
|
|||||||
import 'vue-waterfall-plugin-next/dist/style.css';
|
import 'vue-waterfall-plugin-next/dist/style.css';
|
||||||
import loading from '@/assets/gif/loading.gif';
|
import loading from '@/assets/gif/loading.gif';
|
||||||
import error from '@/assets/svgs/no-image.svg';
|
import error from '@/assets/svgs/no-image.svg';
|
||||||
import Upload from "@/views/Photograph/Upload/Upload.vue";
|
import ImageUpload from "@/views/Photograph/ImageUpload/ImageUpload.vue";
|
||||||
import useStore from "@/store";
|
import useStore from "@/store";
|
||||||
|
|
||||||
const selected = ref<(string | number)[]>([]);
|
const selected = ref<(string | number)[]>([]);
|
||||||
|
201
src/views/Photograph/ImageUpload/ImageUpload.vue
Normal file
201
src/views/Photograph/ImageUpload/ImageUpload.vue
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
<template>
|
||||||
|
<ADrawer v-model:open="upload.openUploadDrawer" width="40%" placement="right" title="上传照片">
|
||||||
|
<template #extra>
|
||||||
|
<AFlex :vertical="false" justify="center" align="center" gap="large">
|
||||||
|
<ASelect size="middle" style="width: 150px">
|
||||||
|
|
||||||
|
</ASelect>
|
||||||
|
<ASelect size="middle" style="width: 150px">
|
||||||
|
|
||||||
|
</ASelect>
|
||||||
|
</AFlex>
|
||||||
|
</template>
|
||||||
|
<div class="upload-container">
|
||||||
|
<Spin :spinning="predicting" indicator="magic-ring">
|
||||||
|
<AUploadDragger
|
||||||
|
v-model:fileList="fileList"
|
||||||
|
accept="image/*"
|
||||||
|
name="file"
|
||||||
|
:directory="false"
|
||||||
|
:multiple="true"
|
||||||
|
method="post"
|
||||||
|
:beforeUpload="beforeUpload"
|
||||||
|
:customRequest="customUploadRequest"
|
||||||
|
:progress="progress"
|
||||||
|
:maxCount="10"
|
||||||
|
list-type="picture"
|
||||||
|
>
|
||||||
|
<p class="ant-upload-drag-icon">
|
||||||
|
<inbox-outlined></inbox-outlined>
|
||||||
|
</p>
|
||||||
|
<p class="ant-upload-text">单击或拖动文件到此区域以上传</p>
|
||||||
|
<p class="ant-upload-hint">
|
||||||
|
支持单次或批量上传,严禁上传非法图片,违者将受到法律惩戒。
|
||||||
|
</p>
|
||||||
|
</AUploadDragger>
|
||||||
|
</Spin>
|
||||||
|
</div>
|
||||||
|
<template #footer>
|
||||||
|
<AFlex :vertical="false" justify="end" align="center" gap="large">
|
||||||
|
<AButton type="default" size="middle" style="width: 100px">取消</AButton>
|
||||||
|
<AButton type="primary" size="middle" style="width: 100px">上传</AButton>
|
||||||
|
</AFlex>
|
||||||
|
</template>
|
||||||
|
</ADrawer>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import useStore from "@/store";
|
||||||
|
import {InboxOutlined} from '@ant-design/icons-vue';
|
||||||
|
import type {UploadProps} from 'ant-design-vue';
|
||||||
|
import {message} from "ant-design-vue";
|
||||||
|
import {initNSFWJs, predictNSFW} from "@/utils/nsfw/nsfw.ts";
|
||||||
|
import i18n from "@/locales";
|
||||||
|
|
||||||
|
import {NSFWJS} from "nsfwjs";
|
||||||
|
import {animePredictImage} from "@/utils/tfjs/anime_classifier.ts";
|
||||||
|
import {animePredictImagePro} from "@/utils/tfjs/anime_classifier_pro.ts";
|
||||||
|
import {fnDetectFace} from "@/utils/tfjs/face_extraction.ts";
|
||||||
|
import {cocoSsdPredict} from "@/utils/tfjs/mobilenet.ts";
|
||||||
|
import {predictLandscape} from "@/utils/tfjs/landscape_recognition.ts";
|
||||||
|
import Spin from "@/components/MyUI/Spin/Spin.vue";
|
||||||
|
|
||||||
|
const predicting = ref<boolean>(false);
|
||||||
|
|
||||||
|
|
||||||
|
const upload = useStore().upload;
|
||||||
|
const image: HTMLImageElement = document.createElement('img');
|
||||||
|
|
||||||
|
const fileList = ref([]);
|
||||||
|
|
||||||
|
const progress: UploadProps['progress'] = {
|
||||||
|
strokeColor: {
|
||||||
|
'0%': '#108ee9',
|
||||||
|
'100%': '#87d068',
|
||||||
|
},
|
||||||
|
strokeWidth: 3,
|
||||||
|
format: (percent: any) => `${parseFloat(percent.toFixed(2))}%`,
|
||||||
|
class: 'progress-bar',
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片上传前的校验
|
||||||
|
* @param file
|
||||||
|
*/
|
||||||
|
async function beforeUpload(file: File) {
|
||||||
|
predicting.value = true;
|
||||||
|
image.src = URL.createObjectURL(file);
|
||||||
|
// 图片 NSFW 检测
|
||||||
|
const nsfw: NSFWJS = await initNSFWJs();
|
||||||
|
const isNSFW: boolean = await predictNSFW(nsfw, image);
|
||||||
|
if (isNSFW) {
|
||||||
|
message.error(i18n.global.t('comment.illegalImage'));
|
||||||
|
predicting.value = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
predicting.value = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义上传请求
|
||||||
|
* @param file
|
||||||
|
*/
|
||||||
|
async function customUploadRequest(file: any) {
|
||||||
|
upload.clearPredictResult();
|
||||||
|
let percent = 1; // 初始化进度
|
||||||
|
const totalSteps = 5; // 总任务数,用于计算进度百分比
|
||||||
|
|
||||||
|
// 更新进度条函数
|
||||||
|
const updateProgress = (completedSteps: number) => {
|
||||||
|
const targetPercent = Math.min((completedSteps / totalSteps) * 100, 100); // 目标进度
|
||||||
|
if (percent < targetPercent) {
|
||||||
|
// 每次进度更新时,增加一个小增量
|
||||||
|
const increment = Math.min(1, targetPercent - percent); // 每次增量
|
||||||
|
percent += increment;
|
||||||
|
|
||||||
|
// 更新进度条
|
||||||
|
file.onProgress({percent});
|
||||||
|
|
||||||
|
// 控制进度条更新的速度
|
||||||
|
if (percent < targetPercent) {
|
||||||
|
setTimeout(() => updateProgress(completedSteps), 50); // 每50ms更新一次
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let completedSteps = 0; // 已完成的步骤计数
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Step 1: 动漫预测
|
||||||
|
const prediction1 = await animePredictImage(image);
|
||||||
|
completedSteps++;
|
||||||
|
updateProgress(completedSteps);
|
||||||
|
|
||||||
|
const prediction2 = await animePredictImagePro(image);
|
||||||
|
completedSteps++;
|
||||||
|
updateProgress(completedSteps);
|
||||||
|
|
||||||
|
if (prediction1 === 'Anime' && (prediction2 === 'Furry' || prediction2 === 'Anime')) {
|
||||||
|
upload.predictResult.isAnime = true;
|
||||||
|
|
||||||
|
// 任务提前完成,直接设置进度为 100%
|
||||||
|
percent = 100;
|
||||||
|
file.onProgress({percent});
|
||||||
|
setTimeout(() => {
|
||||||
|
file.onSuccess();
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 2: 人脸检测
|
||||||
|
const faceImageData = await fnDetectFace(image);
|
||||||
|
completedSteps++;
|
||||||
|
updateProgress(completedSteps);
|
||||||
|
|
||||||
|
if (faceImageData) {
|
||||||
|
upload.predictResult.hasFace = true;
|
||||||
|
|
||||||
|
// 任务提前完成,直接设置进度为 100%
|
||||||
|
percent = 100;
|
||||||
|
file.onProgress({percent});
|
||||||
|
setTimeout(() => {
|
||||||
|
file.onSuccess();
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 3: 目标识别
|
||||||
|
const cocoResults = await cocoSsdPredict(image);
|
||||||
|
completedSteps++;
|
||||||
|
updateProgress(completedSteps);
|
||||||
|
|
||||||
|
if (cocoResults.length > 0) {
|
||||||
|
const classSet = new Set(cocoResults.map(result => result.class));
|
||||||
|
upload.predictResult.objectArray = Array.from(classSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 4: 风景识别
|
||||||
|
upload.predictResult.landscape = await predictLandscape(image);
|
||||||
|
completedSteps++;
|
||||||
|
updateProgress(completedSteps);
|
||||||
|
|
||||||
|
// 任务完成,确保进度条到达 100%
|
||||||
|
percent = 100;
|
||||||
|
file.onProgress({percent});
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
file.onSuccess();
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
// 出现错误,直接设置进度为 100%,并调用错误回调
|
||||||
|
percent = 100;
|
||||||
|
file.onProgress({percent});
|
||||||
|
file.onError(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<style scoped lang="less">
|
||||||
|
|
||||||
|
</style>
|
@@ -1,74 +0,0 @@
|
|||||||
<template>
|
|
||||||
<ADrawer v-model:open="upload.openUploadDrawer" width="40%" placement="right" title="上传照片">
|
|
||||||
<template #extra>
|
|
||||||
<AFlex :vertical="false" justify="center" align="center" gap="large">
|
|
||||||
<ASelect size="middle" style="width: 150px">
|
|
||||||
|
|
||||||
</ASelect>
|
|
||||||
<ASelect size="middle" style="width: 150px">
|
|
||||||
|
|
||||||
</ASelect>
|
|
||||||
</AFlex>
|
|
||||||
</template>
|
|
||||||
<div>
|
|
||||||
<AUploadDragger
|
|
||||||
v-model:fileList="fileList"
|
|
||||||
accept="image/*"
|
|
||||||
name="file"
|
|
||||||
:directory="false"
|
|
||||||
:multiple="true"
|
|
||||||
@drop="handleDrop"
|
|
||||||
:beforeUpload="upload.beforeUpload"
|
|
||||||
:customRequest="upload.customUploadRequest"
|
|
||||||
:progress="progress"
|
|
||||||
>
|
|
||||||
<p class="ant-upload-drag-icon">
|
|
||||||
<inbox-outlined></inbox-outlined>
|
|
||||||
</p>
|
|
||||||
<p class="ant-upload-text">Click or drag file to this area to upload</p>
|
|
||||||
<p class="ant-upload-hint">
|
|
||||||
Support for a single or bulk upload. Strictly prohibit from uploading company data or other
|
|
||||||
band files
|
|
||||||
</p>
|
|
||||||
</AUploadDragger>
|
|
||||||
</div>
|
|
||||||
</ADrawer>
|
|
||||||
</template>
|
|
||||||
<script setup lang="ts">
|
|
||||||
import useStore from "@/store";
|
|
||||||
import {InboxOutlined} from '@ant-design/icons-vue';
|
|
||||||
import type {UploadProps} from 'ant-design-vue';
|
|
||||||
|
|
||||||
const upload = useStore().upload;
|
|
||||||
|
|
||||||
|
|
||||||
const fileList = ref([]);
|
|
||||||
// const handleChange = (info: UploadChangeParam) => {
|
|
||||||
// const status = info.file.status;
|
|
||||||
// if (status !== 'uploading') {
|
|
||||||
// console.log(info.file, info.fileList);
|
|
||||||
// }
|
|
||||||
// if (status === 'done') {
|
|
||||||
// message.success(`${info.file.name} file uploaded successfully.`);
|
|
||||||
// } else if (status === 'error') {
|
|
||||||
// message.error(`${info.file.name} file upload failed.`);
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
|
|
||||||
function handleDrop(e: DragEvent) {
|
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
const progress: UploadProps['progress'] = {
|
|
||||||
strokeColor: {
|
|
||||||
'0%': '#108ee9',
|
|
||||||
'100%': '#87d068',
|
|
||||||
},
|
|
||||||
strokeWidth: 3,
|
|
||||||
format: (percent: any) => `${parseFloat(percent.toFixed(2))}%`,
|
|
||||||
class: 'progress-bar',
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<style scoped lang="less">
|
|
||||||
|
|
||||||
</style>
|
|
@@ -64,7 +64,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
|
||||||
import {message} from "ant-design-vue";
|
import {message} from "ant-design-vue";
|
||||||
import Img from "@/workers/image.ts";
|
import Img from "@/workers/upscale/image.ts";
|
||||||
import useStore from "@/store";
|
import useStore from "@/store";
|
||||||
import run from '@/assets/svgs/run.svg';
|
import run from '@/assets/svgs/run.svg';
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ async function startTask() {
|
|||||||
if (upscale.input === null) return;
|
if (upscale.input === null) return;
|
||||||
upscale.isProcessing = true;
|
upscale.isProcessing = true;
|
||||||
const start = Date.now();
|
const start = Date.now();
|
||||||
const worker = new Worker(new URL("@/workers/upscale.worker.ts", import.meta.url), {
|
const worker = new Worker(new URL("@/workers/upscale/upscale.worker.ts", import.meta.url), {
|
||||||
type: "module",
|
type: "module",
|
||||||
});
|
});
|
||||||
worker.onmessage = (e: MessageEvent<any>) => {
|
worker.onmessage = (e: MessageEvent<any>) => {
|
||||||
|
11
src/workers/tfjs/tfjs.worker.ts
Normal file
11
src/workers/tfjs/tfjs.worker.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
self.onmessage = async function (_e: MessageEvent): Promise<void> {
|
||||||
|
// const {data} = e;
|
||||||
|
// const {width, height, uint8Array} = data;
|
||||||
|
|
||||||
|
// const prediction1 = await animePredictImage(width, height, uint8Array);
|
||||||
|
// const prediction2 = await animePredictImagePro(width, height, uint8Array);
|
||||||
|
// if (prediction1 === 'Anime' && (prediction2 === 'Furry' || prediction2 === 'Anime')) {
|
||||||
|
// self.postMessage({isAnime: true});
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
};
|
@@ -1,3 +1,4 @@
|
|||||||
|
/* @vite-ignore */
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
// @ts-nocheck
|
// @ts-nocheck
|
||||||
// This file is a modified version of the original imghelper.ts file from Emscripten.
|
// This file is a modified version of the original imghelper.ts file from Emscripten.
|
@@ -1,5 +1,5 @@
|
|||||||
import * as tf from "@tensorflow/tfjs";
|
import * as tf from "@tensorflow/tfjs";
|
||||||
import Image from "./image";
|
import Image from "./image.ts";
|
||||||
|
|
||||||
export default async function upscale(
|
export default async function upscale(
|
||||||
image: Image,
|
image: Image,
|
Reference in New Issue
Block a user