├── Imgs ├── Picture1.png ├── Picture2.png ├── Picture3.png └── Picture4.png ├── README.md ├── 微信客户端 ├── .DS_Store ├── app.js ├── app.json ├── app.wxss ├── pages │ ├── index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss │ ├── predict │ │ ├── predict.js │ │ ├── predict.json │ │ ├── predict.wxml │ │ └── predict.wxss │ ├── select │ │ ├── select.js │ │ ├── select.json │ │ ├── select.wxml │ │ └── select.wxss │ └── upload │ │ ├── upload.js │ │ ├── upload.json │ │ ├── upload.wxml │ │ └── upload.wxss ├── project.config.json └── utils │ └── util.js ├── 服务端 ├── .DS_Store ├── .idea │ ├── misc.xml │ ├── modules.xml │ ├── workspace.xml │ └── 服务端.iml ├── CONFIG.py ├── __pycache__ │ ├── CONFIG.cpython-36.pyc │ └── data.cpython-36.pyc ├── client.py ├── data.py ├── datas │ ├── .DS_Store │ ├── ISIC2018_Task3_Training_GroundTruth.csv │ ├── test_data.txt │ └── train_data.txt ├── ensemble.py ├── model.py ├── models.py ├── predict.py ├── server.py ├── test.py ├── train.py └── utils.py └── 演示视屏.mp4 /Imgs/Picture1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daimuuc/Pigmented-skin-disease-automatic-recognition-and-classification-system/8f1dea430e8a1ef0b26c69a07240fdd0b77752e3/Imgs/Picture1.png -------------------------------------------------------------------------------- /Imgs/Picture2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daimuuc/Pigmented-skin-disease-automatic-recognition-and-classification-system/8f1dea430e8a1ef0b26c69a07240fdd0b77752e3/Imgs/Picture2.png -------------------------------------------------------------------------------- /Imgs/Picture3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daimuuc/Pigmented-skin-disease-automatic-recognition-and-classification-system/8f1dea430e8a1ef0b26c69a07240fdd0b77752e3/Imgs/Picture3.png -------------------------------------------------------------------------------- /Imgs/Picture4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daimuuc/Pigmented-skin-disease-automatic-recognition-and-classification-system/8f1dea430e8a1ef0b26c69a07240fdd0b77752e3/Imgs/Picture4.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 项目名称: 2 | 色素性皮肤病七分类系统(微信版) 3 | 4 | 网站版项目地址: 5 | https://github.com/JunhaoCheng/Pigmented-skin-disease-automatic-recognition-and-classification-system/tree/website 6 | 7 | 项目功能: 8 | 基于深度学习、集成学习、迁移学习、GAN等技术的色素性皮肤病自动识别七分类系统。 9 | 本系统主要由服务端和客户端两个模块组成。服务端使用DenseNet161和SENet154 10 | 两个模型构成集成模型,从而实现了对色素性皮肤病自动识别七分类。客户端使 11 | 用微信小程序和网站(SSM、Springboot)开发。用户通过微信小程序或网站上传图像到服务端,服务端返回所属类别。 12 | 13 | 项目组织结构: 14 | 服务端: 15 | ![Image text](https://github.com/JunhaoCheng/-Pigmented-skin-disease-automatic-recognition-and-classification-system-/blob/master/Imgs/Picture4.png) 16 | 17 | 18 | 项目部署: 19 | 1、修改server.py文件并运行 20 | 2、修改client.py文件并运行(可选) 21 | 3、修改微信客户端服务器配置 22 | 23 | 项目数据集: 24 | https://challenge2018.isic-archive.com/task3/ 25 | 26 | 27 | 项目运行效果: 28 | ![Image text](https://github.com/JunhaoCheng/-Pigmented-skin-disease-automatic-recognition-and-classification-system-/blob/master/Imgs/Picture1.png)![Image text](https://github.com/JunhaoCheng/-Pigmented-skin-disease-automatic-recognition-and-classification-system-/blob/master/Imgs/Picture2.png)![Image text](https://github.com/JunhaoCheng/-Pigmented-skin-disease-automatic-recognition-and-classification-system-/blob/master/Imgs/Picture3.png) 29 | 30 | 31 | 项目演示视屏: 32 | https://github.com/JunhaoCheng/Pigmented-skin-disease-automatic-recognition-and-classification-system/blob/master/演示视屏.mp4 33 | -------------------------------------------------------------------------------- /微信客户端/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daimuuc/Pigmented-skin-disease-automatic-recognition-and-classification-system/8f1dea430e8a1ef0b26c69a07240fdd0b77752e3/微信客户端/.DS_Store -------------------------------------------------------------------------------- /微信客户端/app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | onLaunch: function () { 4 | // 展示本地存储能力 5 | var logs = wx.getStorageSync('logs') || [] 6 | logs.unshift(Date.now()) 7 | wx.setStorageSync('logs', logs) 8 | 9 | // 登录 10 | wx.login({ 11 | success: res => { 12 | // 发送 res.code 到后台换取 openId, sessionKey, unionId 13 | } 14 | }) 15 | // 获取用户信息 16 | wx.getSetting({ 17 | success: res => { 18 | if (res.authSetting['scope.userInfo']) { 19 | // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 20 | wx.getUserInfo({ 21 | success: res => { 22 | // 可以将 res 发送给后台解码出 unionId 23 | this.globalData.userInfo = res.userInfo 24 | 25 | // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回 26 | // 所以此处加入 callback 以防止这种情况 27 | if (this.userInfoReadyCallback) { 28 | this.userInfoReadyCallback(res) 29 | } 30 | } 31 | }) 32 | } 33 | } 34 | }) 35 | }, 36 | globalData: { 37 | userInfo: null, 38 | tempFilePaths: null, 39 | result: {} 40 | } 41 | }) -------------------------------------------------------------------------------- /微信客户端/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages":[ 3 | "pages/index/index", 4 | "pages/select/select", 5 | "pages/upload/upload", 6 | "pages/predict/predict" 7 | ], 8 | "window":{ 9 | "backgroundTextStyle":"light", 10 | "navigationBarBackgroundColor": "#FFDAB9", 11 | "navigationBarTitleText": "色素性皮肤病七分类系统", 12 | "navigationBarTextStyle":"white" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /微信客户端/app.wxss: -------------------------------------------------------------------------------- 1 | /**app.wxss**/ 2 | .container { 3 | height: 100%; 4 | display: flex; 5 | flex-direction: column; 6 | align-items: center; 7 | justify-content: space-between; 8 | padding: 200rpx 0; 9 | box-sizing: border-box; 10 | } 11 | -------------------------------------------------------------------------------- /微信客户端/pages/index/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | //获取应用实例 3 | const app = getApp() 4 | 5 | Page({ 6 | data: { 7 | motto: 'Hello World', 8 | userInfo: {}, 9 | hasUserInfo: false, 10 | canIUse: wx.canIUse('button.open-type.getUserInfo') 11 | }, 12 | //事件处理函数 13 | bindViewTap: function() { 14 | wx.navigateTo({ 15 | url: '../select/select' 16 | }) 17 | }, 18 | onLoad: function () { 19 | if (app.globalData.userInfo) { 20 | this.setData({ 21 | userInfo: app.globalData.userInfo, 22 | hasUserInfo: true 23 | }) 24 | } else if (this.data.canIUse){ 25 | // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回 26 | // 所以此处加入 callback 以防止这种情况 27 | app.userInfoReadyCallback = res => { 28 | this.setData({ 29 | userInfo: res.userInfo, 30 | hasUserInfo: true 31 | }) 32 | } 33 | } else { 34 | // 在没有 open-type=getUserInfo 版本的兼容处理 35 | wx.getUserInfo({ 36 | success: res => { 37 | app.globalData.userInfo = res.userInfo 38 | this.setData({ 39 | userInfo: res.userInfo, 40 | hasUserInfo: true 41 | }) 42 | } 43 | }) 44 | } 45 | }, 46 | getUserInfo: function(e) { 47 | console.log(e) 48 | app.globalData.userInfo = e.detail.userInfo 49 | this.setData({ 50 | userInfo: e.detail.userInfo, 51 | hasUserInfo: true 52 | }) 53 | } 54 | }) 55 | -------------------------------------------------------------------------------- /微信客户端/pages/index/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /微信客户端/pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{userInfo.nickName}} 8 | 9 | 10 | 11 | {{motto}} 12 | 13 | 14 | -------------------------------------------------------------------------------- /微信客户端/pages/index/index.wxss: -------------------------------------------------------------------------------- 1 | /**index.wxss**/ 2 | page { 3 | background:#FFDAB9; 4 | } 5 | 6 | .userinfo { 7 | display: flex; 8 | flex-direction: column; 9 | align-items: center; 10 | } 11 | 12 | .userinfo-avatar { 13 | width: 128rpx; 14 | height: 128rpx; 15 | margin: 20rpx; 16 | border-radius: 50%; 17 | } 18 | 19 | .userinfo-nickname { 20 | color: #aaa; 21 | } 22 | 23 | .usermotto { 24 | margin-top: 200px; 25 | color: #FAFFF0 26 | } 27 | 28 | .button { 29 | width: 360rpx; 30 | height: 90rpx; 31 | margin: 40rpx; 32 | background-color: #FFA07A; 33 | color: white; 34 | border-radius: 98rpx; 35 | background: bg_red; 36 | } -------------------------------------------------------------------------------- /微信客户端/pages/predict/predict.js: -------------------------------------------------------------------------------- 1 | // pages/predict/predict.js 2 | const app = getApp() 3 | Page({ 4 | 5 | /** 6 | * 页面的初始数据 7 | */ 8 | data: { 9 | 10 | }, 11 | 12 | /** 13 | * 生命周期函数--监听页面加载 14 | */ 15 | onLoad: function (options) { 16 | console.log(typeof(app.globalData.result)) 17 | let json = JSON.parse(app.globalData.result); 18 | this.setData({ result: json["result"]}) 19 | }, 20 | 21 | /** 22 | * 生命周期函数--监听页面初次渲染完成 23 | */ 24 | onReady: function () { 25 | 26 | }, 27 | 28 | /** 29 | * 生命周期函数--监听页面显示 30 | */ 31 | onShow: function () { 32 | 33 | }, 34 | 35 | /** 36 | * 生命周期函数--监听页面隐藏 37 | */ 38 | onHide: function () { 39 | 40 | }, 41 | 42 | /** 43 | * 生命周期函数--监听页面卸载 44 | */ 45 | onUnload: function () { 46 | 47 | }, 48 | 49 | /** 50 | * 页面相关事件处理函数--监听用户下拉动作 51 | */ 52 | onPullDownRefresh: function () { 53 | 54 | }, 55 | 56 | /** 57 | * 页面上拉触底事件的处理函数 58 | */ 59 | onReachBottom: function () { 60 | 61 | }, 62 | 63 | /** 64 | * 用户点击右上角分享 65 | */ 66 | onShareAppMessage: function () { 67 | 68 | } 69 | }) -------------------------------------------------------------------------------- /微信客户端/pages/predict/predict.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /微信客户端/pages/predict/predict.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 预测结果 4 | {{result}} 5 | 6 | -------------------------------------------------------------------------------- /微信客户端/pages/predict/predict.wxss: -------------------------------------------------------------------------------- 1 | /* pages/predict/predict.wxss */ 2 | page { 3 | background:#FFDAB9; 4 | } 5 | 6 | .text { 7 | font-size: 50rpx; 8 | color: #87CEFF; 9 | margin-top: 10rpx; 10 | display: flex; 11 | align-items: center; 12 | justify-content: center; 13 | } 14 | 15 | .title { 16 | font-size: 80rpx; 17 | color: #87CEFF; 18 | margin-top: 40%; 19 | display: flex; 20 | align-items: center; 21 | justify-content: center; 22 | } -------------------------------------------------------------------------------- /微信客户端/pages/select/select.js: -------------------------------------------------------------------------------- 1 | // pages/select/select.js 2 | const app = getApp() 3 | Page({ 4 | 5 | /** 6 | * 页面的初始数据 7 | */ 8 | data: { 9 | 10 | }, 11 | 12 | /** 13 | * 生命周期函数--监听页面加载 14 | */ 15 | onLoad: function (options) { 16 | 17 | }, 18 | 19 | /** 20 | * 生命周期函数--监听页面初次渲染完成 21 | */ 22 | onReady: function () { 23 | 24 | }, 25 | 26 | /** 27 | * 生命周期函数--监听页面显示 28 | */ 29 | onShow: function () { 30 | 31 | }, 32 | 33 | /** 34 | * 生命周期函数--监听页面隐藏 35 | */ 36 | onHide: function () { 37 | 38 | }, 39 | 40 | /** 41 | * 生命周期函数--监听页面卸载 42 | */ 43 | onUnload: function () { 44 | 45 | }, 46 | 47 | /** 48 | * 页面相关事件处理函数--监听用户下拉动作 49 | */ 50 | onPullDownRefresh: function () { 51 | 52 | }, 53 | 54 | /** 55 | * 页面上拉触底事件的处理函数 56 | */ 57 | onReachBottom: function () { 58 | 59 | }, 60 | 61 | /** 62 | * 用户点击右上角分享 63 | */ 64 | onShareAppMessage: function () { 65 | 66 | }, 67 | 68 | /** 69 | *本地图片按钮点击事件 70 | */ 71 | select_album: function() { 72 | wx.chooseImage({ 73 | count: 1, 74 | sizeType: ['original', 'compressed'], 75 | sourceType: ['album'], 76 | success(res) { 77 | // tempFilePath可以作为img标签的src属性显示图片 78 | const tempFilePaths = res.tempFilePaths 79 | console.log(tempFilePaths) 80 | app.globalData.tempFilePaths = tempFilePaths 81 | wx.navigateTo({ 82 | url: '../upload/upload' 83 | }) 84 | } 85 | }) 86 | }, 87 | 88 | /** 89 | * 拍摄图片按钮点击事件 90 | */ 91 | select_camera: function() { 92 | wx.chooseImage({ 93 | count: 1, 94 | sizeType: ['original', 'compressed'], 95 | sourceType: ['camera'], 96 | success(res) { 97 | // tempFilePath可以作为img标签的src属性显示图片 98 | const tempFilePaths = res.tempFilePaths 99 | console.log(tempFilePaths) 100 | app.globalData.tempFilePaths = tempFilePaths 101 | wx.navigateTo({ 102 | url: '../upload/upload' 103 | }) 104 | } 105 | }) 106 | } 107 | }) -------------------------------------------------------------------------------- /微信客户端/pages/select/select.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /微信客户端/pages/select/select.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /微信客户端/pages/select/select.wxss: -------------------------------------------------------------------------------- 1 | /* pages/select/select.wxss */ 2 | page { 3 | background:#FFDAB9; 4 | } 5 | 6 | .button { 7 | width: 360rpx; 8 | height: 90rpx; 9 | margin: 40rpx; 10 | background-color: #FFA07A; 11 | color: white; 12 | border-radius: 98rpx; 13 | background: bg_red; 14 | } -------------------------------------------------------------------------------- /微信客户端/pages/upload/upload.js: -------------------------------------------------------------------------------- 1 | // pages/upload/upload.js 2 | const app = getApp() 3 | Page({ 4 | 5 | /** 6 | * 页面的初始数据 7 | */ 8 | data: { 9 | 10 | }, 11 | 12 | /** 13 | * 生命周期函数--监听页面加载 14 | */ 15 | onLoad: function (options) { 16 | 17 | }, 18 | 19 | /** 20 | * 生命周期函数--监听页面初次渲染完成 21 | */ 22 | onReady: function () { 23 | 24 | }, 25 | 26 | /** 27 | * 生命周期函数--监听页面显示 28 | */ 29 | onShow: function () { 30 | 31 | }, 32 | 33 | /** 34 | * 生命周期函数--监听页面隐藏 35 | */ 36 | onHide: function () { 37 | 38 | }, 39 | 40 | /** 41 | * 生命周期函数--监听页面卸载 42 | */ 43 | onUnload: function () { 44 | 45 | }, 46 | 47 | /** 48 | * 页面相关事件处理函数--监听用户下拉动作 49 | */ 50 | onPullDownRefresh: function () { 51 | 52 | }, 53 | 54 | /** 55 | * 页面上拉触底事件的处理函数 56 | */ 57 | onReachBottom: function () { 58 | 59 | }, 60 | 61 | /** 62 | * 用户点击右上角分享 63 | */ 64 | onShareAppMessage: function () { 65 | 66 | }, 67 | 68 | /** 69 | * 上传图片按钮点击事件 70 | */ 71 | upload: function() { 72 | //获取图片地址 73 | var tempFilePaths = app.globalData.tempFilePaths 74 | //显示进度弹框 75 | wx.showLoading({ 76 | title: '处理中,请耐心等待', 77 | mask: true 78 | }) 79 | wx.uploadFile({ 80 | url: 'https://www.ponma.cn:8086/process', 81 | filePath: tempFilePaths[0], 82 | name: 'file', 83 | success(res) { 84 | //关闭进度弹框 85 | wx.hideLoading() 86 | //保存结果 87 | const result = res.data 88 | console.log(result) 89 | app.globalData.result = result 90 | //界面跳转 91 | wx.navigateTo({ 92 | url: '../predict/predict' 93 | }) 94 | }, 95 | fail() { 96 | //关闭进度弹框 97 | wx.hideLoading() 98 | //显示失败弹框 99 | wx.showToast({ 100 | title: '处理失败', 101 | icon: 'none', 102 | duration: 2000 103 | }) 104 | } 105 | }) 106 | } 107 | }) -------------------------------------------------------------------------------- /微信客户端/pages/upload/upload.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /微信客户端/pages/upload/upload.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /微信客户端/pages/upload/upload.wxss: -------------------------------------------------------------------------------- 1 | /* pages/upload/upload.wxss */ 2 | page { 3 | background:#FFDAB9; 4 | } 5 | 6 | .button { 7 | width: 360rpx; 8 | height: 90rpx; 9 | margin: 40rpx; 10 | background-color: #FFA07A; 11 | color: white; 12 | border-radius: 98rpx; 13 | background: bg_red; 14 | } -------------------------------------------------------------------------------- /微信客户端/project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "项目配置文件", 3 | "packOptions": { 4 | "ignore": [] 5 | }, 6 | "setting": { 7 | "urlCheck": true, 8 | "es6": true, 9 | "postcss": true, 10 | "minified": true, 11 | "newFeature": true, 12 | "autoAudits": false 13 | }, 14 | "compileType": "miniprogram", 15 | "libVersion": "2.6.6", 16 | "appid": "wxfa929dd31067ae5c", 17 | "projectname": "SevenClassification", 18 | "debugOptions": { 19 | "hidedInDevtools": [] 20 | }, 21 | "isGameTourist": false, 22 | "condition": { 23 | "search": { 24 | "current": -1, 25 | "list": [] 26 | }, 27 | "conversation": { 28 | "current": -1, 29 | "list": [] 30 | }, 31 | "game": { 32 | "currentL": -1, 33 | "list": [] 34 | }, 35 | "miniprogram": { 36 | "current": -1, 37 | "list": [] 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /微信客户端/utils/util.js: -------------------------------------------------------------------------------- 1 | const formatTime = date => { 2 | const year = date.getFullYear() 3 | const month = date.getMonth() + 1 4 | const day = date.getDate() 5 | const hour = date.getHours() 6 | const minute = date.getMinutes() 7 | const second = date.getSeconds() 8 | 9 | return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') 10 | } 11 | 12 | const formatNumber = n => { 13 | n = n.toString() 14 | return n[1] ? n : '0' + n 15 | } 16 | 17 | module.exports = { 18 | formatTime: formatTime 19 | } 20 | -------------------------------------------------------------------------------- /服务端/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daimuuc/Pigmented-skin-disease-automatic-recognition-and-classification-system/8f1dea430e8a1ef0b26c69a07240fdd0b77752e3/服务端/.DS_Store -------------------------------------------------------------------------------- /服务端/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /服务端/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /服务端/.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 124 | 125 | 126 | 127 | plot_image 128 | 129 | 130 | 131 | 149 | 150 | 151 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 |