MIT Place Pulse数据集及google街景图片爬取

避开街景感知研究的3个大坑:基于Place Pulse数据集的经验总结 本文基于Place Pulse数据集,总结了街景感知研究中的三大常见陷阱及解决方案。通过分析地理分布失衡、优化两两对比机制和模型训练策略,提升街景感知预测的准确性和泛化能力。特别强调数据增强和动态权重集成模型在应对光照和季节变化中的关键作用。 阅读详情
AI摘要

该博客围绕使用谷歌街景图片建立与人主观感受联系的项目展开。介绍了项目背景,需通过谷歌API获取图片。任务分解包括解析csv文件、街景ID去重、url拼接和使用线程池。代码实现涵盖添加依赖、核心流程等。还对比了单线程与多线程下载效率,给出图片质量检测方法。

1、项目背景

1.1 使用谷歌街景图片的必要性
  • MIT Place Pulse 数据集可直接下载,但没有提供街景图片本身,只提供了街景的坐标,需通过谷歌街景开放API 获取对应的街景图片。
  • MIT Place Pulse数据集中的街景图片大多在国外,因此你懂得。
1.2 使用谷歌街景图片的目标
  • “建立街景图片与人主观感受的联系”场景的相关论文都没有提供开源代码,需实现模型并训练,所以需要 MIT Place Pulse数据集作为基础。
1.3 “建立街景图片与人主观感受的联系”场景实现的基本流程:
  • 通过 MIT Place Pulse数据集以及相关街景图片训练模型。
  • 获取百度地图街景图片作为模型输入,通过上一步训练好的模型,获取结果(例如,对街景的治安状况进行评分等)。
1.4 参考链接

       这篇文章详述用Python爬取该训练集,提供了训练集地址,此外还提供了多个可用的google street view static api key。链接如下:https://zhuanlan.zhihu.com/p/34967038
       下载好文中所述的训练集文件之后,仔细查看votes.csv及readme.txt文件。写的很清楚,需要对应votes.csv中的每一条数据,拼接街景图片下载的url。vote.csv文件内容如下,一行记录中有两个坐标,通过进一步观察发现,里面也有重复的坐标(街景ID)。因此我们在真正下载图片或拼接url之前还需做一次去重。
在这里插入图片描述
       当然在这之前还需要申请 google 云控制台的street view static api key,我们也可以直接采用上述文中api.txt文件中的key,但其中大多已不能使用。毕竟是公开的资源,大家都在用,很容易被限制,最好自己和团队成员多申请几个,申请时需要用到VISA信用卡。申请链接如下:https://developers.google.com/maps/documentation/streetview/get-api-key
       在有可用key的情况下,我们就可以通过发送GET请求的方式获取街景图片,对应的url如下:

https://maps.googleapis.com/maps/api/streetview?size=400x300&location=39.737314,-104.87407400000001&key=YOUR_API_KEY

2、任务分解

业务逻辑流程梳理大致如下:

  1. 解析vote.csv文件,并遍历每一条记录;
  2. 根据解析出的每一个坐标,判断该记录对应的图片是否已下载;
  3. 若已下载,则略过;
  4. 若未下载,则拼接url;
  5. 发送GET请求下载图片,因为是IO密集型任务,开启线程池进行并发下载;
  6. 存储(项目需求是存储至本地文件夹下即可)
2.1 csv文件的解析

       可用于csv文件解析的工具有很多,如:javacsv、Inputstream等,强烈建议使用现成的优秀工具,不建议自己编写解析逻辑。更不建议一次性读入文件再进行解析。这里采用了一个号称是目前为止最高效的解析工具:univocity-parser,可采用迭代(行扫描)的方式读取每一条记录,详见:https://github.com/uniVocity/univocity-parsers。
       univocity-parser使用方法参考:https://blog.youkuaiyun.com/qq_21101587/article/details/79803582, 这里不再赘述。

2.2 街景ID(坐标)去重

       这里需要注意的是,vote.csv文件有将近123万行数据记录,也就是近246万个坐标(含重复),如果一次性读入文件,并存入HashSet的话可能会引起OOM,如果该文件有上亿条数据记录,此方法更不可取。笔者采用的是redis去重,结合redis近乎O(1)的复杂度,能够处理数据量较大情况下的去重。但本训练集数量还远没有达到海量级别,用File类中的exists方法也可以去重。

2.2.1 使用redis去重:

       关于街景坐标去重逻辑主要运用了以下几个命令:

//当redis中存在该key时,跳过;不含该key时,则存入该键值数据
jedis.setnx(key,value);

//检查该key是否存在
jedis.exists(key);

//获取以spider-hgg-googlemap:为正则前缀的所有key集合,返回set
jedis.keys("spider-hgg-googlemap:*");

//删除该key
jedis.del(key);
2.2.2 使用File类的exists()去重

       笔者原本以为new File(“文件路径”).exists()方法会随着本地文件中的图片越来越多而查询变慢,但在实际使用过程中发现该方法在本地图片达到6万多张的时候,执行时间也是毫、微秒级,因此也能高效完成去重。底层原理可能得益于文件索引也是用的B树或哈希索引的方式(本人自己猜测的,没有深入研究)
       去重代码就很简单了,传入参数ID,拼接图片路径即可:

private boolean isPicExists(String panoId){
    String path = "E:\\temp\\hgg-googlemap\\safety\\"+panoId+".jpg";
    File file = new File(path);
    return file.exists();
}
2.3 url的拼接

       这里要注意一点的是,一个key每天的请求上限是2万次(本人亲测是低于2万次/天,不稳定),超过之后就会被限制访问,所以尽量获取更多的key,在拼接url的时候也尽量在有效的key集合中随机选择使用(为确保快速并可靠的下载,及时剔除无效的key),尽可能减少同一key频繁访问的次数。另外一点需要注意的是,需加一个判断图片是否下载成功的逻辑,若下载成功就存储,若不成功还要重新拼接url进行再次下载,直至成功为止。

2.4 线程池的使用

       这一块涉及线程池的使用及线程数合理配置,不熟悉的童鞋可参阅:https://www.cnblogs.com/dolphin0520/p/3932921.html

一般需要根据任务的类型来配置线程池大小:

  • 如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 CPU核数量+1
  • 如果是IO密集型任务,参考值可以设置为2* CPU核数量
  • 当然,这只是一个参考值,具体的设置还需要根据实际情况进行调整,比如可以先将线程池大小设置为参考值,再观察任务运行情况和系统负载、资源利用率来进行适当调整。

3 代码实现

3.1 添加依赖
dependencies {
    compile 'com.squareup.okhttp3:okhttp:3.11.0'
    compile 'com.demo.ddc:ddc-core:0.1.11-alpha6'
	compile 'redis.clients:jedis:2.9.0'
	compile 'org.apache.logging.log4j:log4j-core:2.8.2'
	compile 'org.apache.commons:commons-pool2:2.4.2'
	compile 'com.univocity:univocity-parsers:2.8.2'
}
3.2 核心流程代码

       将vote.csv文件改名为googlemapvotes.csv,并将其置于资源目录下。
       先定义一个csv行数据的java bean类:

public class CsvPanoBean {

    private String panoId;

    private double lati;

    private double lonti;

    public CsvPanoBean(String panoId,double lati, double lonti){
        this.panoId = panoId;
        this.lati = lati;
        this.lonti = lonti;
    }

    public String getPanoId() {
        return panoId;
    }

    public void setPanoId(String panoId) {
        this.panoId = panoId;
    }

    public double getLati() {
        return lati;
    }

    public void setLati(double lati) {
        this.lati = lati;
    }

    public double getLonti() {
        return lonti;
    }

    public void setLonti(double lonti) {
        this.lonti = lonti;
    }
}

       编写核心代码,含义详见注释:

protected boolean process() {
    String filePath = "/googlemapvotes.csv";
    // 创建csv解析器settings配置对象
    CsvParserSettings settings = new CsvParserSettings();
    // 文件中使用 '\n' 作为行分隔符
    // 确保像MacOS和Windows这样的系统
    // 也可以正确处理(MacOS使用'\r';Windows使用'\r\n')
    settings.getFormat().setLineSeparator("\n");
    // 考虑文件中的第一行内容解析为列标题,跳过第一行
    settings.setHeaderExtractionEnabled(true);
    // 创建CSV解析器(将分隔符传入对象)
    CsvParser parser = new CsvParser(settings);
    // 调用beginParsing逐个读取记录,使用迭代器iterator
    parser.beginParsing(getReader(filePath));
    String[] row;
    //图片下载工具类
    PicLoadUtils picLoadUtils = new PicLoadUtils();
    //创建线程池,由于本地机器为8核CPU,故定义10个核心线程,最大线程数为16,且自定义线程工厂类和饱和策略
    ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 16, 100, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(1024), new MyTreadFactory(),  new MyIgnorePolicy());
    //预启动所有核心线程
    executor.prestartAllCoreThreads();
    //解析csv文件并迭代每行记录
    while ((row = parser.parseNext()) != null) {
        String category = row[7];
        //这里根据需求,优先下载safety类型的训练集街景图片
        if ("safety".equals(category)){
            String leftPanoId = row[0];
            String rightPanoId = row[1];
            double leftLati = Double.parseDouble(row[3]);
            double leftLonti = Double.parseDouble(row[4]);
            double rightLati = Double.parseDouble(row[5]);
            double rightLonti = Double.parseDouble(row[6]);
            CsvPanoBean leftPanoBean = new CsvPanoBean(leftPanoId,leftLati,leftLonti);
            CsvPanoBean rightPanoBean = new CsvPanoBean(rightPanoId,rightLati,rightLonti);
            CsvPanoBean[] csvPanoBeans = {leftPanoBean,rightPanoBean};
            for (CsvPanoBean element:csvPanoBeans){
                //判断redis中或本地是否有该街景ID
                String panoId = element.getPanoId();
                //boolean isExists = isPicExists(panoId);
                boolean isExists = redisUtils.isPanoIDExists(panoId);
                if (!isExists){
                    redisUtils.panoIdPush(panoId);
                    DownloadPicTask task = new DownloadPicTask(picLoadUtils,element);
                    executor.execute(task);
                }else{
                    logger.info(panoId + " is exist");
                }
            }
            try {
                // 这里主线程需要睡一会,否则容易引起多线程下载时的读超时
                Thread.sleep(400L);
                logger.info("The queue size of Thread Pool is "+ executor.getQueue().size());
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
    logger.info("--------------------------crawl finished!--------------------------");
    // 在读取结束时自动关闭所有资源,或者当错误发生时,可以在任何使用调用stopParsing()
    // 只有在不是读取所有内容的情况下调用下面方法,但如果不调用也没有非常严重的问题
    parser.stopParsing();
    isComplete = true;
    return true;
}

//读文件时定义编码格式
private Reader getReader(String relativePath) {
    try {
        return new InputStreamReader(this.getClass().getResourceAsStream(relativePath), "UTF-8");
    } catch (UnsupportedEncodingException e) {
        throw new IllegalStateException("Unable to read input", e);
    }
}

//判断本地是否已存在
private boolean isPicExists(String panoId){
    String path = "E:\\temp\\hgg-googlemap\\safety\\"+panoId+".jpg";
    File file = new File(path);
    return file.exists();
}
3.3 图片下载工具类

       该工具作用:主要是下载路径的设置及下载图片时的检测

/**
 * @author Huigen Zhang
 * @since 2018-10-19 18:53
 **/
public class PicLoadUtils {
    private final static String WINDOWS_DISK_SYMBOL = ":";
    private final static String WINDOWS_PATH_SYMBOL = "\\";
    private final static int STATUS_CODE = 200;
    private String localLocation;

    {
        //要下载到本地的路径
        localLocation = this.getFileLocation("googlepano");
    }

    private String getFileLocation(String storeDirName){
        String separator = "/";
        ConfigParser parser = ConfigParser.getInstance();
        String spiderId = "spider-googlemap";
        SpiderConfig spiderConfig = new SpiderConfig(spiderId);
        Map<String,Object> storageConfig = (Map<String, Object>) parser.assertKey(spiderConfig.getSpiderConfig(),"storage", spiderConfig.getConfigPath());
        String fileLocation = (String) parser.getValue(storageConfig,"piclocation",null,spiderConfig.getConfigPath()+".storage");
        String pathSeparator = getSeparator();
        String location;
        if(fileLocation!=null){
            //先区分系统环境,再判断是否为绝对路径
            if (separator.equals(pathSeparator)){
                //linux
                if(fileLocation.startsWith(separator)){
                    location = fileLocation + pathSeparator + "data";
                }else {
                    location = System.getProperty("user.dir") + pathSeparator + fileLocation;
                }
                location = location.replace("//", pathSeparator);
                return location;
            }else {
                //windows
                if (fileLocation.contains(WINDOWS_DISK_SYMBOL)){
                    //绝对路径
                    location = fileLocation + pathSeparator + "data";
                }else {
                    //相对路径
                    location = System.getProperty("user.dir") + pathSeparator + fileLocation;
                }
                location = location.replace("\\\\",pathSeparator);
            }
        }else{
            //默认地址
            location = System.getProperty("user.dir") + pathSeparator + storeDirName;
        }
        return location;
    }

    private String getSeparator(){
        String pathSeparator = File.separator;
        if(!WINDOWS_PATH_SYMBOL.equals(File.separator)){
            pathSeparator = "/";
        }
        return pathSeparator;
    }

    private void mkDir(File file){
        String directory = file.getParent();
        File myDirectory = new File(directory);
        if (!myDirectory.exists()) {
            myDirectory.mkdirs();
        }
    }

    public boolean downloadPic(String url, String panoId){
        okhttp3.Request request = new okhttp3.Request.Builder()
                .url(url)
                .build();
        Response response = null;
        InputStream inputStream = null;
        FileOutputStream out = null;
        String relativePath;
        try {
            response = OkHttpUtils.getInstance().newCall(request).execute();
            if (response.code()!=STATUS_CODE){
                return false;
            }
            //将响应数据转化为输入流数据
            inputStream = response.body().byteStream();
            byte[] buffer = new byte[2048];
            relativePath = panoId + ".jpg";
            File myPath = new File(localLocation + File.separator + relativePath);
            this.mkDir(myPath);
            out = new FileOutputStream(myPath);
            int len;
            while ((len = inputStream.read(buffer)) != -1){
                out.write(buffer,0,len);
            }
            //刷新文件流
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (inputStream!=null){
                try {
                    inputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (null!=out){
                try {
                    out.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (null!=response){
                response.body().close();
            }
        }
        return true;
    }
}
3.4 redis工具类

       主要还是运用了上述redis命令,在这基础上做一层封装:

/**
 * @author zhanghuigen
 * @since 0.1.0
 **/
public class RedisUtils {
    private JedisPool pool;
    private String spiderUUID;
    private static Logger logger = Logger.getLogger(RedisUtils.class);

    public RedisUtils(String host, int port, String password, String spiderUUID) {
        this(new JedisPool(new JedisPoolConfig(), host, port, 2000, password));
        this.spiderUUID = spiderUUID;
    }

    public RedisUtils(JedisPool pool) {
        this.pool = pool;
    }

    public synchronized Boolean isPanoIDExists(String panoId) {
        Jedis jedis = null;
        Boolean exists;
        try {
            jedis = this.pool.getResource();
            exists = jedis.exists(this.spiderUUID + ":" + panoId);
            return exists;
        }finally {
            if (jedis!=null){
                jedis.close();
            }
        }
    }

    public synchronized boolean removeKeys(){
        Jedis jedis = this.pool.getResource();
        try {
            Set<String> keys = jedis.keys(this.spiderUUID + ":*" );
            if(keys != null && !keys.isEmpty()) {
                logger.info("redis has stored " + keys.size() + " keys, now ready to remove them all!");
                String[] array = new String[keys.size()];
                jedis.del(keys.toArray(array));
            }
            return true;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (jedis!=null){
                jedis.close();
            }
        }
        return true;
    }

    public synchronized boolean panoIdPush(String panoId) {
        Jedis jedis = this.pool.getResource();
        try {
            long num = jedis.setnx(this.spiderUUID + ":" + panoId, String.valueOf(1));
            return num==1;
        } finally {
            if (jedis!=null){
                jedis.close();
            }
        }
    }
}
3.5 线程池的任务类及拒绝策略

       这里其实也可以运用Callable+Future的模式定义下载任务,详见: https://www.cnblogs.com/hapjin/p/7599189.html 或 https://www.cnblogs.com/myxcf/p/9959870.html

class DownloadPicTask implements Runnable {
    private CsvPanoBean taskBean;
    private PicLoadUtils picLoadUtils;
    private String panoId;

    private DownloadPicTask(PicLoadUtils picLoadUtils,CsvPanoBean bean) {
        this.picLoadUtils = picLoadUtils;
        this.taskBean = bean;
        this.panoId = taskBean.getPanoId();
    }

    @Override
    public void run() {
        logger.info("正在执行task "+panoId);
        String url;
        String key;
        boolean successDownload;
        do {
            //拼接街景图片url
            String[] urlWithKey = getUrlWithKey(taskBean);
            url = urlWithKey[0];
            key = urlWithKey[1];
            //发送请求,下载图片,直到本图片下载成功为止
            successDownload = picLoadUtils.downloadPic(url,panoId);
        }while (!successDownload);
        logger.info(panoId + " downloaded succeed with " + key);
    }

    @Override
    public String toString(){
        return panoId;
    }

    private String[] getUrlWithKey(){
        String requestPrefix = "https://maps.googleapis.com/maps/api/streetview?size=400x300&location=";
        String url = requestPrefix + taskBean.getLati() + "," + taskBean.getLonti() + "&key=";
        Random random = new Random();
        //这里需确保可用的key已经配置在配置文件中,并已读取至一个List----googleKeys中
        int index = random.nextInt(5);
        String key = googleKeys.get(index);
        return new String[]{url+key,key};
    }
}


class MyTreadFactory implements ThreadFactory {
    private final AtomicInteger mThreadNum = new AtomicInteger(1);
    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r, "my-thread-" + mThreadNum.getAndIncrement());
        logger.info(t.getName() + " has been created");
        return t;
    }
}

class MyIgnorePolicy implements RejectedExecutionHandler {

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        doLog(r, e);
    }

    private void doLog(Runnable r, ThreadPoolExecutor e) {
        // 将拒绝执行的街景ID写入日志
        logger.warn( r.toString() + " rejected");
    }
}

4 写在最后

  • 单线程与多线程下载的效率比较

       若用单线程下载,差不多1秒一张图片,相对低效:
在这里插入图片描述
       采用线程池后,刚开始线程数量设的较高,也没有在主线程中加入睡眠时间,易出现读超时现象,原因是使用公司代理访问google时,多线程下载使得带宽受限。引起线程迟迟读不到数据后报异常,如下图所示:
在这里插入图片描述
       通过在主线程添加睡眠时间后,读超时现象消失,可以顺利下载:
在这里插入图片描述
       在满足带宽条件下,下载速度约5张/秒,
在这里插入图片描述

  • 正常运行时的本地效果图
    在这里插入图片描述
  • 图片质量检测
           实际上,该训练集中有部分图片因google资源缺失无法下载。
    在这里插入图片描述
           解决方法:可以提前在下载过程中进行检测,一般此类图片size较小,可以通过在图片下载工具类中对下载返回的响应加个判断来决定是否对其下载,并记录好异常位置即可。
使用Python抓取google街景照片 Google map 提供Google Street View Image API让我们使用。 在:https://developers.google.com/maps/documentation/streetview/ 下图是一些街景照片的参数信息。 size:图片尺寸 location:经纬度 heading:朝向角度 pitch:旋转角度 key:自己的API_ 阅读详情

相关推荐

Google Street View Data Set | 谷歌街景数据集 | 云盘分享 |

Google Street View Data Set 主页 : https://www.crcv.ucf.edu/projects/GMCP_Geolocalization/ Google Street View dataset 包含62,058张高质量的Google街景图像,

专注于AI领域前沿技术学习与分享:目标检测、图像修复、超分重建、AI工程化 3745

使用街景数据预测城市感知

使用街景数据预测城市感知

mmm21554的博客 4867

PLACE_PULSE​​​​​​​_PP2

Python 模拟实战资源 ,资源提供给学习Python的小伙伴,文档中有谷歌地图坐标,用作图片抓取。

Python学习三: 爬虫高级技巧 与 模拟实战练习

三大爬虫技巧 许多网站针对爬虫的访问都设置了一定的障碍,通过这三步技巧,轻松绕过部分的反爬虫限制。 (1)设置程序休止时间 import time import random # 休止睡眠 1 秒 这里秒可自定义 time.sleep(1); # 随机休眠0或者1秒 random.random(); # 随机休眠1或者5秒 time_interval = random .uniform(...

Alan 8226

使用深度学习进行场景分类:使用 MIT Places 数据集子集和预训练模型 Places365GoogLeNet 的场景分类解决方案。-matlab开发

此示例的主要目标是使用 MIT Places 数据集的子集和预训练模型 Places365GoogLeNet 演示 MATLAB 功能在场景分类解决方案中的使用。 代码结构分为四部分: - 在“第 1 部分”中,我们从头开始构建一个简单的 CNN,对其进行训练和评估。 - 在“第 2 部分”中,我们“按原样”使用预训练模型 Places365GoogLeNet。 - 在“第 3 部分”中,我们采用了一种迁移学习方法,该方法演示了使用 MATLAB 中的迁移学习进行图像分类的一些最新功能和最佳实践。 - 最后,在“第 4 部分”中,我们采用图像数据增强技术来查看它们是否会带来改进的结果。 该示例应易于修改并扩展到用户需求。 笔记: - 本示例中使用的数据集(Places365-Standard 数据集的子集)可在以下网址找到: https ://www.dropbox.com/s/a

Place-Pulse:放置 Pulse 代码库

放置脉冲 在 Mac 上使用 Homebrew 运行 Place Pulse: 如果 Homebrew 已经安装,您可以跳过数据库设置的第 1 步。 如果您不想使用 Homebrew,请使用其网站上的说明安装 MongoDB,然后从第 2 步中选择。 数据库设置 Open Terminal and type (without the $) $ ruby <(curl -fsSk https://raw.github.com/mxcl/homebrew/go) $ sudo mkdir -p /data/db/ $ sudo chown `id -u` /data/db $ mongod 站点设置 Clone Place-Pulse from GitHub git@github.com:philsalesses/Place-Pulse.git Open Terminal and type

DC学院数据分析学习笔记(四):爬虫的一些高级技巧

继续爬虫之旅!做完整个爬虫过程之后,成就感爆棚<( ̄︶ ̄)↗[GO!] 三大爬虫技巧 1. 设定 程序休止的时间 n为想要实现的时间间隔 import time time.sleep(n) 2. 设定代理 #使用urllib.request的两个方法进行代理的设置 proxy = urlrequest.ProxyHandler({'https':...

weixin_33720452的博客 270

别再写前端了!用Gradio 3.x + HuggingFace Spaces,5分钟把你的Python算法变成网页应用

本文介绍如何利用Gradio 3.x和HuggingFace Spaces快速将Python算法转化为网页应用,无需前端开发经验。通过5行代码和简单的Git命令,即可实现专业级Web界面部署,大幅提升算法展示效率。特别适合算法工程师和数据科学家快速分享模型成果。

weixin_33443333的博客 332

主观感知数据集:MIT Place Pulse 2.0数据集介绍+数据筛选代码

Place Pulse 2.0是一个众包街景感知数据集,包含全球50多个地区的11万张街景图片。通过众包评分,该数据集收集了人们对城市环境在六个感知维度的主观评价:安全性、活力感、无聊感、富裕度、压抑感和美观性。该项目为研究城市环境的主观感受提供了丰富的开源数据资源。

GGG信的博客 1367

CarSim转向控制对比指南:开环扭矩控制vs转角控制(附Simulink连接示例)

本文深入对比了CarSim中车轮转角控制与开环扭矩控制的核心原理与适用场景。开环扭矩控制能激活完整的转向系统动力学,更适用于EPS控制策略开发与驾驶员在环仿真等对真实性要求高的场景。文章提供了详细的Simulink接口配置步骤与连接示例,为车辆动力学仿真工程师提供了清晰的决策与实操指南。

weixin_29199873的博客 480

LayaNative源码编译

修改好后的LayaNative2.0需要重新编译生成Android和iOS所需要的动态库文件。

末之 1360

使用 MIT Place Pulse 2.0 数据集,训练一个基于 ResNet 的回归模型来预测街景图片/旨在研究人们如何通过视觉感知来评估城市的街道环境。可用于训练街景感知评分模型/街景数据集

使用 MIT Place Pulse 2.0 数据集,训练一个基于 ResNet 的回归模型来预测街景图片/旨在研究人们如何通过视觉感知来评估城市的街道环境。可用于训练街景感知评分模型/街景数据集

2401_88440984的博客 2864

DPM|03Injection设置

摘要:本文介绍了CFD软件Fluent中粒子注入的设置方法。粒子注入是将离散颗粒引入连续相的过程,可用于模拟灰尘、燃料液滴等。设置流程包括:选择粒子类型(质量less、惰性等)、定义注入点属性(坐标、时间、粒径等)、处理多组分粒子、使用文本文件批量定义复杂注入。文中还详细说明了要考虑的湍流影响,包括随机追踪法模拟湍流扩散,以及粒子旋转建模等注意事项。最后介绍了多种注入类型和粒子类型,并强调在湍流系统中需设置足够的尝试次数以确保结果准确性。

qq_28258217的博客 2229

DC学院数据分析师(入门)学习笔记----高级爬虫技巧

对于网站来说,实际上是不愿意让大家去爬取它的内容的,因为爬虫可能会对真实的用户带来不太好的影响(很多网站会限制流量,尤其是对爬虫产生的流量,会对服务器带来一定的压力)。所以网站会对爬虫有一定的抵制,如果不注意爬虫的技巧,有可能就被网站封杀IP,以致暂停了。       那么如何能够轻松绕过部分的反爬虫限制,书写我们的爬虫呢??         1.设定程序休止时间

mini猿要成长QAQ 7244

MATLAB实战:5步搞定铣削稳定性叶瓣图(附完整代码解析)

本文提供了一份基于MATLAB的铣削稳定性叶瓣图实战指南。通过5个清晰步骤,从动力学原理出发,详细解析了利用半离散法构建稳定性判据、模块化代码设计、高效参数扫描及高级可视化的完整流程,并附有完整代码,帮助工程师快速预测和规避加工颤振,优化铣削工艺参数。

weixin_29197051的博客 197

适航规章、标准,书籍资料下载汇总(增加DO-160G中英文版)

很多读者之前问我有没有DO-160G的资源,现在终于找到啦!如果大家有其他想要的资源,可以在留言区告诉我,有空我会帮大家找找看~文末有下载链接:更新日志:2024-9-28:初版。2024-10-21:增加DO-330英文版PDF下载。2024-10-30:增加DO-160G中文版(非机翻)和英文版PDF下载。以下是一些收集到的适航相关的资料,分享给大家。(如果没有你想要的资料,请留言,等找到会及时更新!

qq_41854911的博客 2764

数据篇:全国地铁站点,线路;深圳公交站点,线路。

时间:22年坐标系:WGS84来源:腾讯地图网页版,python编写代码获取。

GGG信的博客 1444

MTK 平台功耗优化策略全解析:Clock 管控、GPU 同步与 Preview 降帧实战方案

在中高端移动终端影像系统中,Camera 模块已成为功耗的关键来源之一,尤其是在高帧率拍摄、AI 模式实时预览等场景下,ISP、Sensor、GPU 与 SoC 时钟频率的大幅提升极易引发系统发热与续航瓶颈。MTK 平台基于多级功耗控制机制,构建了包括 Clock Gate 管理、GPU 时序协同、预览流降帧、Pipeline 低功耗切换等在内的影像功耗优化策略。本文聚焦于 MTK Camera 系统中的核心功耗控制点,基于实际项目部署案例,系统拆解其在不同模式下的节能路径设计与调试方法,为终端厂商与影像系

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2532

白盒-CNN纹理深度可视化: 使用MIT Place 场景预训练模型

       MIT发文:深度视觉的量化表示................       Places2 是一个场景图像数据集,包含 1千万张 图片,400多个不同类型的场景环境,可用于以场景和环境为应用内容的视觉认知任务。       GitHub源代码:https://github.com/CSAILVision/NetDissect       论文地址:http://netdissect....

wishchinYang的专栏 2017

SAPFiori Elements Analytical List Page 概述

ALP(Analytical List Page)是SAP Fiori提供的一种复合页面类型,结合了分析(图表/KPI)与事务(表格/操作)功能,适用于需要分析后立即执行处理的业务场景(如采购价格监控、销售逾期处理等)。其核心价值在于让用户在同一页面完成从数据洞察到事务处理的闭环,减少应用切换带来的效率损耗。 页面结构包含页头KPI标签、交互式图表和明细表格,通过联动过滤、选择同步等机制实现数据钻取与即时操作。支持标准过滤和可视化过滤,并依赖OData注解(SelectionVariant/Presenta

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 272

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

使用 MIT Place Pulse 2.0 数据集,训练一个基于 ResNet 的回归模型来预测街景图片_旨在研究人们如何通过视觉感知来评估城市的街道环境。可用于训练街景感知评分模型_街景数据集

添加图片注释,不超过 140 字(可选) 添加图片注释,不超过 140 字(可选) MIT Place Pulse 2.0 是一个大型的城市街景感知数据集,旨在研究人们如何通过视觉感知来评估城市的街道环境。该数据集收集了全球50多个地区的11万张街景图片,并通过众包平台让参与者对这些图片在六个不同的感知维度上进行评分。这些感知维度包括: 美丽(Beauty):这条街看起来有多美? 安全(Safety):在这条街上走动感觉有多安全? 繁华(Liveliness):这条街看起来有多繁华? 富裕(Wealt

2401_88441190的博客 1636

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

城市情感动态预测(起源)

阶段时间核心问题方法特征代表关键词Ⅰ2000–2012主观感知如何被测量调查、问卷、GISⅡ2013–2016机器能否“看懂”城市情绪Ⅲ2017–2020城市情绪可否量化预测深度学习、时间演化Ⅳ2020–2023融合视觉与社交媒体情绪多模态、空间统计Ⅴ2024–2025情感指导城市设计CLIP、生成式AI、心理建模。

jerrykorea的博客 1058

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python- 机器人抓取谷歌地图数据

# encoding=utf-8 import time from GoogleData1 import getGG import pymysql # 打开数据库连接 我用的是mysql # 下边是数据库连接的代码,你可以换成你自己的 # host:就是你的数据库IP地址 db = pymysql.connect(host='', port=330...

weixin_39831786的博客 4088

Python爬取谷歌街景图片

最近有个需求是要爬取街景图片,国内厂商百度高德和腾讯地图都没有开放接口,查询资料得知谷歌地图开放街景api 谷歌捷径申请key地址:https://developers.google.com/maps/documentation/streetview/ 下面是一些街景照片的参数信息。 size:图片尺寸 location:经纬度 heading:朝向角度 pitch:旋转角度 ...

weixin_30586257的博客 2179

百度地图街景图片爬取

1、需求        最近公司有一个智慧城市空间品质分析需求调研,初步想法是抓取整个杭州市的百度/腾讯街景地图及其时光机功能(实时图片和历史图片),再进行图像分析,研究杭州市街道空间品质的变化,进一步为城市规划和城市变化作重要参考。        刚开始没有什么头绪,最后还是解决了,在这里分享一下。 2、分析 &nb...

Vincent2014Linux 2万+
上一篇: Centos基础与安装
下一篇: 基于webmagic框架的多主题爬虫关键词切换
zhg_vincent
博客等级 码龄12年 93粉丝 45原创
评论 40
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值