complete model integration

This commit is contained in:
2025-01-13 19:30:29 +08:00
parent fed52e66f9
commit 9356c00815
66 changed files with 2035 additions and 821 deletions

3
.dockerignore Normal file
View File

@@ -0,0 +1,3 @@
node_modules
dist
*.log

17
build.Dockerfile Normal file
View 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
View File

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

View File

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

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

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

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

Binary file not shown.

View File

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

Binary file not shown.

View File

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

Binary file not shown.

View File

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

View File

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

Binary file not shown.

View File

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

Binary file not shown.

View File

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

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

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

View File

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

View 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')); // 输出: '人' (中文)

View File

@@ -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: [
{ {

View File

@@ -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
}; };
}, },
{ {

View File

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

View 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;
// 将张量转为 Uint8ArrayRGB 格式,值范围从 0 到 255
const uint8Array = await tensor.data();
return {
width,
height,
uint8Array
};
}

View 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'
}

View File

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

View 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;
}

View File

@@ -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';
// }

View 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];
// }

View 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;
}

View 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');
}

View 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";
}
};

View File

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

View File

@@ -1,11 +0,0 @@
<script setup lang="ts">
</script>
<template>
<router-view></router-view>
</template>
<style scoped lang="less">
</style>

View File

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

View 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>

View File

@@ -1,11 +0,0 @@
<script setup lang="ts">
</script>
<template>
<router-view></router-view>
</template>
<style scoped lang="less">
</style>

View File

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

View 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>

View File

@@ -1,9 +0,0 @@
<template>
<router-view></router-view>
</template>
<script setup lang="ts">
</script>
<style scoped lang="less">
</style>

View File

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

View 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>

View File

@@ -1,11 +0,0 @@
<script setup lang="ts">
</script>
<template>
<router-view></router-view>
</template>
<style scoped lang="less">
</style>

View File

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

View 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>

View File

@@ -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)[]>([]);

View 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>

View File

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

View File

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

View 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;
// }
};

View File

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

View File

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